0

私のアプリケーションには、タイマーを継続的に更新する1つの関数 updatetimer があります。アプリケーションがバックグラウンドにある間、このプロセスを続行したいのですが、そのメソッドは、アプリケーションがフォアグラウンドにある場合にのみ呼び出されます。アプリケーションがバックグラウンドにある間は呼び出されません。以下そのためのコードです。これを修正するにはどうすればよいですか?

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 


                         timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
                        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

                        [[NSRunLoop currentRunLoop] run]; 
                    }); 
4

1 に答える 1

3

Apple ドキュメントから、これらのタスクのみがバックグラウンドでの実行を許可されており、それぞれに独自の制限があります。

audio - アプリは、バックグラウンドでユーザーに可聴コンテンツを再生します。(このコンテンツには、AirPlay を使用したスト​​リーミング オーディオまたはビデオ コンテンツが含まれます。)

場所 - アプリは、バックグラウンドで実行されている間でも、ユーザーに自分の場所を通知します。

voip - このアプリは、ユーザーがインターネット接続を使用して電話をかける機能を提供します。

newsstand-content - このアプリは、バックグラウンドで雑誌や新聞のコンテンツをダウンロードして処理する Newsstand アプリです。

external-accessory - アプリは、外部アクセサリ フレームワークを通じて定期的なスケジュールで更新を配信する必要があるハードウェア アクセサリで動作します。

bluetooth-central - アプリは、CoreBluetooth フレームワークを通じて定期的に更新を配信する必要がある Bluetooth アクセサリと連携します。

それ以外の場合は、最大 10 分を要求できます。これによる余分なランタイムの:(これもアップルのドキュメントから)

bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        // Clean up any unfinished task business by marking where you.
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
 
    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 
        // Do the work associated with the task, preferably in chunks.
 
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });

詳細については、 Apple ドキュメントを参照してください。

于 2012-07-10T06:22:10.360 に答える