私のアプリはバックグラウンドでユーザーの位置を追跡する必要がありますが、「取得」リクエストの送信に失敗しています。アプリがフォアグラウンドになると、すぐに http 要求が送信されます。私はすべてのネットワーク リクエストに RestKit を使用しており、このチュートリアルに従ってバックグラウンド ロケーション サービスをセットアップしました。私のアプリケーションでDidEnterBackground
-(void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgLocationManager = [[CLLocationManager alloc] init];
self.bgLocationManager.delegate = self;
[self.bgLocationManager startMonitoringSignificantLocationChanges];
NSLog(@"Entered Background");
}
そして、applicationDidBecomeActiveデリゲートでMonitoringSignificantLocationChangeを停止します
これは、新しく更新された場所を受け入れてサーバーに送信する locationManager デリゲートです。
-(void) locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
NSLog(@"I am in the background");
bgTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:
^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
}];
// ANY CODE WE PUT HERE IS OUR BACKGROUND TASK
NSString *currentLatitude = [[NSString alloc]
initWithFormat:@"%g",
newLocation.coordinate.latitude];
NSString *currentLongitude = [[NSString alloc]
initWithFormat:@"%g",
newLocation.coordinate.longitude];
NSString *webToken = [[NSUserDefaults standardUserDefaults] stringForKey:@"userWebToken"];
NSLog(@"I am in the bgTask, my lat %@", currentLatitude);
NSDictionary *queryParams;
queryParams = [NSDictionary dictionaryWithObjectsAndKeys:webToken, @"auth_token", currentLongitude, @"lng", currentLatitude, @"lat", nil];
RKRequest* request = [[RKClient sharedClient] post:@"/api/locations/background_update" params:queryParams delegate:self];
//default is RKRequestBackgroundPolicyNone
request.backgroundPolicy = RKRequestBackgroundPolicyContinue;
// AFTER ALL THE UPDATES, close the task
if (bgTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
ネットワーク リクエストは計画どおりに機能しますが、バックグラウンドで呼び出されません。必要な追加の手順はありますか? 私の info.plist には、 Required Background mode キーと location-services が値として含まれています。
編集
この過去の SO answerも参照しました。didUpdateToLocation 呼び出し全体にログを入れていくつかのテストを実行しましたが、それらはすべて呼び出されましたが、「get」リクエストは送信されませんでした。代わりに、最終的にアプリをフォアグラウンドで起動すると、構築されたすべてのネットワーク要求 (10 以上) が送信されました。
EDIT (2) リクエストに RKRequestBackgroundPolicyContinue を追加しましたが、結果は変わりませんでした。(ここでわかるように、restkit のバックグラウンド アップロード/ダウンロードを参照してください)。Restkit はホストを初期化しますが、アプリがアクティブになるまでリクエストを送信できません。
答え
RestKit はバックグラウンドで禁止されていることをしているに違いありません。NSURLRequest の使用は完全に機能します。
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com/api/locations/background_update"]];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:jsonData];
NSHTTPURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
バックグラウンド タスクを中断する UI がないため、同期リクエストを使用しても問題ありません。