0

を使用してバックグラウンドで5分ごとにREST APIを介してサーバーからコンテンツを取得するアプリがありますUIBackgroundTaskIdentifier。私の問題は、これが 1,2 時間正常に動作し、期限が切れた後、バックグラウンド タスクを再起動しないことです。私が使用しているコードは以下のとおりです。

AppDelegate.m 内

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
          UIApplication* app = [UIApplication sharedApplication];

            self.expirationHandler = ^{
                [app endBackgroundTask:self.bgTask];
                self.bgTask = UIBackgroundTaskInvalid;
        //      self.bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
                NSLog(@"Expired");
                self.jobExpired = YES;
                while(self.jobExpired) {
                    // spin while we wait for the task to actually end.
                    [NSThread sleepForTimeInterval:1];
                }
                self.bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
                // Restart the background task so we can run forever.
                [self startBackgroundTask];
            };
            self.bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];

            [self monitorBatteryStateInBackground];
    }

    - (void)monitorBatteryStateInBackground
    {
        NSLog(@"Monitoring update");
        self.background = YES;
        [self startBackgroundTask];
    }

    - (void)startBackgroundTask
    {
        NSLog(@"Restarting task");
        // Start the long-running task.
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            // When the job expires it still keeps running since we never exited it. Thus have the expiration handler
            // set a flag that the job expired and use that to exit the while loop and end the task.
            while(self.background && !self.jobExpired)
            {
                [self uploadPhotostoServer];
                [NSThread sleepForTimeInterval:240.0];
            }

            self.jobExpired = NO;
        });
    }

期限切れのセクションでは、それは来ますが、メソッドを呼び出すことはありません[self startBackgroundTask]

どんな助けでも大歓迎です。

4

0 に答える 0