2015-04-05 13 views
7

Come pagina di informazioni ufficiale della mela sulla notifica push afferma:iOS 8 Notifiche remote - Quando devo chiamare registerForRemoteNotifications()?

"token di dispositivi possono cambiare, quindi la vostra applicazione ha bisogno di registrare nuovamente ogni volta che viene lanciato"

Sto cercando di capire cosa intendessero per "ogni volta che viene lanciato".
vuol dire che devo chiamare in AppDelegate, in didFinishLaunchingWithOptions() in questo modo:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    application.registerForRemoteNotifications() 
    return true 
} 

Mettendo questo codice qui farà sì che per eseguire ogni volta che l'utente apre l'applicazione, che potrebbe essere molte volte un minuto se l'utente è multitasking tra le app (andare avanti e indietro tra loro).

E dal momento che la chiamata al metodo di registrazione richiama una richiesta HTTP ad APNS, c'è il rischio di ottenere un divieto temporaneo.

Queste osservazioni sono corrette oppure posso inserire il metodo di registrazione in questo modo senza alcun timore?

(sto usando Xcode 6.2 con Swift)

+0

Sì, è necessario registrarsi in tale metodo. Anche se l'utente passa da un'app all'altra e viceversa, è probabile che la tua app rimanga in memoria e si sposti semplicemente nello stato sospeso anziché uscire effettivamente – Paulw11

risposta

4

didFinishLaunchingWithOptions non viene chiamato ogni volta che l'utente passa alla vostra applicazione, come spesso la vostra applicazione è ancora in esecuzione. Quello che stai descrivendo suona più come applicationDidBecomeActive.

Aggiungi un po 'di NSLog s a entrambi i metodi per convincerti che didFinishLaunchingWithOptions è il posto giusto per chiamare .registerForRemoteNotifications.

+0

Quindi, come suggerito da Apple, i token dispositivo possono cambiare in qualsiasi momento come chiama registerForRemoteNotification in didFinishLaunchingWithOptions(), è anche ragionevole inserirlo in applicationDidBecomeActive(). – wuf810

+0

Interessante - Vedo il "in qualsiasi momento" menzionato qui: https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html#//apple_ref/doc/uid/TP40008194- CH6-SW3 ma dice anche "Quando il token del dispositivo cambia, l'utente deve avviare la tua app una volta prima che le notifiche remote possano essere nuovamente consegnate a quel dispositivo." quindi perché non usare solo "didFinishLaunchingWithOptions'? –

+0

Un buon punto anche se quando l'ho visto, ho letto il suo significato "questo non accade in background" e accade solo all'avvio dell'app (da sfondo o da terminato). Vorrei che Apple fosse un po 'più chiara nei loro documenti e nell'uso delle parole. – wuf810

2

Rispondere alla tua domanda esatta: - puoi mettere il metodo di registrazione in didFinishLaunchingWithOptions senza alcun timore. È consigliato dalla stessa mela.

Caso 1: - Se nel proprio plist "L'applicazione non viene eseguita in background" è impostato su NO, didFinishLaunchingWithOptions non verrà chiamato ogni volta che si apre l'app. Sarà chiamato se l'app si avvia completamente da uno stato terminato. Solo applicationDidBecomeActive verrà chiamato ogni volta che l'app si avvia dallo stato di sfondo. Non è necessario inserire il metodo di registrazione in applicationDidBecomeActive.

Caso 2: - E se nel proprio plist "L'applicazione non viene eseguita in background" è impostato su SÌ, didFinishLaunchingWithOptions verrà chiamato ogni volta che si apre l'app. puoi mettere il metodo di registrazione in didFinishLaunchingWithOptions senza alcun timore.

+0

Grazie! non sapevo che "l'applicazione non viene eseguita in background" –

+0

Non consiglierei questo approccio, ti costringerai a far sì che l'app venga avviata a freddo ogni volta che viene aperta, il che avrà un impatto significativo sulle prestazioni! – Zorayr

1

Secondo la Apple Documentation per registerForRemoteNotifications(),

Dopo successo registrazione APN, le app oggetto contatti APN solo quando il token dispositivo è cambiato; altrimenti, chiamando il metodo registerForRemoteNotifications si ottiene una chiamata all'applicazione: didRegisterForRemoteNotificationsWithDeviceToken: metodo che restituisce rapidamente il token esistente.

chiamata al metodo di registrazione non invoca una richiesta HTTP al APNS se non è necessario.

Questo StackOverflow Comment conferma questo empiricamente:

È possibile verificare ciò ponendo il telefono in modalità aereo prima di iniziare la vostra applicazione. Se ricordo correttamente, riceverai comunque una risposta con un token, perché ad un certo punto in passato il dispositivo avrà negoziato con il server Apple qual è il suo token e quel token non cambierà solo perché sei offline .

Problemi correlati