避免iPhone不断轮询Web服务?

7

我有一个iPhone应用程序,需要在服务器进行更改后立即更新。如何让服务器"推送"数据到iPhone,而不是iPhone不断轮询Web服务?

编辑:我希望iPhone能够在服务器处理JSON更新时立即接收到它们,而无需请求。

我想,由于服务器是Web服务,所以这被称为Comet,但我还没有看到一个好的iPhone示例。


我认为你需要认真考虑是否需要这样做。保持与服务器的开放连接以实时接收更新,从而使手机上的无线电源保持活跃状态--将会消耗大量电力。 - Sixten Otto
4个回答

13

这取决于你有多大的冒险精神。这里有两个选择:

  1. Apple的推送通知,即使您的应用程序没有运行也可以使用。
  2. 自己维护与服务器的TCP连接。这需要更多的编程工作 - 低级别的NSStream操作以及尝试处理iPhone从3G切换到WiFi时的情况。这也可能会很快地消耗电池。如果选择此路径,socket streams programming guide 可以是一个好的起点。

更新:看看iStreamLight - 适用于iPhone的Lightstreamer协议实现。如果它不适合您的Comet web服务,您可能需要下降到更低的级别,即使用socket streams维护TCP连接。为了简化处理JSON数据结构的任务,您可能想使用Objective-C的JSON框架


我的意思是,如果我有一个Web服务,iPhone需要从中获取数据,我需要使用Comet吗?但是如何在不使用JavaScript库的情况下实现这一点? - DevDevDev
1
不,你不需要JavaScript。Comet只是一个想法。最简单的实现方式是使用具有非常长超时时间的NSURLConnection异步或在非UI线程中运行。连接应该保持打开状态,直到服务器有数据,在这种情况下,它应该发送数据并关闭连接,然后您将收到数据。然后立即打开一个新连接到服务器并开始等待。 - s4y
@SidneySM:实际上,在获取数据后,您不必关闭连接并打开另一个连接。这样会消耗太多资源。您可以接收一块数据,处理它(假设它是完整的序列化JSON数据结构),然后等待下一块数据。当然,最好在一定时间后仍然关闭连接并打开新连接,以避免内存泄漏。 - zakovyrya

3
你需要的是一种COMET框架(例如light-streamer)。有几种方法可以实现这一点——使用套接字连接或HTTP服务器保持轮询,直到有数据可用于传递或HTTP请求超时。其他选项包括使用插件,如Flash或Silverlight/Moonlight(假设在使用monotouch的iphone上可能存在这样的事情?)
一个很好的新的(基于IIS)COMET框架,可以以非常高效的方式移动大量数据,来自Frozen Mountain的WebSync,支持托管的基于COMET的PubSub框架(称为WebSync on Demand),可以根据您的负载进行扩展。它通过Javascript很好地工作,并且具有相当干净的API。

到目前为止,我对WebSync(使用的是其服务器快速版,而非按需版)软件印象非常深刻。文档目前略显单薄,但他们监控着谷歌群组社区,以至于我从未等待超过几个小时就能得到问题的答复。 - Matt

1

这可能在其他帖子中提到过,但http://code.google.com/p/istreamlight/是一个很好的地方。它使用lightstreamer服务器(不知道此事)。您可以查看一下,看看这是否是您想要为应用程序实现comet客户端的方式。

老实说,我希望我能更有帮助。如果您正在寻找一种使用JavaScript进行此操作的方法,我会全力以赴!

祝你好运,

-Todd


是的,在JS中有大量关于这方面的信息。谢谢你提供的链接,我会研究一下的。 - DevDevDev

0

如果你想了解关于Web服务推送,也称Comet的信息,你可以查看这个StackOverflow问题这里。


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