我的 android 应用程序启动了一个服务,该服务打开一个 websocket 以与远程服务器进行通信。该服务生成一个线程,其运行方法如下所示。
public void run() {
try {
super.run();
for(int i = 1; i < 1000; i++) {
Log.d(TAG, String.format(" *** Iteration #%d.", i));
Thread.sleep(3000); // Dummy load.
mWebsocket.sendTextMessage("Test");
}
}
catch (Exception exc) {
Log.d(MY_TAG, "MyThread.run - Exception: " + exc.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
当我关闭屏幕或将应用程序发送到后台时,logcat 显示循环正在运行,但远程服务器停止接收测试消息。显然,消息在某处汇集,因为一旦应用程序回到前台,服务器将收到一堆测试消息。这是 Android 上的预期行为吗?我尝试了不同的 Websocket 包(Autobahn、okhttp3、...),结果是一样的。
iPhone 的 XMPPFramework 功能强大。我已经启动并运行了,但是如何在后台保持连接超过 10 分钟?我将不胜感激有关如何完成此操作的更多文档/操作方法。
所以用例简单而常见:Joe 在线并且在 iPhone 聊天应用程序中。他离开聊天应用程序并转到 Safari,玩游戏、播放电影以及做其他事情 3 小时(或更长时间)。乔希望在此期间继续接收消息。
示例应用程序允许 Joe 在后台接收本地通知,但似乎只有 10 分钟。这是相关的代码(我认为)。谢谢!
为了帮助其他人,甚至达到这一点,您需要将 xmppstream 属性 enableBackgroundingSocket 设置为 YES(在您应该复制的 iphoneXMPP 示例项目中为您完成)和 appname-info.plist(即 iosChat- info-plist) 文件,您需要添加新的键/值对。您应该右键单击某处并“添加行”。您应该选择“所需的背景模式”键,然后输入“voip”。按下 Enter 后,Xcode 会检测到您的意思是“应用程序提供 IP 语音服务”。这让您有 10 分钟的时间让聊天应用程序在后台保持打开状态(我认为)。但是我们要无限期地,我怀疑答案就在下面的方法中。我是否应该在此方法或其他方法中“重新连接”,例如,[self connect](我有一个连接方法)?
- (void)applicationDidEnterBackground:(UIApplication *)application{
DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD);
if ([application respondsToSelector:@selector(setKeepAliveTimeout:handler:)])
{
[application setKeepAliveTimeout:600 handler:^{
DDLogVerbose(@"KeepAliveHandler");
// Do other keep alive stuff here.
}];
}}
Run Code Online (Sandbox Code Playgroud) android ×1
autobahnws ×1
background ×1
connection ×1
ios ×1
iphone ×1
okhttp3 ×1
websocket ×1
xmpp ×1