簡體   English   中英

iOS背景區域位置更新

[英]iOS background Region Location updates

我正在使用“區域監視”構建應用程序。 它在前台運行良好,但是一旦在后台發送應用程序,它的行為就不會達到預期:它確實調用didEnter和didExit,但是一旦開始執行回調,它就會停止。 在這些回調方法中,我需要輪詢服務器並保持didExitRegion和/或didEnterRegion狀態。 一旦我再次將應用程序置於前台,任何排隊的請求就會開始並完成。 任何想法? 我在iPhone 4上使用ios5.1和ios6

當您在后台被致電時

- (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中進行了說明

如果您想保持生命,就必須請求更多的時間。 請參閱背景模式下的文檔。 有一種方法。 通常,您“不允許”在后台執行任何任務。 僅適用於特定的GPS,例如GPS。 嘗試在每個區域更新后請求額外的背景時間。

如果尚未將“位置”添加到Info.plist的UIBackgroundModes中。 第二個想法是使用AFNetworking ,它非常流行並且具有背景支持。 這意味着它將處理設置參數以告知操作系統它將“在我回到睡眠之前完成此操作”。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM