8

我刚开始学习 OBJ-C,但我确实有一个正在努力构建的最终目标应用程序;此应用程序将是 iPad 上的主/详细应用程序,需要通过网络服务“实时”保持自身更新。当多个用户之一(在不同的 iPad 上)在应用程序中执行某些操作时,它还需要将数据发送到远程 MySQL 数据库。

编辑:正如 lxt 澄清的那样:““使用推送通知作为轮询 Web 服务的提示是否合适?” - 答案是这样的。

我为这个问题设想的示例是一个小部件库存管理器,它具有流入表视图的“传入”库存和用户将在详细视图中拖放库存的“库存存储箱” .

像这样:

在此处输入图像描述

注意:我的应用程序不要求自己在不在前台时保持更新。它可以愉快地睡去,直到它再次发射;此时,它需要使用最新数据进行自我更新。Kyle 使用applicationWillEnterForeground为问题的这个特定方面提供了答案:

为了在不使我的 web 服务服务器负担过重的情况下实现这一点,我设想了一种解决方案,它结合了 web 服务轮询和推送通知,以在一个用户 (iPad) 对数据进行任何更改时触发轮询。所以,流程是这样的:

  1. 无论用户可能执行任何操作,都会每分钟触发一次 Web 服务的“默认”轮询。

  2. 当用户从 tableview 中拖动库存项目并将其放入存储箱时,该存储箱将向登录到同一总体帐户的任何其他 iPad 发起 PUSH 通知并触发 Web 服务轮询以刷新其数据。

简而言之:每当 iPad“A”上的用户更改任何内容时,都会向 iPad“B”、iPad“C”等发送推送通知。当 B、C、D 等收到推送时,他们会轮询服务器刷新他们的数据。

另一种方法是让帐户上的每台 iPad 每 15 秒触发一次 Web 服务轮询;这对我来说似乎带宽昂贵(并且通常不会导致数据发生变化)。

我的问题不是“我怎么……?” 以及更多的“我应该如何......?”。我意识到 StackOverflow 可能会觉得这有点“主观”,但我认为这是一个非常有价值的问题,因为我花了两天时间研究这种具体做法(使用 PUSH 通知来触发 web 服务轮询)并且发现完全零相关文章。

感谢您抽时间阅读。任何帮助,将不胜感激。示例代码和/或特定框架/工具包信息将不胜感激。但现在我只需要知道这是否是个好主意。

4

2 回答 2

10

为 iOS 7 更新

因此,您的问题的要点似乎是“使用推送通知作为轮询 Web 服务的提示是否合适” - 答案是肯定的,需要注意一些事项。在 iOS 7 之前,您的应用程序必须处于前台才能运行。现在,您可以在收到推送消息后使用后台应用刷新在后台触发您的 Web 服务轮询。

Apple 自己使用推送通知来触发 Web 服务调用——这就是 Passbook 中的通行证如何远程更新。当更新的通行证可用时,会发送推送通知,然后导致 iOS 调用链接到通行证的相应 Web 服务以下载新的有效负载。

需要记住的几件事:第一是不能保证推送通知(不一定是问题),而且您也不能保证它何时会被传递。在大多数情况下,您希望它是即时的,但并非总是如此。此外,任何选择退出推送通知的用户都不会从此功能中受益。

您想要做的并不是一个非常新颖的问题,并且您可以使用一些现有的解决方案来代替使用推送通知来触发更新。您可以使用基于套接字的系统(相当复杂)或 HTTP 长轮询(不太复杂)。还有一些第三方服务可以很容易地实现这一点——其中一项服务就是Pusher

所有这三种替代方案(套接字、长轮询、第三方服务)的一大优势是它们通常是平台中立的,您可以轻松地在其他客户端上使用它们(与 APNS 不同)。如果是我,我会在推送通知上使用其中一种方法,但是随着 iOS 7 上的后台应用刷新,您可能会发现推送可以支持您想做的所有事情。

反正只是我的两分钱 - 希望它对你有用。

于 2012-12-26T21:43:01.853 回答
2

我们最近就一个项目讨论了这个问题。我们得出的结论是:NO。

原因:

  • 不保证推送通知。他们可能会在 5 秒内到达,可能会在 15 分钟内到达,或者永远不会到达。
  • 不能保证用户有一个活跃的数据连接,因此无论如何都需要某种万无一失的逻辑和更新过程。
  • 通过推送发送敏感数据(可能与人相关的 ID)缺乏安全性。

我们还研究了某种套接字连接,但这也有局限性,包括应用程序必须在交互过程中保持打开状态以及增加电池的磨损。

最终,我们决定通过单击按钮触发此功能就足够了。这种权衡是不值得的。但是,这并不意味着它不能完成,并且在您的特定情况下它可能是最好的方法。我建议您更深入地了解您的产品设计并确定此功能对您的重要性。如果它是微不足道的,我建议不要使用推送通知。

更新:

另一种可能的选择是在用户重新打开应用程序时触发您的 Web 服务调用。尝试查看 applicationWillEnterForeground 并可能找到类似于此处找到的解决方案:applicationWillEnterForeground: reload Data from ViewController

于 2012-12-26T22:05:08.227 回答