2015-04-28 42 views
12

Se io ignorarePerché non viene richiamatoRecezioneRemoteNotifica maRecezioneRemoteNotifica: fetchCompletionHandler ha chiamato quando la mia app è in primo piano?

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    println("hey) 
} 

ho con successo il metodo chiamato con l'applicazione in primo piano quando si invia una notifica push.

Se sovrascrivo

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
    println("hey") 
} 

non ho ricevuto alcuna chiamata al metodo per l'invio di una notifica con l'applicazione in primo piano. Perché il primo funziona, ma il secondo non funziona quando l'app è in primo piano?

Si noti che sto implementando solo uno di questi alla volta. Non entrambi allo stesso tempo.

risposta

15

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.

+0

Viene visualizzato un avviso quando non si utilizza il gestore di completamento. Dovrei semplicemente ignorarlo? –

+0

@AdamJohns - quale avviso ricevi? quale versione di XCode/Swift? – foundry

0

Ti sei registrato almeno un UIUserNotificationType con UIApplication:registerUserNotificationSettings:?

Se non si effettua la registrazione per badge, suono o avviso, è possibile ricevere solo notifiche silenziose, che vengono fornite solo con FetchCompletionHandler.

Problemi correlati