我正在寻找有关在用Objective-C编写并在Mac上运行的“服务器端”应用程序与在iPhone上运行的客户端应用程序之间实现某种双向通信的最佳方法的建议。
长话短说,我正在调整现有的库以在客户端-服务器环境中使用。该库(在服务器上运行)基本上是一个提供定期结果的搜索引擎,并且还可以在以后为任何这些结果提供更新。因此,在理想的世界中,我将能够通过我假设的网络解决方案实现以下目标:
- 在服务器上启动查询。
- 让服务器在结果到达时将结果“推送”给客户端。
- 让服务器在单个结果到达时将更新“推送”到客户端。
如果我正在编写此客户端以在另一台 Mac 上运行,我可能会考虑使用分布式对象来掩盖服务器实际上是远程运行的事实,但 DO 在 iPhone 上不可用。
如果我正在编写一个更通用的客户端-服务器应用程序,我可能会考虑使用 HTTP 来提供某种 RESTful 接口来搜索,但是这个解决方案不适合异步更新,另外我提出的也不适合REST 的“无状态”原则:我必须对我的协议进行建模,因此我“创建”了一个搜索资源,随后我可以查询它的状态,并且我必须轮询它的更新。
有人提出的一个建议是使用BLIP之类的东西来为我提供客户端和服务器之间的双向管道,并为知道如何从服务器获取数据的服务器端资源实现我自己的“代理”类型对象。服务器并且另外是可寻址的,以便服务器可以向它们推送更新。虽然 BLIP 提供了双向通信所需的低级消息传递框架,但它仍然给我留下了一些问题:
- 我将如何管理服务器上对象的生命周期?我可以有一个“创建”搜索对象的消息类型,但该对象应该何时被销毁?
- 这在 iPhone 上的表现如何:如果我与服务器保持持久连接,这是否会过快耗尽电池?这个问题在 HTTP 世界中也很相关:大多数异步更新都是使用 COMET 类型的 hack 完成的,这又需要持久连接。
所以现在我仍然完全不确定最好的方法是什么:我已经做了很多搜索和阅读,但还没有找到任何解决方案。我在这里问,因为我确信你们中的许多人已经解决了这个问题。
你是如何在 iPhone 和 Objective-C 服务器端应用程序之间实现实时双向网络的?