Zresetuj ustawienia powiadomień push dla aplikacji

173

Rozwijam aplikację z powiadomieniami push. Aby sprawdzić wszystkie możliwe sposoby interakcji z użytkownikiem, chciałbym przetestować moją aplikację, gdy użytkownik odmówi włączenia powiadomień push dla mojej aplikacji podczas pierwszego uruchomienia.

Jednak okno dialogowe (zainicjowane przez registerForRemoteNotificationTypes) pojawia się tylko raz dla każdej aplikacji. Jak zresetować pamięć mojej aplikacji w systemie iPhone OS. Usunięcie aplikacji i ponowna instalacja nie pomaga.

hanno
źródło

Odpowiedzi:

300

Uwaga techniczna TN2265: Rozwiązywanie problemów z powiadomieniami push

Gdy aplikacja obsługująca funkcję push po raz pierwszy rejestruje się w celu otrzymywania powiadomień push, system iOS pyta użytkownika, czy chce otrzymywać powiadomienia dotyczące tej aplikacji. Gdy użytkownik odpowie na to ostrzeżenie, nie zostanie on ponownie wyświetlony, chyba że urządzenie zostanie przywrócone lub aplikacja zostanie odinstalowana przez co najmniej jeden dzień.

Jeśli chcesz zasymulować pierwsze uruchomienie aplikacji, możesz pozostawić ją odinstalowaną na jeden dzień. Możesz to osiągnąć bez czekania dnia, przestawiając zegar systemowy o jeden dzień lub więcej do przodu, całkowicie wyłączając urządzenie, a następnie włączając je ponownie.

Aktualizacja: Jak zauważono w komentarzach poniżej, to rozwiązanie przestało działać od iOS 5.1. Zachęcałbym do zgłoszenia błędu w Apple, aby mogli zaktualizować swoją dokumentację. Obecne rozwiązanie wydaje się resetować zawartość i ustawienia urządzenia.

Aktualizacja: notatka techniczna została zaktualizowana o nowe kroki, które działają poprawnie od iOS 7.

  1. Usuń aplikację z urządzenia.
  2. Całkowicie wyłącz urządzenie i włącz je ponownie.
  3. Wybierz kolejno opcje Ustawienia> Ogólne> Data i czas i ustaw datę z wyprzedzeniem co najmniej o jeden dzień.
  4. Całkowicie wyłącz urządzenie i włącz je ponownie.

AKTUALIZACJA od iOS 9

Po prostu usunięcie i ponowna instalacja aplikacji spowoduje zresetowanie stanu powiadomień do notDetermined(co oznacza, że ​​pojawią się monity).

Dzięki odpowiedzi Gomfuciusa poniżej: https://stackoverflow.com/a/33247900/704803

ianolito
źródło
16
Czy ktoś próbował tego w / iOS 5.1? Wykonałem dokładnie te kroki i nadal nie mogę zmusić urządzenia do zresetowania go ... Próbowałem nawet ustawić zegar na moim Macu przed zainstalowaniem go przez Xcode.
nrj
1
Jak wyżej ... Nie otrzymałem wezwania.
Rob
2
Firma Apple dodała nowy wymóg do wytycznych dotyczących przesyłania AppStore, który polega na wyświetlaniu monitu przez aplikację. Może to sugerować, że automatyczny monit został usunięty w iOS 5.1. Jednak nie ma interfejsu API do wysyłania zapytań do ustawień centrum powiadomień, więc i tak nie jestem pewien, jaki byłby cel tego monitu. Zobacz moją odpowiedź na podobny problem: stackoverflow.com/questions/10191006/ ...
Greg
10
To jest niedorzeczne. Czy Apple nie zdaje sobie sprawy, że programiści, a nawet użytkownicy mogą chcieć zresetować te rzeczy bez użycia naprawdę złego obejścia?
sudo
2
Kiedy próbuję tego w symulatorze, otrzymuję kod błędu = 3010 „Zdalne powiadomienia nie są obsługiwane w symulatorze”
Thomas Zimmer,
48

