Szukam sposobu, aby ustalić, czy użytkownik w ustawieniach włączył lub wyłączył powiadomienia push dla mojej aplikacji.
207
Szukam sposobu, aby ustalić, czy użytkownik w ustawieniach włączył lub wyłączył powiadomienia push dla mojej aplikacji.
Zadzwoń enabledRemoteNotificationsTypes
i sprawdź maskę.
Na przykład:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 i nowszy:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
i wyższych jest złe, ponieważ sprawdza tylko, czy użytkownik zarejestrował się na zdalne powiadomienie. Zgodnie z dokumentacją:This method reflects only the successful completion of the remote registration process that begins when you call the registerForRemoteNotifications method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications.
[[UIApplication sharedApplication] currentUserNotificationSettings];
problem quantumpotato:
Gdzie
types
podano przezmożna użyć
zamiast
pozwoli ci sprawdzić tylko, czy powiadomienia są włączone (i nie martw się dźwiękami, odznakami, centrum powiadomień itp.). Pierwszy wiersz kodu (
types & UIRemoteNotificationTypeAlert
) powróci,YES
jeśli „Alarm Style” jest ustawiony na „Banery” lub „Alarmy” iNO
jeśli „Alarm Style” jest ustawiony na „Brak”, niezależnie od innych ustawień.źródło
grantedSettings.types.contains(notificationType)
W najnowszej wersji iOS ta metoda jest obecnie przestarzała. Aby obsługiwać zarówno iOS 7, jak i iOS 8 użyj:
źródło
UserNotifications
. Niestety nie mam teraz pełnej odpowiedzi.Zaktualizowany kod dla swift4.0, iOS11
Kod dla swift3.0, iOS10
źródło
Poniżej znajdziesz pełny przykład, który obejmuje zarówno iOS8, jak i iOS7 (i niższe wersje). Należy pamiętać, że przed systemów iOS 8 nie można odróżnić „zdalnych powiadomień niepełnosprawnych” i „tylko View w lockscreen włączoną”.
źródło
Swift 3+
Wersja obserwowalna RxSwift na iOS10 +:
źródło
getNotificationSettings(...)
jest asynchroniczny, więc powrót do środka zostanie zignorowanyPróbując obsługiwać zarówno iOS8, jak i starsze, nie miałem szczęścia, używając
isRegisteredForRemoteNotifications
Kevina. Zamiast tego użyłemcurrentUserNotificationSettings
, co działało świetnie w moich testach.źródło
isEnabled = NO;
w twoichif
przypadkach nie jest potrzebny, ponieważ został zainicjowany jakoNO
Niestety żadne z tych rozwiązań nie rozwiązało problemu, ponieważ na koniec dnia interfejsów API poważnie brakuje, jeśli chodzi o dostarczanie odpowiednich informacji. Możesz zrobić kilka domysłów, jednak użycie
currentUserNotificationSettings
(iOS8 +) po prostu nie jest wystarczające w obecnej formie, aby naprawdę odpowiedzieć na pytanie. Chociaż wiele rozwiązań tutaj sugeruje, że albo to alboisRegisteredForRemoteNotifications
raczej ostateczna odpowiedź, tak naprawdę nie jest.Rozważ to:
z
isRegisteredForRemoteNotifications
dokumentacją stwierdza:Jeśli jednak rzucisz po prostu
NSLog
delegata aplikacji, aby obserwować zachowanie, jasne jest, że nie zachowuje się tak, jak się spodziewamy. Odnosi się to bezpośrednio do aktywacji zdalnych powiadomień dla tej aplikacji / urządzenia. Raz aktywowane po raz pierwszy, zawsze wróciYES
. Nawet wyłączenie ich w ustawieniach (powiadomieniach) nadal spowoduje ich zwrócenie.YES
Dzieje się tak, ponieważ od iOS8 aplikacja może rejestrować się w celu otrzymywania powiadomień zdalnych, a nawet wysyłać je na urządzenie bez włączonego powiadomienia użytkownika, po prostu nie może generować alertów, Odznaki i dźwięk bez włączania go przez użytkownika. Ciche powiadomienia są dobrym przykładem czegoś, co możesz robić nawet po wyłączeniu powiadomień.O ile
currentUserNotificationSettings
wskazuje na jedną z czterech rzeczy:Alerty są włączone Odznaki są włączone Dźwięk jest włączony Żadne nie są włączone.
Nie daje to absolutnie żadnych wskazówek na temat innych czynników ani samego przełącznika powiadomień.
Użytkownik może w rzeczywistości wyłączyć odznaki, dźwięk i alerty, ale nadal może wyświetlać się na ekranie blokady lub w centrum powiadomień. Ten użytkownik powinien nadal otrzymywać powiadomienia wypychane i widzieć je zarówno na ekranie blokady, jak iw centrum powiadomień. Mają włączoną funkcję powiadomień. ALE
currentUserNotificationSettings
wróci:UIUserNotificationTypeNone
w takim przypadku. Nie świadczy to o rzeczywistych ustawieniach użytkowników.Można zgadnąć kilka przypuszczeń:
isRegisteredForRemoteNotifications
takNO
, możesz założyć, że to urządzenie nigdy nie zarejestrowało się pomyślnie dla zdalnych powiadomień.application:didRegisterUserNotificationSettings:
w tym momencie oddzwonienie zawierające ustawienia powiadomień użytkownika, ponieważ jest to pierwsza rejestracja użytkownika, ustawienia powinny wskazywać to, co użytkownik wybrał w ramach żądania zezwolenia. Jeśli ustawienia są równe czemuś innemu niż:UIUserNotificationTypeNone
to zezwolenie push zostało udzielone, w przeciwnym razie zostało odrzucone. Powodem tego jest to, że od momentu rozpoczęcia procesu zdalnej rejestracji użytkownik może jedynie zaakceptować lub odrzucić, przy czym początkowe ustawienia akceptacji są ustawieniami ustawionymi podczas procesu rejestracji.źródło
Aby uzyskać odpowiedź, może działać mniej więcej tak ...
edycja: To nie w porządku. ponieważ są to rzeczy nieco bitowe, nie będzie działać z przełącznikiem, więc przestałem używać:
źródło
Na iOS7 i wcześniej powinieneś rzeczywiście użyć
enabledRemoteNotificationTypes
i sprawdzić, czy jest równy (lub nie jest równy w zależności od tego, czego chcesz)UIRemoteNotificationTypeNone
.Jednak w przypadku iOS8 nie zawsze wystarczy sprawdzić tylko
isRegisteredForRemoteNotifications
tyle stanów powyżej. Powinieneś również sprawdzić, czyapplication.currentUserNotificationSettings.types
jest równy (lub nie jest równy w zależności od tego, czego chcesz)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
może zwrócić wartość true, mimo żecurrentUserNotificationSettings.types
zwracaUIUserNotificationTypeNone
.źródło
źródło
Tutaj otrzymujemy UIRemoteNotificationType od UIApplication. Reprezentuje stan powiadomienia wypychanego tej aplikacji w ustawieniu, niż można łatwo sprawdzić jej typ
źródło
Staram się wspierać system iOS 10 i nowsze wersje za pomocą rozwiązania dostarczonego przez @Shaheen Ghiassy, ale znajduję problem z deprywacją
enabledRemoteNotificationTypes
. Tak więc rozwiązanie, które znalazłem,isRegisteredForRemoteNotifications
zamiast tego,enabledRemoteNotificationTypes
które jest przestarzałe w iOS 8. Poniżej znajduje się moje zaktualizowane rozwiązanie, które działało idealnie dla mnie:Możemy łatwo wywołać tę funkcję i uzyskać dostęp do jej
Bool
wartości, a następnie przekonwertować ją na wartość ciągu:Mam nadzieję, że pomoże to również innym :) Szczęśliwego kodowania.
źródło
Chociaż odpowiedź Zac była całkowicie poprawna do iOS 7, zmieniła się od czasu pojawienia się iOS 8. Ponieważ enabledRemoteNotificationTypes został wycofany z iOS 8 i późniejszych. W systemie iOS 8 i nowszych musisz użyć isRegisteredForRemoteNotifications .
źródło
To rozwiązanie Swifty działało dobrze dla mnie ( iOS8 + ),
Metoda :
Zastosowanie :
Nr ref
źródło
re:
to jest poprawne
ale przestrzeganie również jest poprawne! (ponieważ UIRemoteNotificationTypeNone ma wartość 0)
patrz poniżej
źródło
Oto jak to zrobić w Xamarin.ios.
Jeśli wspierasz iOS 10+, korzystaj tylko z metody UNUserNotificationCenter.
źródło
W Xamarin wszystkie powyższe rozwiązania nie działają dla mnie. Właśnie tego używam:
Otrzymuje aktualizację na żywo także po zmianie statusu powiadomienia w Ustawieniach.
źródło
Pełny łatwy kod do kopiowania i wklejania zbudowany z rozwiązania @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002 )
Spowoduje to również przejście użytkownika do ustawień aplikacji i umożliwi mu natychmiastowe włączenie
Dodałem również w rozwiązaniu do sprawdzania, czy usługi lokalizacyjne są włączone (i doprowadzają również do ustawień)
GLHF!
źródło