0

如果用户更改了与推送通知相关的设置,我将在 -applicationDidEnterBackground 中启动一个后台任务,将数据上传到我的服务器。当用户更改设置时,我将静态 BOOL 设置为 YES,并且仅在应用程序进入后台时发送更改。我将结束任务的 a 块传递给方法,因此当到达 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 *)application

我相信将它放在 applicationDidEnterBackground 中为时已晚。

检查了文档,你是对的,在 applicationDidEnterBackground 中应该没问题。

另一个建议,尝试在 dispatch_async 块内移动 beginBackgroundTaskWithExpirationHandler 。它可能必须在同一个线程中启动,但在文档中没有明确说明。

于 2012-10-18T15:05:14.257 回答
0

结束使用 +sendSynchronousRequest:returningResponse:error:

于 2012-10-22T11:51:22.647 回答