si dovrebbe utilizzare la versione di richiamata a meno che non è necessario supportare iOS < 7 (quando è stato introdotto). Poiché stai usando Swift, mi aspetto che non sia così.
Il metodo più vecchio risale al iOS3 ed è deprecato a tutti gli effetti:
Implementare il metodo invece di questo, quando possibile application:didReceiveRemoteNotification:fetchCompletionHandler:
. Se il delegato implementa entrambi i metodi, l'oggetto app chiama il metodo application:didReceiveRemoteNotification:fetchCompletionHandler:
.
La versione precedente fornirà risultati diversi a seconda che l'app sia attiva (in primo piano o in background) o si avvii da una partenza a freddo. In quest'ultimo caso, non verrà chiamato, e sarà necessario per intercettare il launchOptions
dict su didFinishLaunchingWithOptions
per arrivare al infoDict:
Se l'applicazione non è in esecuzione quando una notifica remota arriva, il metodo lancia il app e fornisce le informazioni appropriate nel dizionario delle opzioni di avvio. L'app non chiama questo metodo per gestire tale notifica remota.
Utilizzare la versione di richiamata. Funziona per tutti i casi.
Non è necessario utilizzare il gestore di completamento/blocco
, nel qual caso l'effetto è lo stesso (beh, più coerente con il metodo più recente).
aggiornamento
dispiace, Apple dice che fare devono richiamare il blocco di completamento "il più presto possibile" - si hanno 30 secondi per farlo prima che il sistema operativo dà su di voi. Questa potrebbe essere la fonte del tuo avvertimento.
Appena terminata l'elaborazione della notifica, è necessario chiamare il blocco nel parametro gestore o l'applicazione verrà terminata. L'app ha fino a 30 secondi di tempo di wall-clock per elaborare la notifica e chiamare il blocco del gestore di completamento specificato.In pratica, dovresti chiamare il blocco gestore non appena hai finito di elaborare la notifica.
Quindi richiamare il blocco completo:
completionHandler(UIBackgroundFetchResult.NoData)
Ho utilizzato questo metodo senza chiamare quel blocco di completamento e non ho avuto problemi, ma vorrei aggiungere uno ora solo per essere sicuri . Apple suggerisce che, in caso contrario, la tua app non verrà messa in primo piano, ma in pratica non l'ho vista.
Viene visualizzato un avviso quando non si utilizza il gestore di completamento. Dovrei semplicemente ignorarlo? –
@AdamJohns - quale avviso ricevi? quale versione di XCode/Swift? – foundry