0

ユーザーがプッシュ通知に関連する設定を変更した場合、サーバーにデータをアップロードするバックグラウンドタスクを-applicationDidEnterBackgroundで開始しています。ユーザーが設定を変更すると、静的BOOLをYESに設定し、アプリがバックグラウンドに入ったときにのみ変更を送信します。タスクを終了するブロックをメソッドに渡すので、connectionDidFinishLoadingに到達すると、それを呼び出してタスクを終了します。

ほとんどの場合、シミュレーターでは機能しますが、実際のデバイスでは機能しません。

関連コード:

self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^
 {
     [application endBackgroundTask:self.bgTask];
     self.bgTask = UIBackgroundTaskInvalid;
 }];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
   {
       [PushInfo checkDirty:^{
           NSLog(@"push info sent");
           [application endBackgroundTask:self.bgTask];
           self.bgTask = UIBackgroundTaskInvalid;
       }];
   });
...
// in PushInfo.m :
typedef void (^VoidBlock)();
static BOOL dirty;

+ (void) checkDirty:(VoidBlock)endBlock
{
    if(dirty)
    {
        PushInfo *pi = [[PushInfo alloc] init];
        NSLog(@"sending pushinfo");             // This code is always reached
        [pi setEndBlock:endBlock];
        [pi updatePushInfo];
    }
    else
        endBlock();
}

- (void) updatePushInfo
{
   ...
   // Create a NSURLConnection to send the data
   ...
}

- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
  ...
  NSLog(@"sent push info");
  dirty = NO;
  if(endBlock)
  {
    endBlock();
  }
}

私は何かが足りないのですか?編集:シミュレーター上のサーバーに情報を送信する場合でも、静的変数は何らかの理由でYESのままです...

4

2 に答える 2

1

コードを次の場所に移動してみてください。

-(void) applicationWillResignActive:(UIApplication *)アプリケーション

applicationDidEnterBackground に入れるのは遅すぎると思います。

ドキュメントを確認しました。その通りです。applicationDidEnterBackground で問題ないはずです。

別の提案として、beginBackgroundTaskWithExpirationHandler を dispatch_async ブロック内に移動してみてください。同じスレッドで開始する必要があるかもしれませんが、ドキュメントに明示的に記載されていません。

于 2012-10-18T15:05:14.257 に答える
0

+sendSynchronousRequest:returningResponse:error: を使用して終了しました:

于 2012-10-22T11:51:22.647 に答える