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

时间:2012-12-26 21:31:48

标签: objective-c ios web-services push-notification polling

我刚刚开始学习OBJ-C,但我确实有一个我正在努力建立的终极目标应用程序;这个应用程序将成为iPad上的主/详细应用程序,需要通过“实时”自动更新Web服务。当多个用户之一(在单独的iPad上)在应用程序内执行某些操作时,它还需要将数据发送到远程MySQL数据库。

编辑:正如lxt如此有用地澄清:“”使用推送通知作为推荐网络服务的提示是否合适“ - 答案就是这样。”

我为此问题的目的设想的示例是一个小工具库存管理器,其具有流入表视图的“传入”库存和用户将库存拖放到“库存存储箱”细节视图。

像这样:

enter image description here

注意:我的应用程序在不在前台时不要求自己保持更新。它可以愉快地睡觉,直到它再次发射;此时需要使用最新数据更新自己。 Kyle使用applicationWillEnterForeground:

为问题的这个特定方面提供了答案

为了在不过度使用我的webservice服务器的情况下实现这一点,我想象一个结合了webservice轮询和PUSH通知的解决方案,当一个用户(iPad)对数据进行任何更改时触发轮询。所以,流程就是这样:

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

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

  3. 简而言之:只要iPad“A”上的用户改变任何东西,PUSH通知就会发送到iPad“B”,iPad“C”等等。当B,C,D等接收到PUSH时然后轮询服务器以刷新他们的数据。

    另一种方法是让帐户中的每台iPad每隔15秒就开一次网络服务轮询;这对我来说似乎带宽很高(并且通常不会导致数据发生变化)。

    我的问题不是“我怎么......?”更多的是“我该怎么......?”。我意识到StackOverflow可能会发现这有些“主观”,但我认为这是一个非常有价值的问题,因为我花了两天时间研究这个特定的实践(使用PUSH通知来触发webservice轮询)并找到了完全零相关的文章。

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

2 个答案:

答案 0 :(得分:10)

针对iOS 7进行了更新

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

Apple自己使用推送通知来触发Web服务调用 - 这就是Passbook中的传递如何被远程更新。当更新的传递可用时,将发送推送通知,然后使iOS调用链接中的相应Web服务以下载新的有效负载。

要记住的一些事情:首先是推送通知不能得到保证(不一定是问题),但是你也无法保证什么时候会发送。在大多数情况下,你希望它是瞬间的,但情况并非总是如此。此外,任何选择退出推送通知的用户都无法从此功能中受益。

您要做的不是一个非常新颖的问题,而且您可以使用一些现有的解决方案,而不是使用推送通知来触发更新。您可以使用基于套接字的系统(非常复杂)或HTTP长轮询(不太复杂)。还有第三方服务可以轻松实现这一目标 - 一种服务是Pusher

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

无论如何只是我的两分钱 - 希望它对你有用。

答案 1 :(得分:2)

我们最近就一个项目进行了讨论。我们得出的答案是:NO。

原因:

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

我们也研究过某种插座连接但是这也有局限性,包括应用程序在交互过程中必须保持打开以及电池磨损加剧的事实。

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

更新:

另一种可能的选择是在用户重新打开应用时启动您的Web服务调用。尝试查看applicationWillEnterForeground,也许还有类似于此处的解决方案:applicationWillEnterForeground: reload Data from ViewController