iphone 4S 在后台一段时间后从 XMPP 服务器脱机?

Posted

技术标签:

【中文标题】iphone 4S 在后台一段时间后从 XMPP 服务器脱机?【英文标题】:iphone 4S goes offline from XMPP server after some time in background? 【发布时间】:2012-06-22 16:26:17 【问题描述】:

我有一个使用 XMPP 和 EJABBERD 服务器的 iPhone 聊天应用程序,如果应用程序进入后台(通过点击主页按钮或由于缺乏活动然后屏幕变黑),该服务器已设置为正常运行,然后继续到前台时才能正常工作。

该应用程序在 iPad 上运行良好,在进入后台并返回前台时,但当我在 iPhone 4S 上运行该应用程序时,在应用程序进入后台大约一个小时后,该应用程序从XMPP 服务器。然后当 iPhone 4S 回到前台时,应用程序不再连接到 XMPP 服务器。相比之下,在 iPad 上,该应用程序已经在后台运行了一天以上,并且仍然与 XMPP 服务器联机。

我看到了这个 SO post,但是由于该应用程序已经在我的 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 出现了不同的离线方式?

如SO post 中所述,我已尝试在 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 服务器脱机。

【问题讨论】:

【参考方案1】:

我终于通过SO post 找到了解决问题的方法。即使 iPhone 4 从 EJABBERD 服务器脱机,当应用程序进入前台时,应用程序可以重新连接到 EJABBERD 服务器,而以前应用程序无法重新连接。

具体是我用的代码

- (void)applicationDidEnterBackground:(UIApplication *)application 

UIApplication*    app = [UIApplication sharedApplication];

// it's better to move "dispatch_block_t expirationHandler"
// into your headerfile and initialize the code somewhere else
// i.e. 
// - (void)applicationDidFinishLaunching:(UIApplication *)application 
//
// expirationHandler = ^ ...  
// because your app may crash if you initialize expirationHandler twice.
dispatch_block_t expirationHandler;
expirationHandler = ^

    [app endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;


    bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
;

bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];


// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^

    // inform others to stop tasks, if you like
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];

    // do your background work here     
); 

【讨论】:

以上是关于iphone 4S 在后台一段时间后从 XMPP 服务器脱机?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone4S 在 Beacon 检测中的奇怪行为

iPhone 4s 6.1.2 版 UIViewcontroller 在使用相机拍照时刷新

断开连接后从 xmpp 服务器检索最后发送的消息

如何在iphone的后台获取位置[关闭]

iOS XMPP 客户端在一段时间后断开连接

iphone:一段时间后停止使用后台定位服务