socket连接在iOS应用进入后台后被杀死

8ehkhllq  于 2023-03-31  发布在  iOS
关注(0)|答案(3)|浏览(276)

我正在使用iPhone应用程序聊天使用套接字连接与服务器通信。当应用程序移动到后台时,我可以看到服务器能够与应用程序通信约5分钟。但在此之后,socket连接被破坏。但应用程序一移动到后台就停止执行。为什么socket连接保持了5分钟,而应用程序却没有执行。苹果是否指定了连接将保持的确切时间。

vhmi4jdf

vhmi4jdf1#

您可以通过在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
    });
  }
}

文档可在此处找到http://disanji.net/iOS_Doc/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
我只是实现了backgroundTaskIdentifier对象,并使background_task无效以检查时间,应用程序是活着的,并且运行了600秒。

NSLog(@"Time remaining: %f", application.backgroundTimeRemaining);
pkwftd7m

pkwftd7m2#

苹果IOS编程指南
大多数进入后台状态的应用程序在此后不久会被移到挂起状态。在此状态下,应用程序不执行任何代码,并且可以随时从内存中删除。向用户提供特定服务的应用程序可以请求后台执行时间,以便提供这些服务。
这至少解释了为什么应用停止执行。为什么你的服务器仍然能够与你的应用通信5分钟,可能是因为你设置了一个额外的长超时,并且没有在你的应用进入后台时显式关闭套接字连接。

vptzau2j

vptzau2j3#

虽然公认的答案仍然是正确的,但这是10年前的事了,所以现在可能需要补充一点,最近的iOS版本最多只能支持30秒。

相关问题