6

iPhoneアプリチャットを使用しているIamは、ソケット接続を使用してサーバーと通信します。アプリをバックグラウンドに移動すると、サーバーがアプリと約5分間通信できることがわかります。しかし、この時間の後、ソケット接続は破壊されます。しかし、アプリはバックグラウンドに移動するとすぐに実行を停止します。ソケット接続が5分間維持されるのに、アプリの実行は維持されないのはなぜですか。アップルは、接続が維持される正確な時間を指定しますか。

4

2 に答える 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
    });
  }
}

ドキュメントはここにありますhttp://disanji.net/iOS_Doc/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

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 に答える