Innym rozwiązaniem do testowania tego jest po prostu zmiana identyfikatora pakietu. Po prostu nie zapomnij go zmienić, gdy skończysz!

capikaw
źródło
12
Czy nie musisz też tworzyć certyfikatu dla nowego identyfikatora aplikacji, aby ją przetestować?
Tony
1
To zadziała tylko wtedy, gdy korzystasz z profili aprowizacji opartych na symbolach wieloznacznych - w przeciwnym razie musisz utworzyć profil dla nowego pakietu.
Zorayr
Nawet jeśli chcesz utworzyć nowy profil, wystarczy kliknąć przycisk „Napraw to” i odczekać kilka sekund - znacznie szybciej niż przechodzenie przez wszystkie te cykle ponownego uruchamiania.
Ilya
to najszybsze rozwiązanie! U mnie działa całkiem nieźle! Zmieniając bundle_id, nie będziesz mógł podpisać aplikacji tymi samymi „profilami obsługi administracyjnej”. Ale nie martw się, w xCode (moja wersja 7.1.1) możesz kliknąć "napraw to" i to wykona zadanie. Nie zapomnij także o internetowym „Możliwości”, w którym możesz „naprawić” kilka elementów (klikając przycisk „Napraw to”), a wtedy będzie działać bardzo dobrze!
Dam Fa
Ta odpowiedź jest uzasadnioną opcją, ale wciąż jest poprawką hakerską dla głupiej sytuacji ze strony Apple. Nie modyfikuję bundleID ani nie zmieniam zegara urządzenia. Właściwie każdy programista mógłby napisać krótki kod pokazujący UIAlertView z pytaniem „Zezwalać na powiadomienia push?” .. Tak = wywołaj metodę rejestracji; No = call didFailToRegisterForRemoteNotificationsWithError (etc) .. to jest moje własne rozwiązanie, moja propozycja po przeczytaniu tego pytania i odpowiedzi. Technicznie jest to najlepszy sposób, aby uświadomić użytkownikom informacje o prywatności ... DLACZEGO push musi być włączone lub opcjonalne.
Tom Pace
36

W systemie iOS 9.0.2 za każdym razem, gdy usuwam aplikację i instaluję ją ponownie, pojawia się „alert push register”. Dotyczy to zarówno pobierania produkcyjnego AppStore, jak i trybu adhoc.

AKTUALIZACJA: Potwierdzono, że to działa na iOS 9.x.

Genki
źródło
1
Doświadczam tego samego zachowania w iOS 9.x. Poleciłbym edytować oryginalną odpowiedź, dodając AKTUALIZACJĘ:
Yevhen Dubinin
3
Wreszcie! Koniec z usuwaniem aplikacji, wyłączaniem urządzenia, przestawianiem zegara na czas do przodu i takimi głupstwami.
mkeremkeskin
19

Jak już wspomniano, podejście do resetowania stanu powiadomień dla aplikacji na urządzeniu zostało zmienione na nowszą wersję iOS5.

To działa dla mnie na iOS6:

  • Usuń aplikację z urządzenia
  • Ustaw datę i czas urządzenia co najmniej dwa dni do przodu
  • Uruchom ponownie urządzenie
  • Ustaw datę i czas urządzenia co najmniej dwa dni do przodu
  • Uruchom ponownie urządzenie
  • Zainstaluj i ponownie uruchom aplikację

Jednak spowoduje to tylko ponowne wyświetlenie początkowego monitu - nie usunie żadnych innych rzeczy związanych ze stanem wypychania.

micmdk
źródło
Pracowałem też dla mnie na ios7, musisz dwukrotnie zmienić datę raz nie działa
Nath
1
Dziękuję Ci! Działa to nawet na iOS 8 (musiałem zresetować uprawnienia push dla Twitter.app, ponieważ nie miał on ustawienia „Odznaki ikony aplikacji” w panelu preferencji w Ustawieniach).
gklka
9

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

