IOS后台聊天应用同步

Posted

技术标签:

【中文标题】IOS后台聊天应用同步【英文标题】:Chat app synchronization on background in IOS 【发布时间】:2014-01-12 18:52:21 【问题描述】:

我有一个由 JS 开发的聊天应用程序。我想偶尔向服务器发送 PING。如果应用程序在前台运行,这不是问题。问题是当用户最小化它或打开另一个应用程序时。我的应用失去焦点并进入暂停状态。

我有以下两个用例。

    为了保持聊天会话打开,我需要每隔 X 分钟向服务器(它是一个 IRC 服务器)发送一次 PING,即使应用程序在后台运行。 我们还需要检查新消息(通过本地 http 服务器上的 ajax)并将本地通知添加到通知队列,以便当用户点击它时应用可以恢复

我发现苹果不允许在后台运行应用程序。如果他们允许,他们需要特别许可。我发现一些应用程序通过请求有限长度的执行时间来做到这一点。 获得尽可能高的后台执行时间的最佳方法是什么?作为聊天应用程序,我可以请求voiplocation 或任何其他方式的权限吗?

注意:应用程序将在没有互联网的环境中运行。因此推送通知在这里不起作用

更新:经过大量搜索,我找到了background fetchbackground fetch 似乎适合它。但是问题依然存在,没有及时调用。

【问题讨论】:

没有解决办法。如果您的应用程序不是基于位置的,则您不能使用位置或类似的东西试图继续在后台运行。如果您的应用程序符合条件,最好的选择是 voip,但您没有提供足够的信息来评估它是否符合条件。如果不是,那么唯一的选择是后台获取。这就是 ios,你必须忍受它的限制,如果根据 Apple 的限制,你的应用程序没有资格获得后台执行,那么没有什么神奇的解决方案可以尝试后台执行。 如果你真的做到了,你肯定会获得诺贝尔奖。您如何在没有任何网络活动且同时运行 HTTP 服务器的情况下提供聊天服务? @Mert 如果使用企业分发,是否可以避免苹果批准?那样的话voip应该解决吗? AFAIK,您无法在虚假 VOIP 使用上欺骗 Apple。除此之外,没有IP就无法使用VOIP,反正你需要网络。 没有没有互联网,但IP可用。有网络。 【参考方案1】:

这听起来是个有趣的问题。通过阅读各种 cmets,听起来您希望它在本地网络上工作 - 所以您有 wifi,但 wifi 路由器/基站没有连接到实际的互联网?

因为后台刷新是不可预测的 - 你永远不知道它什么时候会更新 - 你可能想要发挥创意。

您可以考虑利用 iOS VOIP 支持,只有在没有 Voice 的情况下! Apple has some tips on VOIP here。 VOIP 基本上使用称为 SIP(​​会话发起协议)的东西,它是呼叫的信令层,很像 HTTP。您想要利用的正是这个 SIP 层。

这不会很容易,但应该可以实现。设置您的应用程序以使用 VOIP,然后将 PJSip 之类的内容作为您的 SIP 库。然后,在你的本地网络上有一个 SIP 服务器(我相信有很多开源实现),你可以注册你的 iPhone (所以你的服务器知道你的电话在哪里,假装是一个 VOIP 电话)。这应该可行,因为据我所知,它不需要通过 Apple... 并且可以在您的本地网络上愉快地运行。

然后,服务器可以通过 SIP 向手机发送消息,就好像它正在发起 VOIP 会话一样。您的应用程序被唤醒,获取消息 - 如果可能的话,最好从 SIP 消息中获取消息 - 然后只是不启动会话。 SIP 仅用于创建会话,而不仅仅是 VOIP。当我在电信研发部门工作时(很久以前),我们使用它在文本/语音/视频之间进行交换,所有这些都使用本地服务器。

你必须跳很多圈才能完成这项工作,但它会非常棒。我从未尝试过这个实际用例——尤其是在 iOS 上,但我相当确定它会起作用。这有点软糖,但应该能让你到达你需要去的地方。

祝你好运!

【讨论】:

是的,路由器没有联网 还有一点,该应用似乎不会公开,而是在企业内部。所以我认为在这种情况下不需要苹果的批准。虽然我们想把它分发给几家企业 在这种情况下,你应该没问题。 SIP 应该完成这项工作。 iPhone 将保持套接字打开,您可以像打电话一样向设备推送消息!听起来很有趣。我有点嫉妒你能建造它! 如果苹果不需要验证企业应用程序,我不能只在xcode上启用voip模式并且能够在没有SIP的情况下发送http请求吗? 我今天正在考虑这个问题。我不是 100% 肯定,但很有可能。这意味着您可以只使用您的专有协议来完成整个事情!【参考方案2】:

您可以使用 PubNub 之类的工具,使用原生 Objective-C 代码或 Phonegap (Cordova) 库在 iOS 上构建这个聊天应用程序。

使用像 PubNub 这样的实时消息网络的美妙之处在于,当应用程序进入后台时,您可以轻松地让聊天消息进入 APNS。

当应用程序在前台时,它可以将它们作为本机 (PubNub) 消息接收。如果它需要“赶上”它在后台错过的消息(但通过 APNS 接收),实现起来很简单。

此外,PubNub 与平台无关——因此您也可以轻松地在 Web、android、BB、Windows Phone 等平台上使用它。

http://www.pubnub.com/blog/build-real-time-chat-10-lines-code/

http://www.pubnub.com/blog/html5-websockets-beautiful-real-time-chat-on-mobile-using-pubnubs-channel-presence/

https://github.com/pubnub/objective-c/tree/master/iOS

https://github.com/pubnub/javascript/tree/master/phonegap

杰瑞米

【讨论】:

但是,如果你的意思是你永远不会有互联网(不仅在某些情况下),这可能不适合你:) 没有互联网。我们正在为没有互联网的人提供聊天和其他服务。 @shiplu.mokadd.im 你认为如何连接没有互联网连接的人?还是您的意思是本地 WiFi 网络上的 bonjour? @moonlight 不,我们没有使用 bonjour。它是一项专有技术。我们只提供聊天服务。 @shiplu.mokadd.im 为了让 PubNub 客户端能够工作,他们应该能够访问 PubNub 远程服务(在 HTTP、HTTPS 端口上)。 PubNub 客户端现在是否可以使用您的proprietary 技术正常工作?至于在后台工作 - 您不能只选择所需的后台模式而不实际使用所选模式。如果您选择voip 并停止与服务器的通信,应用程序将被暂停+Apple 可能会决定拒绝它。与其他模式相同。

以上是关于IOS后台聊天应用同步的主要内容,如果未能解决你的问题,请参考以下文章

Twilio 可编程聊天 — 使应用程序徽章与未读消息计数保持同步

iOS:Facebook 聊天头行为和动画

转移到ios可以转移微信聊天记录吗

当用户在 quickblox 的 ios 中离线时获取消息

快速修复 Appestore 解决 XMPP iOS VoIP 后台执行拒绝

如何在后台保持 iphone ios websocket 连接处于活动状态?