如果用戶更改了與推送通知相關的設置,我將在-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();
}
}
我失去了什麼? 編輯:即使它不將信息發送到服務器上的模擬器,靜態變量仍然是出於某種原因...
當你說不會在設備上工作,你的意思是dispatch_async塊裏面從來沒有達到?你還測試了什麼設備? –
我已經通過它了,它到達了我創建NSURLConnection的位置。之後,我無法在模擬器和設備上瀏覽代碼。我正在使用iOS 4和iOS 6模擬器的iPhone 4s(尚未在5.1模擬器上測試過) –
作爲旁註,因爲我開始測試後臺任務,Springboard總是滾動一下左側,我可以看到我的應用程序在另一個頁面上的一些圖標。 o.O –