Ripristina le impostazioni di notifica push per l'app


173

Sto sviluppando un'app con notifiche push. Per verificare tutti i modi possibili di interazione dell'utente, vorrei testare la mia app quando un utente rifiuta di avere le notifiche push abilitate per la mia app al primo avvio.

La finestra di dialogo (avviata da registerForRemoteNotificationTypes), tuttavia, viene visualizzata una sola volta per app. Come posso ripristinare la memoria del mio sistema operativo iPhone della mia app. L'eliminazione dell'app e la reinstallazione non aiutano.

Risposte:


300

Nota tecnica TN2265: risoluzione dei problemi relativi alle notifiche push

La prima volta che un'app abilitata per push registra le notifiche push, iOS chiede all'utente se desidera ricevere notifiche per quell'app. Una volta che l'utente ha risposto a questo avviso, questo non viene più visualizzato a meno che il dispositivo non venga ripristinato o l'app non sia stata disinstallata per almeno un giorno.

Se desideri simulare una prima esecuzione della tua app, puoi lasciarla disinstallata per un giorno. È possibile ottenere quest'ultimo senza effettivamente attendere un giorno impostando l'orologio di sistema in avanti di un giorno o più, spegnendo completamente il dispositivo e riaccendendolo.

Aggiornamento: come notato nei commenti qui sotto, questa soluzione ha smesso di funzionare da iOS 5.1. Vorrei incoraggiare la presentazione di un bug con Apple in modo che possano aggiornare la loro documentazione. La soluzione attuale sembra reimpostare il contenuto e le impostazioni del dispositivo.

Aggiornamento: la nota tecnica è stata aggiornata con nuovi passaggi che funzionano correttamente a partire da iOS 7.

  1. Elimina la tua app dal dispositivo.
  2. Spegni completamente il dispositivo e riaccendilo.
  3. Vai su Impostazioni> Generali> Data e ora e imposta la data anticipata di un giorno o più.
  4. Spegni di nuovo completamente il dispositivo e riaccendilo.

AGGIORNAMENTO a partire da iOS 9

La semplice eliminazione e reinstallazione dell'app reimposterà lo stato di notifica su notDetermined(il che significa che verranno visualizzati i prompt).

Grazie alla risposta di Gomfucius di seguito: https://stackoverflow.com/a/33247900/704803


16
Qualcuno ha provato questo w / iOS 5.1? Ho seguito esattamente questi passaggi e non riesco ancora a ripristinare il dispositivo ... Ho anche provato a impostare l'orologio sul mio Mac in avanti prima di installarlo tramite Xcode.
nrj

1
Idem ... Non ho ricevuto una richiesta.
Rob

2
Apple ha aggiunto un nuovo requisito alle linee guida per l'invio di AppStore, che si basa sull'applicazione per mostrare il prompt. Ciò può suggerire che il prompt automatico è stato rimosso in iOS 5.1. Tuttavia, non esiste un'API per eseguire query sulle impostazioni del centro di notifica, quindi non è sicuro di quale sarebbe lo scopo del prompt. Vedi la mia risposta a un problema simile: stackoverflow.com/questions/10191006/…
Greg

10
Questo è ridicolo. Apple non si rende conto che gli sviluppatori o persino gli utenti potrebbero voler reimpostare queste cose senza usare una soluzione davvero negativa?
sudo,

2
Quando provo questo nel simulatore, visualizzo l'errore Code = 3010 "Le notifiche remote non sono supportate nel simulatore"
Thomas Zimmer,

48

Un altro solo per testare la soluzione a questo è semplicemente cambiando il tuo ID bundle. Basta non dimenticare di cambiarlo una volta finito!


12
Non è inoltre necessario creare un certificato per il nuovo ID app per testarlo?
Tony,

1
Funzionerebbe solo se utilizzi profili di provisioning basati su caratteri jolly, altrimenti dovrai creare un profilo per il nuovo pacchetto.
Zorayr,

Anche se è necessario creare un nuovo profilo, è sufficiente fare clic sul pulsante "Risolvi" e attendere alcuni secondi, molto più velocemente rispetto a tutti quei cicli di riavvio.
Ilya,

questa è la soluzione più veloce! Funziona abbastanza bene per me! Quando modifichi bundle_id non sarai in grado di firmare l'app con gli stessi "profili di provisioning". Ma non preoccuparti, in xCode (la mia versione 7.1.1), puoi fare clic su "risolvilo" e fare il lavoro. Inoltre, non dimenticare l'onglet "Funzionalità", dove puoi avere diversi elementi da "riparare" (facendo clic sul pulsante "correggi") e quindi funzionerà molto bene!
Dam Fa

