Ich suche nach einer Möglichkeit, um festzustellen, ob der Benutzer über Einstellungen seine Push-Benachrichtigungen für meine Anwendung aktiviert oder deaktiviert hat.
207
Ich suche nach einer Möglichkeit, um festzustellen, ob der Benutzer über Einstellungen seine Push-Benachrichtigungen für meine Anwendung aktiviert oder deaktiviert hat.
Rufen Sie an enabledRemoteNotificationsTypes
und überprüfen Sie die Maske.
Beispielsweise:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 und höher:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
und höher ist falsch, da nur geprüft wird, ob der Benutzer für die Remote-Benachrichtigung registriert ist. Laut Dokumentation: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];
Quantumpotatos Ausgabe:
Wo
types
ist gegeben durchman kann verwenden
anstatt
Hier können Sie nur überprüfen, ob Benachrichtigungen aktiviert sind (und sich keine Gedanken über Sounds, Abzeichen, Benachrichtigungscenter usw. machen). Die erste Codezeile (
types & UIRemoteNotificationTypeAlert
) wird zurückgegeben,YES
wenn "Warnstil" auf "Banner" oder "Warnungen" eingestellt ist undNO
wenn "Warnstil" unabhängig von anderen Einstellungen auf "Keine" eingestellt ist.quelle
grantedSettings.types.contains(notificationType)
In der neuesten Version von iOS ist diese Methode jetzt veraltet. Um sowohl iOS 7 als auch iOS 8 zu unterstützen, verwenden Sie:
quelle
UserNotifications
. Leider habe ich jetzt keine vollständige Antwort.Aktualisierter Code für swift4.0, iOS11
Code für swift3.0, iOS10
quelle
Unten finden Sie ein vollständiges Beispiel, das sowohl iOS8 als auch iOS7 (und niedrigere Versionen) abdeckt. Bitte beachten Sie, dass Sie vor iOS8 nicht zwischen "Remote-Benachrichtigungen deaktiviert" und "Nur im Sperrbildschirm anzeigen aktiviert" unterscheiden können.
quelle
Swift 3+
RxSwift Observable Version für iOS10 +:
quelle
getNotificationSettings(...)
ist asynchron, so dass die Rückkehr im Inneren ignoriert wirdBei dem Versuch, sowohl iOS8 als auch niedriger zu unterstützen, hatte ich nicht viel Glück damit,
isRegisteredForRemoteNotifications
wie Kevin vorgeschlagen hatte. Stattdessen habe ich verwendetcurrentUserNotificationSettings
, was bei meinen Tests großartig funktioniert hat.quelle
isEnabled = NO;
In Ihrenif
Fällen wird er nicht benötigt, da er alsNO
Leider lieferte keine dieser Lösungen löst das Problem wirklich , da letztendlich die APIs ernsthaft fehlen, wenn es um die Bereitstellung der relevanten Informationen geht. Sie können ein paar Vermutungen
currentUserNotificationSettings
anstellen, aber die Verwendung von (iOS8 +) reicht in der aktuellen Form einfach nicht aus, um die Frage wirklich zu beantworten. Obwohl viele der Lösungen hier darauf hindeuten, dass dies entwederisRegisteredForRemoteNotifications
eine endgültige Antwort ist oder eher eine endgültige Antwort ist, ist dies wirklich nicht der Fall.Bedenken Sie:
mit
isRegisteredForRemoteNotifications
Dokumentationszuständen:Wenn Sie jedoch einen einfachen
NSLog
in Ihren App-Delegaten werfen , um das Verhalten zu beobachten, ist klar, dass sich dies nicht so verhält, wie wir es erwarten. Es bezieht sich tatsächlich direkt auf Remote-Benachrichtigungen, die für diese App / dieses Gerät aktiviert wurden. Einmal aktiviert, kehrt dies immer zurückYES
. Selbst wenn Sie sie in den Einstellungen (Benachrichtigungen) deaktivieren, wird diese zurückgegebenYES
deaktiviert werden, Dies liegt daran, dass sich eine App ab iOS8 möglicherweise für Remote-Benachrichtigungen registriert und sogar an ein Gerät sendet, ohne dass der Benutzer Benachrichtigungen aktiviert hat. Sie führt möglicherweise keine Warnungen aus. Abzeichen und Sound, ohne dass der Benutzer dies einschaltet. Stille Benachrichtigungen sind ein gutes Beispiel für etwas, das Sie möglicherweise auch bei deaktivierten Benachrichtigungen weiterhin tun.So weit wie
currentUserNotificationSettings
es eines von vier Dingen anzeigt:Warnungen sind eingeschaltet Abzeichen sind eingeschaltet Ton ist eingeschaltet Keine sind eingeschaltet.
Dies gibt Ihnen keinerlei Hinweis auf die anderen Faktoren oder den Benachrichtigungsschalter selbst.
Ein Benutzer kann tatsächlich Ausweise, Ton und Warnungen ausschalten, die Anzeige jedoch weiterhin auf dem Sperrbildschirm oder im Benachrichtigungscenter anzeigen. Dieser Benutzer sollte weiterhin Push-Benachrichtigungen erhalten und diese sowohl auf dem Sperrbildschirm als auch im Benachrichtigungscenter sehen können. Sie haben den Benachrichtigungsschalter eingeschaltet. ABER
currentUserNotificationSettings
wird zurückkehren:UIUserNotificationTypeNone
in diesem Fall. Dies ist kein wirklicher Hinweis auf die tatsächlichen Einstellungen des Benutzers.Ein paar Vermutungen kann man machen:
isRegisteredForRemoteNotifications
istNO
, dann können Sie davon ausgehen , dass dieses Gerät für Remote - Benachrichtigungen nie erfolgreich registriert hat.application:didRegisterUserNotificationSettings:
erfolgt zu diesem Zeitpunkt ein Rückruf mit Einstellungen für Benutzerbenachrichtigungen, da dies das erste Mal ist, dass ein Benutzer registriert wurde. In den Einstellungen sollte angegeben werden, was der Benutzer im Hinblick auf die Berechtigungsanforderung ausgewählt hat. Wenn die Einstellungen etwas anderem entsprechen alsUIUserNotificationTypeNone
:, wurde die Push-Berechtigung erteilt, andernfalls wurde sie abgelehnt. Der Grund dafür ist, dass der Benutzer von dem Moment an, in dem Sie mit dem Fernregistrierungsprozess beginnen, nur die Möglichkeit hat, zu akzeptieren oder abzulehnen, wobei die anfänglichen Einstellungen einer Akzeptanz die Einstellungen sind, die Sie während des Registrierungsprozesses vorgenommen haben.quelle
Um die Antwort zu vervollständigen, könnte es so etwas funktionieren ...
bearbeiten: Das ist nicht richtig. Da es sich um bitweise Dinge handelt, funktioniert es nicht mit einem Schalter, daher habe ich Folgendes verwendet:
quelle
Für iOS7 und früher sollten Sie in der Tat verwenden
enabledRemoteNotificationTypes
und prüfen, ob es gleich ist (oder nicht, je nachdem, was Sie wollen)UIRemoteNotificationTypeNone
.Für iOS8 reicht es jedoch nicht immer aus, nur mit
isRegisteredForRemoteNotifications
so vielen Status wie oben zu überprüfen . Sie sollten auch prüfen, obapplication.currentUserNotificationSettings.types
gleich (oder nicht gleich, je nachdem, was Sie wollen)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
könnte return true obwohlcurrentUserNotificationSettings.types
RenditenUIUserNotificationTypeNone
.quelle
quelle
Hier erhalten wir den UIRemoteNotificationType von UIApplication. Es stellt den Status der Push-Benachrichtigung dieser App in der Einstellung dar, als Sie ihren Typ leicht überprüfen können
quelle
Ich versuche, iOS 10 und höher mit der von @Shaheen Ghiassy bereitgestellten Lösung zu unterstützen, finde aber ein Problem mit dem Entzug
enabledRemoteNotificationTypes
. Die Lösung, die ich finde,isRegisteredForRemoteNotifications
anstattenabledRemoteNotificationTypes
sie in iOS 8 zu verwenden, ist veraltet. Nachfolgend ist meine aktualisierte Lösung aufgeführt, die für mich perfekt funktioniert hat:Und wir können diese Funktion einfach aufrufen und auf ihren
Bool
Wert zugreifen und sie dadurch in den Zeichenfolgenwert konvertieren:Hoffe, es wird auch anderen helfen :) Viel Spaß beim Codieren.
quelle
Obwohl Zacs Antwort bis iOS 7 vollkommen richtig war, hat sie sich seit der Ankunft von iOS 8 geändert. Weil enabledRemoteNotificationTypes ab iOS 8 veraltet ist. Für iOS 8 und höher müssen Sie isRegisteredForRemoteNotifications verwenden .
quelle
Diese Swifty- Lösung hat bei mir gut funktioniert ( iOS8 + ),
Methode :
Verwendung :
Ref
quelle
Re:
das ist richtig
aber folgendes ist auch richtig! (da UIRemoteNotificationTypeNone 0 ist)
siehe folgendes
quelle
So geht's in Xamarin.ios.
Wenn Sie iOS 10+ unterstützen, verwenden Sie nur die UNUserNotificationCenter-Methode.
quelle
In Xamarin funktioniert die oben genannte Lösung bei mir nicht. Dies ist, was ich stattdessen benutze:
Es wird auch live aktualisiert, nachdem Sie den Benachrichtigungsstatus in den Einstellungen geändert haben.
quelle
Vollständiger einfacher Code zum Kopieren und Einfügen, der aus der Lösung von @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002) erstellt wurde )
Dadurch wird der Benutzer auch zu Ihren App-Einstellungen gebracht und kann diese sofort aktivieren
Ich habe auch eine Lösung hinzugefügt, mit der überprüft werden kann, ob Ortungsdienste aktiviert sind (und auch Einstellungen vorgenommen werden).
VIEL GLÜCK UND VIEL SPASS!
quelle