... zawiera zarejestrowanych klientów powiadomień push. Usunięcie wpisu aplikacji spowoduje ponowne wyświetlenie monitu

Erik Johnson
źródło
11
bezużyteczna odpowiedź, jeśli tworzysz dla App Store
samvermette
20
Jeśli jest to możliwe w przypadku jailbreakerów, deweloperzy powinni mieć możliwość robienia tego na telefonie bez jailbreaka, prawda? I NIE jest to bezużyteczna odpowiedź, ponieważ nie jest to coś, co umieściłbyś w aplikacji do przesłania do sklepu. To do programistów podczas TESTOWANIA.
Oscar
1
Ten plik nie jest częścią systemu iOS 5.x.
gmogames
Zobacz zaktualizowaną odpowiedź jako część tego pytania: stackoverflow.com/questions/13021066/ ...
AriX
7

Robienie tego programowo wydaje mi się działać za każdym razem. Mam kompilację z następującą linią bez komentarzy:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Uruchamiam go za każdym razem, gdy chcę wyrejestrować się z PN. Być może będziesz musiał wyraźnie zamknąć aplikację z listy ostatnich i pobawić się z Centrum powiadomień w aplikacji Ustawienia, aby zrobić to dobrze.

Ponadto monit interfejsu użytkownika proszący użytkownika o zarejestrowanie się w programie PN może się nie pojawić. Nie wiem, czy zostało wyłączone w którejkolwiek z ostatnich wersji iOS.

dagnytaggart
źródło
Pracował dla mnie iOS 10 / iPhone 6S. Zauważ, że wyrejestrowałem się, a następnie usunąłem aplikację przed ponowną instalacją.
Gabriel Jensen
5

Jak powiedział ianolito, ustawienie daty powinno działać:

Możesz to osiągnąć bez czekania dnia, przestawiając zegar systemowy o jeden dzień lub więcej do przodu, całkowicie wyłączając urządzenie, a następnie włączając je ponownie.

Zauważyłem na swoim urządzeniu (iPhone 4, iOS 6.1.2) ustawienie zegara systemowego o jeden dzień do przodu lub nawet kilka dni nie działało . Więc ustawiłem datę do przodu o miesiąc, a potem zadziałało i moja aplikacja ponownie wyświetliła monit o powiadomienie.

Mam nadzieję, że to pomoże każdemu, może to powodować ból głowy!

Vincent Cohen
źródło
1
Nie odpowiadaj „Najnowszy system operacyjny” - to się zmienia cały czas. To zachowanie wydaje się nadal zepsute w 6.1.2, ale być może zadziałało w 6.0.1?
patr1ck
Edytowałem odpowiedź, nadal mam to w 6.1.2 tak i wcześniej w 6.0.1. U mnie działa tylko wtedy, gdy przynajmniej ustawię datę +1 miesiąc.
Vincent Cohen,
1
Słyszałem również 24-godzinną rzecz, więc spróbowałem i nie działało z 2-dniowym wyprzedzeniem. Ustaw go na 3 miesiące od teraz, a wyskakujące okienko z pozwoleniem pojawi się ponownie! Dzięki!
marcshilling
Stary post, ale cieszę się, że nadal jest pomocny! Powodzenia :)
Vincent Cohen
5

Zgadzam się z micmdk .. Miałem konfigurację środowiska programistycznego z powiadomieniami push i potrzebowałem sposobu, aby zresetować telefon, aby wyglądał jak początkowa instalacja… i tylko te dokładne kroki zadziałały dla mnie… wymaga DWÓCH ponownych uruchomień urządzenia:

Z APPLE TECH DOC:

Resetowanie alertu uprawnień do powiadomień push w systemie iOS Gdy aplikacja obsługująca funkcję push po raz pierwszy rejestruje się w celu otrzymywania powiadomień push, system iOS zapyta użytkownika, czy chce otrzymywać powiadomienia dotyczące tej aplikacji. Gdy użytkownik zareaguje na ten alert, nie zostanie on ponownie wyświetlony, chyba że urządzenie zostanie przywrócone lub aplikacja zostanie odinstalowana przez co najmniej jeden dzień.

Jeśli chcesz zasymulować pierwsze uruchomienie aplikacji, możesz pozostawić ją odinstalowaną na jeden dzień. Możesz osiągnąć to drugie bez czekania dnia, wykonując następujące kroki:

  1. Usuń aplikację z urządzenia.

  2. Całkowicie wyłącz urządzenie i włącz je ponownie.

  3. Wybierz kolejno opcje Ustawienia> Ogólne> Data i czas i ustaw datę z wyprzedzeniem co najmniej o jeden dzień.

  4. Całkowicie wyłącz urządzenie i włącz je ponownie.

lepert
źródło
Zostało to wspomniane jako niedziałające już w innej odpowiedzi.
Beau Nouvelle
Działa dobrze. To, co przestało działać w iOS 5.1, to stara wersja tej drugiej odpowiedzi, która pominęła ponowne uruchomienie między usunięciem aplikacji a ustawieniem zegara do przodu.
dgatwood
3

Zastanawiałem się nad tym w przeszłości i doszedłem do wniosku, że nie był to właściwie ważny przypadek testowy dla mojego kodu. Nie sądzę, aby kod aplikacji mógł faktycznie odróżnić kogoś, kto odrzuca powiadomienia za pierwszym razem, a później wyłącza je w ustawieniach powiadomień iPhone'a. Prawdą jest, że środowisko użytkownika jest inne, ale jest to ukryte w wywołaniu registerForRemoteNotificationTypes.

Wywołanie unregisterForRemoteNotifications nie powoduje całkowitego usunięcia aplikacji z ustawień powiadomień - chociaż usuwa zawartość ustawień dla tej aplikacji. Więc to nadal nie spowoduje, że okno dialogowe zostanie pokazane użytkownikowi po raz drugi przy następnym uruchomieniu aplikacji (przynajmniej nie w wersji 3.1.3, z którą obecnie testuję). Ale jak powiedziałem powyżej, prawdopodobnie nie powinieneś się tym martwić.

kharrison
źródło
Liczyłem na lepszą odpowiedź, ale chyba po prostu nie ma. W każdym razie dzięki!
Hanno
3

Ta sama uwaga techniczna, o której mowa w zaakceptowanej odpowiedzi ( TN2265 - Rozwiązywanie problemów z powiadomieniami push), została od tego czasu zaktualizowana o rozwiązanie dla systemu iOS 5 i nowszych.

W skrócie: za każdym razem utwórz kopię zapasową i przywróć ją z niej.

W systemie iOS 5 i nowszych zresetuj alert uprawnień do powiadomień push, przywracając urządzenie z kopii zapasowej (r. 11450187). Oto kroki, aby zrobić to skutecznie:

  1. Użyj Xcode Organizer, aby zainstalować aplikację na urządzeniu. Najważniejsze jest, aby zainstalować aplikację po raz pierwszy bez jej uruchamiania.
  2. Użyj iTunes, aby wykonać kopię zapasową urządzenia.
  3. Uruchom aplikację. Zostanie wyświetlony alert o uprawnieniach do powiadomień push.
  4. Jeśli chcesz zresetować alert uprawnień do powiadomień push, przywróć urządzenie z kopii zapasowej utworzonej w pierwszym kroku.
David Rönnqvist
źródło
Być może kiedyś to zalecał, ale już nie. Aktualnym zaleceniem jest usunięcie aplikacji, ponowne uruchomienie, przesunięcie zegara do przodu, ponowne uruchomienie, opcjonalnie ustawienie zegara z powrotem na poprawną datę i godzinę oraz uruchomienie aplikacji.
dgatwood
2