Questa risposta è un'opzione legittima ma ancora una correzione di hack per una situazione folle di Apple. Non sto modificando bundleID, né cambiando l'orologio del dispositivo. Altrettanto appropriato, qualsiasi sviluppatore potrebbe scrivere un codice breve che mostra un UIAlertView che chiede "Consenti notifiche push?" .. Sì = chiama il metodo di registrazione; No = chiama didFailToRegisterForRemoteNotificationsWithError (ecc) .. questa è la mia soluzione, il mio take-away dopo aver letto queste domande e risposte. Tecnicamente, è il modo migliore per fornire agli utenti la consapevolezza delle informazioni sulla privacy ... PERCHÉ il push deve essere abilitato o facoltativo.
Tom Pace,

36

Su iOS 9.0.2, ricevo l '"avviso di notifica push push" ogni volta che elimino l'app e la reinstallo. Questo vale sia per i download di produzione AppStore che per la modalità ad hoc.

AGGIORNAMENTO: è confermato che funziona per iOS 9.x


1
Provo lo stesso comportamento per iOS 9.x. Ti consiglierei di modificare la risposta originale aggiungendo un AGGIORNAMENTO:
Yevhen Dubinin,

3
Finalmente! Non è più necessario eliminare l'app, spegnere il dispositivo, impostare l'orologio su un orario di andata e alcune cose stupide come questa.
mkeremkeskin,

19

Come già notato l'approccio per ripristinare lo stato di notifica per un'app su un dispositivo è cambiato per iOS5 una versione più recente.

Questo funziona per me su iOS6:

  • Rimuovi l'app dal dispositivo
  • Imposta il datetime del dispositivo con almeno due giorni di anticipo
  • Riavvia il dispositivo
  • Imposta il datetime del dispositivo con almeno due giorni di anticipo
  • Riavvia il dispositivo
  • Installa ed esegui di nuovo l'app

Tuttavia, ciò farà apparire di nuovo solo il prompt iniziale, non rimuoverà nessun altro elemento relativo allo stato push.


Ha funzionato anche per me su iOS7, è necessario modificare due volte la data una volta non funziona
Nath

1
Grazie! Funziona anche su iOS 8 (ho dovuto ripristinare le autorizzazioni push per Twitter.app, perché non aveva l'impostazione "Badge icona app" nel riquadro delle preferenze nelle Impostazioni).
gklka,

9

The plist: /private/var/mobile/Library/RemoteNotification/Clients.plist

... contiene i client registrati per le notifiche push. La rimozione della voce della tua app farà riapparire il messaggio


11
risposta inutile se sviluppi per l'App Store
samvermette,

20
Se questo è possibile per i jailbreaker, dovrebbe essere possibile per gli sviluppatori fare un telefono senza jailbreak, giusto? E NON è una risposta inutile, perché questo non è qualcosa che avresti inserito in un'app per l'invio allo store. Spetta agli sviluppatori fare DURANTE IL TEST.
Oscar

1
Questo file non fa parte di iOS 5.x.
gmogames,

Vedere una risposta aggiornata come parte di questa domanda: stackoverflow.com/questions/13021066/...
Arix

7

Farlo programmaticamente sembra funzionare per me ogni volta. Ho una build con la seguente riga senza commenti:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Lo eseguo ogni volta che voglio annullare la registrazione da PN. Potrebbe essere necessario terminare esplicitamente l'app dall'elenco dei recenti e giocare con il Centro notifiche nell'app Impostazioni per farlo correttamente.

Inoltre, il prompt dell'interfaccia utente che chiede all'utente di registrarsi per PN potrebbe non essere visualizzato. Non sono sicuro se è stato disabilitato in una delle versioni iOS recenti.


Ha funzionato per me iOS 10 / iPhone 6S. Nota che ho annullato la registrazione, quindi ho eliminato l'app prima di reinstallare.
Gabriel Jensen,

5

Come ha detto ianolito, l'impostazione della data dovrebbe funzionare:

È possibile ottenere quest'ultimo senza effettivamente attendere un giorno impostando l'orologio di sistema in avanti di un giorno o più, spegnendo completamente il dispositivo e riaccendendolo.

Ho notato sul mio dispositivo (iPhone 4, iOS 6.1.2) l'impostazione dell'orologio di sistema un giorno in avanti o anche pochi giorni non ha funzionato per me. Quindi ho impostato la data in avanti di un mese e poi ha funzionato e la mia applicazione ha mostrato di nuovo il prompt delle notifiche.

Spero che questo aiuti a chiunque, può essere una specie di mal di testa!


1
Per favore, non rispondere con "Ultimo sistema operativo": cambia continuamente. Questo comportamento appare ancora rotto in 6.1.2, ma forse ha funzionato in 6.0.1?
patr1ck,

Modificata la risposta, questa è ancora presente in 6.1.2 sì e prima anche in 6.0.1. Funziona solo se imposto almeno la data +1 mese.
Vincent Cohen,

1
Avevo anche sentito la cosa delle 24 ore, quindi l'ho provata e non ha funzionato con 2 giorni di anticipo. Impostalo tra 3 mesi e il popup di autorizzazione apparirà di nuovo! Grazie!
marcshilling

Vecchio post ma felice di vederlo è ancora di aiuto! Buona fortuna :)
Vincent Cohen,

