Moja aplikacja musi śledzić lokalizację użytkowników w tle, ale nie może wysłać żądania "pobierz". Żądanie http zostanie wysłane natychmiast, gdy aplikacja znajdzie się na pierwszym planie. Korzystam z narzędzia RestKit w przypadku wszystkich żądań sieci i wykonałem polecenie this tutorial, aby skonfigurować usługę lokalizacji tła. W moim applicationDidEnterBackgroundLokalizacja w tle iOS Lokalizacja nie wysyłająca żądania http
-(void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgLocationManager = [[CLLocationManager alloc] init];
self.bgLocationManager.delegate = self;
[self.bgLocationManager startMonitoringSignificantLocationChanges];
NSLog(@"Entered Background");
}
i stopMonitoringSignificantLocationChange w moim applicationDidBecomeActive delegata
To mój locationManager delegat gdzie mogę zaakceptować nową zaktualizowaną lokalizację i wysłać do mojego serwera
-(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;
}
}
sieć żąda prace zgodnie z planem, ale nie zostanie wywołany w tle. Czy są jakieś dodatkowe kroki, których potrzebuję? W moim pliku info.plist mam klucz trybu Wymagane tło i usługi lokalizacyjne jako wartość.
EDIT
ja również określane this past SO answer. Przeprowadziłem kilka testów z wprowadzaniem dzienników do wywołania didUpdateToLocation i wszystkie były wywoływane, ale żądanie "get" nie zostało wysłane. Zamiast tego, kiedy w końcu uruchomiłem aplikację na pierwszym planie, wysłano wszystkie utworzone żądania sieciowe (ponad 10).
EDYCJA (2) Dodałem RKRequestBackgroundPolicyContinue do mojej prośby, ale nie zmieniło to moich wyników. (Jak widać here w tle upload/download dla restkit). Widzę, że Restkit inicjuje hosta, ale nie wysyła żądania, dopóki aplikacja nie stanie się aktywna.
ODPOWIEDŹ
RestKit należy robić coś, co jest zakazane w tle. Korzystanie z NSURLRequest działa idealnie.
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];
Jest dobrze, aby używać synchroniczne żądania, ponieważ nie ma UI zakłócić zadania tła
Czy twoja próba zastąpienia połączeń restKit za pomocą synchronicznego NSURLConnection? – dklt
Zgadzam się z pytaniem dklt, ponieważ wydaje się prawdopodobne, że wywołanie "[[RKClient sharedClient] post: params: delegate:]' powoduje coś, co może się zdarzyć w kolejce GCD za kulisami, która nie jest objęta Twoje bracketing funkcji backgroundTask ... i synchroniczne wywołania, aby uzyskać dane, mogą pomóc w wysłaniu żądań w tle. tak, RKRequestBackgroundPolicyContinue może mieć na celu zajęcie się tą kwestią, ale tak naprawdę nie ustawiasz jej tak długo, aż po wezwaniu do wysłania: params: delegate:, i do tego momentu może być za późno. –
@dklt Udało mi się uzyskać to działając z prośbą NSURLConnection, dzięki za sugestię. Jeśli umieścisz odpowiedź, zaakceptuję ją. –