2015-12-15 14 views
5

Secondo la documentazione di Apple, posso registrarmi per la notifica silenziosa aggiungendo il valore-chiave "content-available" = 1 nel dizionario del carico utile aps. Voglio che la mia app si attivi in ​​background quando arriva una notifica silenziosa. Ho impostato App downloads content in response to push notifications valore al Required background modes nel mio info.plistLe notifiche push silenziose di Apple avviano la mia app in background?

Questo è il mio dizionario payload

{"aps": 
     { 
     "alert":"Notification alert","badge":1,"sound":"default","content-available":1 
     } 
} 

sto ottenendo i callback in -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler mentre la mia applicazione è in background. Ma la mia domanda è: possiamo richiamare questo o altri metodi quando la nostra applicazione è in stato di morte?

Non voglio che l'utente app visualizzi la notifica ma voglio che la mia app esegua determinate attività svegliandola in background tramite notifiche silenziose.

Qualsiasi suggerimento sarebbe apprezzato.

risposta

4

Quando il dispositivo riceve un messaggio push con il set content-available, l'app viene avviata in background da Apple. Gli utenti non ne saranno consapevoli. From the docs:

contenuti disponibili: Fornire questo tasto con un valore pari a 1 per indicare che il nuovo contenuto è disponibile. Includendo questa chiave e questo valore significa che quando l'app viene avviata in background o ripresa, viene chiamato -application:didReceiveRemoteNotification:fetchCompletionHandler:.

+0

Hai ragione ma il problema è se la mia applicazione è in stato di morte e arriva una notifica silenziosa di quanto la mia app non si sta avviando in background. –

+0

ne sei sicuro? Questo può essere difficile da eseguire il debug. Potresti trovarlo più semplice (se il tuo debug-Xcode non è al 100%) per scrivere un log su un file quando la tua app viene avviata in modo che tu possa vedere l'applicazione si sta attivando anche se non sei collegato ad esso con il Xcode debugger. La tecnologia funziona sicuramente, ma [ci sono alcune stranezze occasionali] (http://stackoverflow.com/questions/19239737/silent-push-notification-in-ios-7-does-not-work). – TwoStraws

+1

Se l'app è stata terminata manualmente dall'utente, questo è spesso preso come suggerimento dal sistema operativo che l'utente * davvero * non vuole che funzioni. Certamente diversi altri processi "in background" in iOS (ad esempio trasferimento di file in background con NSURLSession) in particolare * non * avviano la tua app come farebbero normalmente se fossero stati uccisi dallo switcher dell'app.Non conosco questo caso particolare, ma non mi sorprenderebbe scoprire che un'app terminata manualmente non si riattivava sulle notifiche push finché non veniva riavviata manualmente dall'utente. –

4

Ho affrontato un simile tipo di scenario, ho scritto questo codice per eseguire il debug se la mia applicazione si sta svegliando in caso di notifica silenziosa o meno.

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *str = [defaults objectForKey:@"key"]; 
    if (str == nil) { 
     str = @"didReceiveRemoteNotification"; 
    }else{ 
     str = [NSString stringWithFormat:@"%@, didReceiveRemoteNotification",str]; 
    } 
    [defaults setObject:str forKey:@"key"]; 
    [defaults synchronize]; 
} 

Questo codice funziona come, se ti sveglia app su quanto si otterrà richiamata in questo metodo e il nome del metodo sarà scritto in NSUserDefaults. Quindi, quando esegui il debug della tua app manualmente, puoi vedere il valore della variabile stringa str, se c'è una stringa didReceiveRemoteNotification di quanto verrai a sapere che l'applicazione è stata svegliata.

Nota: questo funziona solo in modalità background per me. Ricevo valore quando non ho forzato la chiusura dell'app (terminare manualmente), ma quando chiudo forzatamente la mia app dall'app switcher non otterrò alcun valore.

Spero che funzioni.

Problemi correlati