5

Sono d'accordo con micmdk .. Avevo un ambiente di sviluppo configurato con Notifiche push e avevo bisogno di un modo per ripristinare il mio telefono per sembrare un'installazione iniziale ... e solo questi passaggi precisi hanno funzionato per me ... richiede DUE riavvii del dispositivo:

Da APPLE TECH DOC:

Reimpostazione dell'avviso di autorizzazione delle notifiche push su iOS La prima volta che un'app abilitata al push registra le notifiche push, iOS chiede all'utente se desidera ricevere notifiche per quell'app. Una volta che l'utente ha risposto a questo avviso, questo non viene più visualizzato a meno che il dispositivo non venga ripristinato o l'app non sia stata disinstallata per almeno un giorno.

Se desideri simulare una prima esecuzione della tua app, puoi lasciarla disinstallata per un giorno. È possibile ottenere quest'ultimo senza effettivamente attendere un giorno seguendo questi passaggi:

  1. Elimina la tua app dal dispositivo.

  2. Spegni completamente il dispositivo e riaccendilo.

  3. Vai su Impostazioni> Generali> Data e ora e imposta la data anticipata di un giorno o più.

  4. Spegni di nuovo completamente il dispositivo e riaccendilo.


Questo è stato menzionato come non funziona più in un'altra risposta.
Beau Nouvelle,

Funziona benissimo. Ciò che ha smesso di funzionare in iOS 5.1 è stata la vecchia versione di quell'altra risposta, che ha escluso il riavvio tra l'eliminazione dell'app e l'impostazione dell'orologio.
dgatwood,

3

Mi sono chiesto a questo proposito in passato e sono giunto alla conclusione che in realtà non era un caso di prova valido per il mio codice. Non credo che il tuo codice dell'applicazione possa effettivamente dire la differenza tra qualcuno che rifiuta le notifiche la prima volta o successivamente disabilitandolo dalle impostazioni di notifica di iPhone. È vero che l'esperienza dell'utente è diversa ma che è nascosta all'interno della chiamata a registerForRemoteNotificationTypes.

La chiamata a unregisterForRemoteNotifications non rimuove completamente l'applicazione dalle impostazioni delle notifiche, sebbene rimuova il contenuto delle impostazioni per quell'applicazione. Quindi, ciò non farà sì che la finestra di dialogo venga presentata una seconda volta all'utente la prossima volta che viene eseguita l'app (almeno non sulla v3.1.3 con cui sto attualmente testando). Ma come ho detto sopra, probabilmente non dovresti preoccuparti di questo.


Speravo in una risposta migliore, ma immagino che non ce ne sia una. Grazie comunque!
Hanno il

3

La stessa nota tecnica a cui si fa riferimento nella risposta accettata ( TN2265 - Risoluzione dei problemi relativi alle notifiche push) è stata successivamente aggiornata con una soluzione per iOS 5 e successive.

In breve: crea un backup e ripristina da esso ogni volta.

