La mia app deve tracciare la posizione degli utenti in background ma non riesce a inviare una richiesta 'get'. La richiesta http viene inviata immediatamente quando l'app arriva in primo piano. Sto usando RestKit per tutte le mie richieste di rete e ho seguito this tutorial per configurare il servizio di localizzazione in background. Nel mio applicationDidEnterBackgroundSfondo iOS Posizione che non invia richiesta http
-(void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgLocationManager = [[CLLocationManager alloc] init];
self.bgLocationManager.delegate = self;
[self.bgLocationManager startMonitoringSignificantLocationChanges];
NSLog(@"Entered Background");
}
e ho stopMonitoringSignificantLocationChange nel mio delegato applicationDidBecomeActive
Questo è il mio delegato locationManager in cui accetto la nuova posizione aggiornata e inviare al mio server
-(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;
}
}
La rete richiede opere come previsto ma non verrà chiamato in background. Sono necessari ulteriori passaggi? Nel mio info.plist ho la chiave di modalità Background richiesta e servizi di localizzazione come valore.
EDIT
anche io di cui this past SO answer. Ho eseguito alcuni test con l'inserimento dei registri per tutta la chiamata didUpdateToLocation e sono stati tutti richiamati ma la richiesta 'get' non è stata inviata. Invece, quando finalmente lancio l'app in primo piano, ho inviato tutte le richieste di rete (oltre 10).
EDIT (2) Ho aggiunto RKRequestBackgroundPolicyContinua alla mia richiesta ma non ha modificato i miei risultati. (Come si può vedere here in background caricare/scaricare per restkit). Vedo che Restkit inizializza l'host ma non riesce a inviare la richiesta finché l'app non diventa attiva.
RISPOSTA
RestKit deve fare qualcosa che è proibito in background. L'utilizzo di un NSURLRequest funziona perfettamente.
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];
E 'bene utilizzare una richiesta sincrona poiché non v'è alcuna interfaccia utente di distruggere con le operazioni in background
Avete provato a sostituire le vostre chiamate di restKit con un NSURLConnection sincrono di serie? – dklt
concordo con la domanda di dklt, perché sembra probabile che la chiamata a '[[RKClient sharedClient] post: params: delegate:]' sta causando qualcosa che potrebbe accadere in una coda GCD dietro le quinte che non è coperta da il tuo bracketing backgroundTask ... e che le chiamate sincrone per ottenere i tuoi dati possono essere di aiuto in modo tale che le richieste vengano inviate mentre sono in background. sì, la RKRequestBackgroundPolicyContinue può essere pensata per occuparsi di questo, ma in realtà non lo stai impostando fino a dopo la chiamata al post: params: delegate: ea quel punto potrebbe essere troppo tardi. –
@dklt Sono riuscito a farlo funzionare con una richiesta NSURLConnection, grazie per il suggerimento. Se metti una risposta, la accetterò. –