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

8
我刚开始学习OBJ-C,但我有一个最终目标的应用程序正在开发中;这个应用程序将是iPad上的主/详细信息应用程序,需要实时更新自己与webservice同步。当其中一个多个用户(在不同的iPad上)在应用程序中执行某些操作时,它还需要将数据发送到远程MySQL数据库。
编辑:正如lxt所澄清的:“使用推送通知作为轮询webservice的提示是否合适” - 答案是有点。
我想象的示例是一个小部件库存管理器,具有流入表视图的“进货”库存和用户将库存拖放到详细视图中的“库存存储箱”。
就像这样:

enter image description here

注意:我的应用程序不需要在后台保持更新。它可以愉快地休眠,直到再次启动;此时,它需要使用最新的数据更新自己。Kyle提供了一个解决方案来解决这个特定问题,使用applicationWillEnterForeground:

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

  1. 无论用户执行任何操作,"默认"的webservice轮询都会每分钟触发一次。

  2. 当用户将库存项目从tableview拖放到存储箱中时,会向登录到同一总账户的任何其他iPad发送PUSH通知,并触发webservice轮询以刷新其数据。

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

替代方案是让账户中的每个iPad每15秒触发一次webservice轮询;这对带宽来说似乎很昂贵(而且通常不会更改数据)。
我的问题不是“我该如何做到...?”而是“我应该如何做到...?”。我意识到StackOverflow可能会认为这有点“主观”,但考虑到我已经花了两天时间研究这个特定的实践(使用PUSH通知来触发webservice轮询),却找不到任何相关文章,所以我认为这是一个非常有价值的问题。
感谢您抽出时间阅读此内容。任何帮助都将不胜感激。示例代码和/或具体的框架/套件信息将不胜感激。但现在我只需要知道这是否是一个好主意。

你得到答案了吗?这意味着你如何在来自其他设备的更新通知上运行Web服务? - user777304
2个回答

10

iOS 7更新

你的问题是“使用推送通知来触发轮询Web服务是否合适”,答案是可以,但需要注意以下几点。在iOS 7之前,你的应用程序必须在前台才能使用此功能。现在,您可以使用后台应用程序刷新在接收到推送消息后在后台触发Web服务轮询。

苹果公司自己使用推送通知来触发Web服务调用,这就是Passbook中的票据如何进行远程更新的方式。当有可用的更新票据时,将发送推送通知,然后导致iOS调用与票据中链接的适当Web服务以下载新的有效负载。

需要记住一些事情:首先,推送通知不能保证(不一定是个问题),同时你也无法保证它何时被传递。在大多数情况下,希望它是即时的,但并非总是如此。此外,任何选择退出推送通知的用户将无法从此功能中获得任何好处。

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

这三种替代方法的一个重要优点是它们通常是平台中立的,您可以轻松地在其他客户端上使用它们(与APNS不同)。如果是我,我会使用这些方法之一而不是使用推送通知,但是在iOS 7上使用后台应用程序刷新,您可能会发现推送可以支持您想要完成的所有操作。

只是我的观点-希望对你有用。


非常好!非常感谢您花时间lxt。这正是我要找的信息。我想这种解决方案并不罕见,但我却无法找到任何可靠的信息。我一定会研究您提到的“替代”解决方案。很高兴听到有(显然)几种处理此问题的方法。我打算先调查PUSH通知的延迟。您知道它们在到达目标设备之前可以延迟多长时间吗? - AJB
1
这取决于很多因素,包括你使用的推送服务(自己运行、使用第三方等),以及用户设备上的数据连接情况。基本上就像问“绳子有多长”,无法给出更明确的答案,抱歉。这里有一个更详细的总结:https://dev59.com/8mox5IYBdhLWcg3wcj13。 - lxt
LXT:我也想到了。感谢您抽出时间来。我会调查一下,并发布任何信息,以便其他人也能从中受益。 - AJB
讲解得非常清楚。我只有一个问题,当应用程序被杀死时怎么办?在这种情况下,推送通知无法唤醒应用程序,对吗?或者我的理解是错误的? - Koushik Ravikumar

2
我们最近为一个项目讨论了这个问题。我们得出的结论是:不使用推送通知。
原因如下:
  • 推送通知无法保证及时到达,可能会在5秒内到达,也可能需要15分钟或者根本就不会到达。
  • 用户不能保证拥有活动数据连接,因此需要一些防错逻辑和更新过程。
  • 通过推送发送敏感数据(可能与人员相关的ID)存在安全隐患。
我们还研究了一些套接字连接,但这也有局限性,包括应用程序在交互期间必须保持打开状态以及电池耗损增加等问题。
最终,我们决定通过按钮点击触发此功能足以满足需求,而牺牲则不值得。然而,这并不意味着它不能被实现,在你的特定情况下,它可能是最好的方式。我建议深入研究产品设计,并确定这个功能对你有多重要。如果它是微不足道的,我建议不要使用推送通知。
更新:
另一个可能的选择是在用户重新打开应用程序时触发您的Web服务调用。尝试查看applicationWillEnterForeground,并可能找到类似于applicationWillEnterForeground: reload Data from ViewController的解决方案。

非常感谢你,Kyle。知道你经历了这个过程并得出结论对我非常有帮助。结合lxt在他的回答中提供的内容和你的建议,似乎PUSH通知并不打算做到这一点。不幸的是,我的应用程序需要设备以某种方式保持其数据更新,因此我正在研究HTTP长轮询和Pusher。感谢你抽出时间来帮助我。 - AJB
1
@AJB 不用谢。另一个选择是在applicationWillEnterForeground中启动您的Web服务。请查看我的回答中的更新。 - Kyle Clegg
哈,你读懂了我的想法。我刚才正在考虑的是,当我的应用程序进入前台时,它将首先更新自己。需要注意的是,对于阅读此讨论的其他人来说,我的小部件库存管理应用程序除非在前台,否则不需要从Web服务获得更新的数据。 - AJB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接