我正在使用 iPhone 应用程序聊天使用套接字连接与服务器进行通信。当应用程序移至后台时,我可以看到服务器能够与应用程序通信约 5 分钟。但是在这个时间之后,套接字连接被破坏了。但是应用程序一进入后台就停止执行。为什么套接字连接保持5分钟而不是应用程序执行。苹果是否指定了保持连接的确切时间。
问问题
8488 次
2 回答
9
通过在 applicationDidEnterBackground 中使用以下代码,您可以获得 600 秒(10 分钟)的最大时间:
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4
if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking
UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance
__block UIBackgroundTaskIdentifier background_task; //Create a task object
background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
[application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks
background_task = UIBackgroundTaskInvalid; //Set the task to be invalid
//System will be shutting down the app at any point in time now
}];
//Background tasks require you to use asyncrous tasks
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Perform your tasks that your application requires
NSLog(@"\n\nRunning in the background!\n\n");
[application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform
background_task = UIBackgroundTaskInvalid; //Invalidate the background_task
});
}
}
我刚刚实现了 backgroundTaskIdentifier 对象并使 background_task 无效以检查时间,应用程序处于活动状态并且正在运行 600 秒。你甚至可以使用这个来获得剩余时间
NSLog(@"Time remaining: %f", application.backgroundTimeRemaining);
于 2013-02-14T16:41:17.630 回答
1
来自 Apple 的IOS 编程指南
大多数进入后台状态的应用程序都会在此后不久进入挂起状态。在此状态下,应用程序不会执行任何代码,并且可能随时从内存中删除。向用户提供特定服务的应用程序可以请求后台执行时间以提供这些服务。
这至少解释了为什么应用程序停止执行。为什么您的服务器仍然能够与您的应用程序通信 5 分钟可能是因为您设置了一个额外的超时时间并且没有在您的应用程序进入后台时明确关闭套接字连接。
于 2013-02-14T14:36:18.900 回答