Su iOS 5 e versioni successive, reimpostare l'avviso sulle autorizzazioni delle notifiche push ripristinando il dispositivo da un backup (r. 11450187). Ecco i passaggi per farlo in modo efficiente:

  1. Utilizzare Xcode Organizer per installare l'app sul dispositivo. La chiave è installare l'app per la prima volta senza eseguirla.
  2. Usa iTunes per eseguire il backup del dispositivo.
  3. Esegui l'app. Verrà presentato l'avviso sulle autorizzazioni delle notifiche push.
  4. Quando si desidera reimpostare l'avviso sulle autorizzazioni delle notifiche push, ripristinare il dispositivo dal backup creato nel primo passaggio.

Potrebbe averlo raccomandato una volta, ma non lo fa più. La raccomandazione attuale è di eliminare l'app, riavviare, impostare l'orologio in avanti, riavviare, facoltativamente reimpostare l'orologio sulla data e l'ora corrette ed eseguire l'app.
dgatwood,

2

La nota tecnica Apple ha inoltre descritto che è possibile ripristinare il dispositivo per ripristinare la finestra di dialogo Notifica push.

Non dice che puoi anche usare l'opzione "Generale -> Ripristina -> Cancella tutto il contenuto e le impostazioni" sul dispositivo stesso (iOS 5.x).


1
Per quello che vale: ho appena provato a "cancellare tutte le impostazioni" e non ha funzionato. Prova di tutto il contenuto e tutte le impostazioni ...
Groxx,

8
E "tutto il contenuto e le impostazioni" funziona davvero, grazie! Ma santa opzione nucleare, Batman! È assolutamente folle.
Groxx,

94
Ho sentito che l'acquisto di un nuovo dispositivo cancella anche l'avviso di notifica push!
samvermette,

Ho provato ad acquistare un nuovo dispositivo, ma neanche quello ha funzionato. Dopo aver portato il nuovo dispositivo alla barra del genio, hanno funzionato un po 'di magia e si sono riparati per più soldi ... Sono sorpreso dopo tanti anni che Apple non ha ancora fornito un modo pratico e semplice per ripristinare le autorizzazioni push. È ridicolo
Chris,

1

Oltre alla risposta di ianolito.

Ho avuto lo stesso problema con un'app che ho scaricato un anno fa e che inizialmente avevo negato la notifica push. Ora, volendo indietro le notifiche push, questi passaggi hanno funzionato per me su iOS 7 beta. Non sono sicuro di quale punto (i) lo abbia attivato esattamente.

  • Chiudi ed elimina l'app.
  • Vai alle impostazioni di iCloud ed elimina l'app da iCloud. Fallo su tutti gli altri dispositivi in ​​cui hai abilitato il backup iCloud per le app. Dopo aver disattivato ed eliminato fare un nuovo backup. L'app non dovrebbe più essere elencata sotto i backup. (Questo è forse il motivo per cui la nota tecnica di Apple descritta da ianolito ha smesso di funzionare in iOS 5, da quando iCloud è stato introdotto in iOS 5 e molti hanno il backup iCloud per le app abilitato.)
  • Vai alle impostazioni dell'ora e imposta l'ora con più di 1 mese di anticipo.
  • Spegni l'iPhone (nessun ripristino).
  • Attendi un minuto, riaccendilo e scarica nuovamente l'app.
  • Avvia l'app e mi è stata nuovamente presentata la finestra di dialogo.
  • Abilita di nuovo il backup dell'app, poiché è ancora disattivato. Correggere l'ora.

Grazie a Dio non ho dovuto "Cancella tutto il contenuto e le impostazioni". Forse aiuterà qualcuno.


1

Di recente ho riscontrato un problema simile con l'applicazione di reazione nativa. La versione del sistema operativo iPhone era 13.1. Ho disinstallato l'applicazione e ho provato a installare l'app e ho notato che non sono stati richiesti permessi di posizione e di notifica.

Al controllo delle impostazioni, ho potuto vedere che la mia applicazione era abilitata per la posizione (dall'installazione precedente) ma non c'era alcuna voce corrispondente contro la notifica Provato a disinstallare e riavviare senza impostare l'ora, non ha funzionato. A proposito, ho anche provato a scaricare l'app Appstore, sempre con lo stesso comportamento.

Il problema è stato risolto solo dopo aver impostato l'ora del dispositivo.


0

Dopo ore di ricerca e nessuna fortuna con i suggerimenti sopra, questo ha funzionato come un incantesimo per 3.x +

override func viewDidLoad() {
        super.viewDidLoad()


            requestAuthorization()

}

func requestAuthorization() {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
                print("Access granted: \(granted.description)")
            }

        } else {
            // Fallback on earlier versions
        }

    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.