2012-12-11 111 views
0

我建立与区域监控的应用程序。它工作正常,在前台,但一旦应用程序在后台发送,它不表现为预期:它不尽快拨打didEnter和didExit但是,当它开始执行其停止回调。在这些回调方法中,我需要轮询服务器并保持didExitRegion和/或didEnterRegion状态。只要我再次将应用程序放在前台,任何排队的请求都会启动并完成。 有什么想法? 我使用的是iPhone 4的iOS的背景区域位置更新

回答

0

ios5.1和iOS6的你,如果你想活命,要求额外的时间。 请参阅背景模式上的applle文件。有一种方法。 通常你是不是“允许”留在后台对任何任务激活。只针对特定的,如GPS。 尝试在每个区域更新后请求额外的背景时间。

+0

解释我想我读的地方是最大约10分钟...我需要背景连续区域位置更新 – user1170896

+0

您所在地区的更新是连续的,但你的其他任务不是, adter当时接收区域更新请求。 – AlexWien

-1

如果您还没有已经添加“位置”到您的Info.plist的UIBackgroundModes。作为第二个想法,我使用AFNetworking这是广泛流行和背景支持。这意味着它将处理设置参数,告诉操作系统它将“在我回去睡觉之前完成这件事”。

enter image description here

2

,当你在后台调用在

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 

(或...退出)

只是无论你需要为服务器呼叫建立(变量,有效载荷为服务器等)等)。 之前实际发送开始

self.bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
    [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskId]; 
    self.bgTaskId = UIBackgroundTaskInvalid; 
    somelogger(@"ran out of time for background task"); 

    // remember that we failed for the next time the app comes to the foreground 
}]; 

然后做实际与您所选择的HTTP框架,并在完成处理程序使用重置与

[[UIApplication sharedApplication] endBackgroundTask:self.bgTaskId]; 

实例后台任务AFNetworking发送:

[self.httpClient postPath:@"state" parameters:@{@"abc": abc, @"value": val, @"h": h, @"app":myAppName , @"version": myAppVersion } 
    success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     if (operation.response.statusCode != 200) { 
      DDLogVerbose(@"response was not 200. error: %i", operation.response.statusCode); 

     } else { 
      DDLogVerbose(@"success"); 

     } 

     [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskId]; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     DDLogVerbose(@"request error %@, current retry count %d", error, retryCount); 

     // start our own retry mechanism 
     if (retryCount < MAX_RETRIES) { 
      retryCount++; 
      double delayInSeconds = RETRY_INTERVAL * (1 + (double)retryCount/10); 
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
      dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
       // try again 
      }); 
     } else { 
      // final 
      [[UIApplication sharedApplication] endBackgroundTask:self.bgTaskId]; 

      // remember failure when app comes back to foreground 
     } 

    }]; 

我正在使用一个

@property (assign, nonatomic) UIBackgroundTaskIdentifier bgTaskId; 

来存储背景标识符。

整个机制在http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW28