ユーザーがプッシュ通知に関連する設定を変更した場合、サーバーにデータをアップロードするバックグラウンドタスクを-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のままです...