我有一个使用 XMPP 和 EJABBERD 服务器的 iPhone 聊天应用程序,如果应用程序进入后台(通过点击主页按钮或由于缺乏活动然后屏幕变黑),该服务器设置为正常运行,然后继续正常运行当被带到前台时。
该应用程序在进入后台和返回前台时在 iPad 上运行良好,但是当我在 iPhone 4S 上运行该应用程序时,在应用程序进入后台大约一个小时后,该应用程序从 XMPP 服务器脱机。然后当 iPhone 4S 回到前台时,应用程序不再连接到 XMPP 服务器。相比之下,在 iPad 上,该应用程序已经在后台运行了一天多,并且仍然与 XMPP 服务器联机。
我看到了这个 SO帖子,但是由于该应用程序已经在我的 iPad 上的后台运行了一天多,并且 iPad 上的应用程序仍然与 XMPP 服务器联机,我认为这不是问题所在。
1) Is this because the iPhone 4S goes into Airplane mode after some time?
2) If the answer to 1) is yes, is there a way for the app to programmatically stop the iPhone 4S from going into Airplane mode?
3) Or is something else going on?
更新 1 -
有趣的是 iPad 可以在 XMPP 服务器上离线,但是当 iPad 上的应用程序被带到前台时,XMPP 工作正常。但是如果 iPhone 4S 上的应用程序在 XMPP 服务器上离线,那么当 iPhone 4S 上的应用程序被带到前台时,XMPP 就不再工作了。此外,iPad 在 XMPP 服务器上会在 20 分钟左右后快速下线,而 iPhone 4S 需要几个小时才能下线。也许 iPad 和 iPhone 4S 之间出现了不同的离线方式?
如本文所述,我已尝试在 XMPPStream.h 中的 DEFAULT_KEEPALIVE_INTERVAL 进行游戏,但到目前为止没有成功。在 XXMPStream.h 我有代码:
#if TARGET_OS_IPHONE
#define MIN_KEEPALIVE_INTERVAL 20.0 // 20 Seconds
#define DEFAULT_KEEPALIVE_INTERVAL 120.0 // 2 Minutes
#else
#define MIN_KEEPALIVE_INTERVAL 10.0 // 10 Seconds
#define DEFAULT_KEEPALIVE_INTERVAL 300.0 // 5 Minutes
#endif
更新 2 -
另一个奇怪的是,当应用程序在 iPhone 4 上处于后台时,如果 iPad 上的应用程序想与 iPhone 4 聊天,iPad 会向 iPhone 4 发送一个 Push Notification。这个 Push Notification 使应用程序启动iPhone 4 到前台,iPhone 4 尝试重新连接到 EJABBERD 服务器,但 iPhone 4 不再能够重新连接。
更新 3 -
iPad 只有 Wifi,而 iPhone 4 有 Wifi 和 4G 蜂窝连接。所以我想也许这就是区别。所以我把 iPhone 4 设置成飞行模式,然后连接 Wifi,所以 iPhone 4 只使用 Wifi。但 2-3 小时后,iPhone 4 再次与 EJABBERD 服务器脱机。