W notatce Apple Tech opisano również, że można przywrócić urządzenie, aby zresetować okno dialogowe powiadomienia push.

Nie mówi, że możesz również użyć opcji „Ogólne -> Resetuj -> Usuń całą zawartość i ustawienia” na samym urządzeniu (iOS 5.x).

Panie Zystem
źródło
1
Co jest warte: po prostu próbowałem „wymazać wszystkie ustawienia” i to nie zadziałało. Próbuję wszystkich treści i wszystkich ustawień ...
Groxx
8
„Cała zawartość i ustawienia” rzeczywiście działają, dzięki! Ale święta opcja nuklearna, Batmanie! To absolutnie szalone.
Groxx
94
Słyszałem, że zakup nowego urządzenia kasuje również ostrzeżenie o powiadomieniach push!
samvermette
Próbowałem kupić nowe urządzenie, ale to też nie zadziałało. Po przeniesieniu nowego urządzenia do paska genialnego, zdziałali trochę magii i załatwili więcej pieniędzy ... Jestem zaskoczony po tylu latach Apple nadal nie zapewnił praktycznego i prostego sposobu resetowania uprawnień push. To śmieszne
Chris
1

Oprócz odpowiedzi ianolito.

Miałem ten sam problem z aplikacją, którą pobrałem rok temu i początkowo odrzucając powiadomienia push. Chcąc odzyskać powiadomienia push, te kroki zadziałały dla mnie na iOS 7 beta. Nie mam pewności, które punkty dokładnie to spowodowały.

  • Zamknij i usuń aplikację.
  • Przejdź do ustawień iCloud i usuń aplikację z iCloud. Zrób to na wszystkich innych urządzeniach, na których masz włączoną kopię zapasową iCloud dla aplikacji. Po dezaktywacji i usunięciu wykonaj nową kopię zapasową. Aplikacja nie powinna już znajdować się na liście kopii zapasowych. (Być może dlatego uwaga techniczna od Apple opisana przez ianolito przestała działać w iOS 5, ponieważ iCloud został wprowadzony w iOS 5, a wiele z nich ma włączoną kopię zapasową iCloud dla aplikacji).
  • Przejdź do ustawień czasu i ustaw czas na więcej niż 1 miesiąc do przodu.
  • Wyłącz iPhone'a (bez resetowania).
  • Poczekaj chwilę, włącz go ponownie i ponownie pobierz aplikację.
  • Uruchom aplikację i ponownie pojawiło się okno dialogowe.
  • Włącz ponownie kopię zapasową aplikacji, ponieważ jest ona nadal dezaktywowana. Popraw czas.

Dzięki Bogu nie musiałem „Wymazywać całej zawartości i ustawień”. Może to komuś pomoże.

Masa
źródło
1

Niedawno napotkałem podobny problem z aplikacją React-Native. Wersja systemu iPhone OS to 13.1 Odinstalowałem aplikację i próbowałem ją zainstalować, ale zauważyłem, że zarówno uprawnienia do lokalizacji, jak i powiadomienia nie były wyświetlane.

Po sprawdzeniu ustawień mogłem zobaczyć, że moja aplikacja ma włączoną lokalizację (z poprzedniej instalacji), jednak w powiadomieniu nie było odpowiedniego wpisu. Próbowano odinstalować i ponownie uruchomić bez ustawiania czasu, nie działało. Przy okazji, próbowałem też pobrać aplikację Appstore, nadal to samo zachowanie.

Problem został rozwiązany dopiero po ustawieniu czasu urządzenia.

RUppal
źródło
0

Po wielu godzinach poszukiwań i bez powodzenia z powyższymi sugestiami, działało to jak urok dla 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
        }

    }
Felecia Genet
źródło