Anche con "voip" presente in "UIBackgroundModes" in "plist", l'app iOS non si avvia automaticamente dopo il riavvio del dispositivo in iOS10

Ho bisogno della mia app VoIP per l'avvio automatico dopo il riavvio del dispositivo.

I documenti Apple menzionano chiaramente che:

(========= EDIT: Questo è da documenti Apple ufficiali, per favore dai un'occhiata a questo prima di commentare o rispondere che l'App non può essere lanciata senza l'interazione dell'utente o la notifica push silenziosa. Dai anche un'occhiata al progetto Github sotto , le persone hanno verificato questo comportmento)

Valori per l'arrays UIBackgroundModes

Valore: voip Descrizione: l'app fornisce servizi Voice over IP. Le app con questa chiave vengono lanciate automaticamente dopo l'avvio del sistema in modo che l'app possa ristabilire i servizi VoIP. Le app con questo tasto possono anche riprodurre l'audio di sottofondo.

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW1

Ecco uno screenshot di Apple Docs.

Ho assicurato che: –

  1. L'app era in esecuzione quando il dispositivo era spento.
  2. VoIP è presente nella sezione plist and Capabilities .
  3. Garantito che l'app certamente non viene avviata dopo il riavvio del dispositivo aggiungendo i log in un file nel metodo main e application:didFinishLaunchingWithOptions: method.
  4. La schermata del dispositivo è sbloccata alless una volta, dopo il riavvio del dispositivo.

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

Ho anche provato ad eseguire questo esempio di GitHub App con 36 stelle per testare Boot Launch. https://github.com/lithium3141/BootLaunch
Ma anche questa App non si riavvia al riavvio quando provo sul dispositivo.

Quindi, questo mi port a pensare se qualcosa è stato cambiato di recente in iOS10 o mi manca ancora qualcosa qui?

Solutions Collecting From Web of "Anche con "voip" presente in "UIBackgroundModes" in "plist", l'app iOS non si avvia automaticamente dopo il riavvio del dispositivo in iOS10"

Ok, ho approfondito un po 'questo problema, ma prima dovrei sottolineare che non ho verificato ciò cercando effettivamente di build un progetto per questo dato che ora sarebbe troppo dispendioso per me.

Ho trovato questo (già menzionato nei commenti), questo , e soprattutto questo Q & A tecnico .

Quello che ho raccolto in particolare dai vari commenti dei tecnici Apple in quei thread, sembra che il comportmento di iOS 10 sia effettivamente cambiato. Ciò significa che lo stesso codice che si collega ai server di VoiP nelle versioni precedenti di iOS non lo farà più se colleghi la build all'ultima SDK, cioè alle librerie di iOS 10.

Ora, nel tuo caso, non hai realmente bisogno di una vera connessione VoIP, giusto? Sei interessato solo alla funzionalità "start after reboot", corretto? Alless il progetto demo che hai collegato non fa alcuna connessione setKeepAliveTimeout:handler: , il setKeepAliveTimeout:handler: metodo, ad esempio, non è nemless implementato. Sono consapevole che questo problema specifico non è discusso nei thread collegati o affrontato nel Q & A, MA:

È logico che, insieme all'integer comportmento legacy del VoIP, anche la function di riavvio svanisca. Se wheressi passare a Push-Kit VoiP, la tua app non dovrebbe essere avviata dopo un riavvio, si riavvierà non appena verrà ricevuta la notifica remota successiva (e le notifiche di VoiP avranno priorità alta, quindi non ci sarà il ritardo).

Ovviamente sto deducendo la logica dietro questa intera cosa qui e non posso garantire che Apple abbia davvero pensato in questo senso, ma ha senso: l'intera ragione per cui una (vecchia) app VoIP deve essere (ri) lanciata dopo un riavvio è stata quella aveva bisogno di fare una connessione , cioè era necessario eseguire del codice. Con le notifiche push che non sono più necessarie (il sistema operativo lo fa fondamentalmente per te dietro le quinte per get quelle notifiche), quindi ha senso che abbiano rimosso questa funzionalità insieme all'integer approccio legacy del sito.

Potresti testarlo compilando il vecchio SDK (ad esempio, usa Xcode 7 come suggerito dal Q & A) e vedi se poi rilancia. Quel funzionario di Apple ha effettivamente spiegato che il sistema operativo distingue effettivamente gli SDK di build per le app, il che è totalmente controintuitivo per me. Apparentemente in questo caso deciderebbe "hey, questa è un'app vecchia, quindi si aspetta di essere rilanciata perché il suo SDK è stato documentato in quel modo" per le app create su Xcode 7 e "Oh, questa app è nuova, quindi non Non c'è bisogno di attenersi ai vecchi modi "altrimenti. Wowsies.


TL; DR : A me sembra decisamente sì, l'SDK di iOS ha cambiato questo comportmento e ha abbandonato l'integer approccio VoiP senza notifica. La compilazione dei nuovi SDK comporterà il mancato riavvio delle app dopo il riavvio.

Per la cronaca : posso capire le persone arrabbiate in quei thread. Mentre potrebbero esserci motivi tecnici per il cambiamento, questa conseguenza specifica era tutt'altro che ovvia. Se un metodo è deprecato, ma il progetto è ancora compilato ed eseguito non mi aspetterei che un tale process fallisca in quel modo. Queste app non si bloccano, sono semplicemente "trattate in modo diverso dal sistema operativo", che non è esattamente la stessa cosa. Alless mi sarei aspettato che la documentazione fosse più chiara a riguardo nel nuovo SDK.

L'app richiamerà in background quando è in modalità terminata solo con notifica silenziosa push kit e i certificati devono essere generati per il kit push, non con la normale notifica APNS e i normali certificati di notifica push.

Dal back-end, il tuo payload deve essere così.

 $body['aps'] = arrays( 'content-available'=> 1, 'alert' => $message, 'sound' => 'default', 'badge' => 0, ); 

Una volta ottenuto il payload del pushkit, quindi pianificato la notifica locale con il file audio, la tua app verrà richiamata in background fino alla riproduzione del tuo file audio. (Max 30 secondi) Fino ad allora devi completare l'attività in background.

Si prega di riferire alcuni dettagli importnti sull'integrazione del kit push process graduale

https://github.com/hasyapanchasara/PushKit_SilentPushNotification

Ciclo di vita dell'app – quando l'app è terminata e arriva il payload del kit push

  • Prima di tutto

    didFinishLaunchingWithOptions // invocherà

  • Poi

    didReceiveIncomingPushWithPayload // viene richiamato il metodo payload

  • Quindi se hai una notifica locale

    didReceiveLocalNotification // riceve notifiche locali

  • Poi

    handleActionWithIdentifier // metodo handler se si dispone di pulsanti di azione (locali)

  • Quindi se hai una notifica remota

    didReceiveRemoteNotification // riceve la notifica remota

  • Poi

    handleActionWithIdentifier // metodo handler se si dispone di pulsanti di azione (remoto)

Nota: senza toccare l'icona dell'app o il payload del kit push ricevente, l'app non verrà mai revocata / aperta / ripristinata automaticamente. Se vuoi che la tua app sia basata su VOIP e l'app venga revocata dopo il riavvio del dispositivo. Non ansible.