iOS:推送通知作为Web服务轮询的“触发器”?

我刚刚开始学习OBJ-C,但我有一个目标应用程序,我正在努力build设; 这个应用程序将是iPad上的主/细节应用程序,将需要保持自己更新与“实时”的web服务。 当多个用户中的一个(在独立的iPad上)在应用程序内执行某些操作时,还需要将数据发送到远程MySQL DB。

编辑:正如lxt已经很有帮助地澄清:“是否适合使用推送通知作为提示轮询web服务” – 答案是有点。

我为这个问题设想的例子是一个Widget库存pipe理器,它具有stream入表格视图的“传入”库存和用户将库存拖放到详细视图中的“库存存储箱” 。

像这样:

在这里输入图像说明

注:我的应用程序不要求自己保持更新,当不在前台。 它可以愉快地睡觉,直到它再次启动; 此时需要用最新的数据更新自己。 凯尔使用applicationWillEnterForeground为这个问题的具体方面提供了一个答案:

为了完成这个任务,我的webservice服务器已经过期了,我想到了一个解决scheme,它结合了webservice轮询和PUSH通知,当一个用户(iPad)对数据进行任何更改时触发轮询。 所以,stream量会是这样的:

  1. Web服务的“默认”轮询会每分钟触发,而不pipe用户可能执行的任何操作。

  2. 当用户从桌面视图中拖出一个库存项目并将其放入一个存储箱中时,该存储箱会向login到同一个总帐户的任何其他iPad发起一个PUSH通知,并触发一个web服务轮询来刷新其数据。

简而言之:任何时候,当iPad“A”上的用户改变任何东西时,推送通知被发送到iPad“B”,iPad“C”等。当B,C,D等接收到推送时,他们轮询服务器刷新他们的数据。

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

我的问题不是“我怎么…?” 更多的是“我该怎么…?”。 我意识到StackOverflow可能会发现这有点“主观”,但我认为这是一个非常值得考虑的问题,考虑到我花了两天研究这个特定的做法(使用PUSH通知触发web服务轮询),并发现正好零相关的文章。

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

更新了iOS 7

所以你的问题的要点似乎是“是否适合使用推送通知作为提示轮询web服务” – 答案是肯定的,有几件事情要注意。 在iOS 7之前,您的应用程序必须在前台才能正常工作。 现在,您可以在接收到推送消息后,使用后台应用刷新在后台触发您的Web服务轮询。

苹果自己使用推送通知来触发Web服务调用 – 这是如何通过Passbook得到远程更新。 当更新的通行证可用时,将发送推送通知,然后iOS会调用通行证中链接的相应Web服务来下载新的有效负载。

有几件事情要记住:第一个是推送通知不能保证(不一定是问题),但是你也不能保证什么时候能够发送。 在大多数情况下,你会希望它是瞬间的,但情况并非总是如此。 另外,select退出推送通知的用户将无法从此function中获益。

你所要做的并不是一个非常新颖的问题,你可以使用一些现有的解决scheme,而不是使用推送通知来触发更新。 你可以使用基于套接字的系统(相当复杂),或者HTTP长轮询(不太复杂)。 也有真正容易实现的第三方服务 – 其中一项服务就是Pusher 。

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

只要我的两分钱 – 希望对你有用。

我们最近就这个项目进行了讨论。 我们的结论是:NO。

原因:

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

我们也研究了一些sockets连接,但是这也有一些限制,包括应用程序在交互过程中必须保持打开以及电池的磨损增加。

最终,我们决定这个function是通过点击button来触发的。 权衡是不值得的。 然而,这并不意味着它不能完成,在你的特定情况下,这可能是最好的方法。 我build议更深入地考虑你的产品devise,并确定这个function对你有多重要。 如果这是微不足道的,我build议不要使用推送通知。

更新:

另一个可能的select是在用户重新打开应用程序时触发您的Web服务调用。 尝试查看applicationWillEnterForeground,也许类似于这里find的解决scheme: applicationWillEnterForeground:从ViewController重新加载数据 。