Beim Versuch, sich für Push-Benachrichtigungen unter iOS 8.x zu registrieren:
application.registerForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound)
Ich erhalte folgende Fehlermeldung:
registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
Irgendwelche Ideen, wie geht das neu? Es funktioniert, wenn ich diese Swift-App unter iOS 7.x ausführe.
BEARBEITEN
Unter iOS 7.x, wenn ich den bedingten Code einfüge, den ich erhalte (entweder SystemVersion bedingt oder #if __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000)
dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings
objective-c
ios8
apple-push-notifications
dyld
Wojtek Turowicz
quelle
quelle
Antworten:
Wie Sie beschrieben haben, müssen Sie eine andere Methode verwenden, die auf verschiedenen Versionen von iOS basiert. Wenn Ihr Team sowohl Xcode 5 (das keine iOS 8-Selektoren kennt) als auch Xcode 6 verwendet, müssen Sie die bedingte Kompilierung wie folgt verwenden:
Wenn Sie nur Xcode 6 verwenden, können Sie sich an Folgendes halten:
Der Grund dafür ist, dass sich die Art und Weise, wie Sie Benachrichtigungsberechtigungen erhalten, in iOS 8 geändert hat. A
UserNotification
ist eine Nachricht, die dem Benutzer angezeigt wird, egal ob von remote oder lokal. Sie benötigen die Erlaubnis, um eine zu zeigen. Dies wird im WWDC 2014-Video "Was ist neu in iOS-Benachrichtigungen?" Beschrieben.quelle
__IPHONE_OS_VERSION_MAX_ALLOWED
, da es sich um eine Überprüfung zur Kompilierungszeit handelt.registerUserNotificationSettings:
ist hierFür iOS <10
Für iOS10
quelle
systemVersion
, sollten Sie überprüfen[[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]
[[UIApplication sharedApplication] registerForRemoteNotifications];
geht nicht zuapplication:didRegisterForRemoteNotificationsWithDeviceToken:
oderapplication:didFailToRegisterForRemoteNotificationsWithError:
wenn ein Benutzer "Benachrichtigungen zulassen" in Einstellungen -> Benachrichtigungen -> <Meine App> deaktiviert hat.Aufbauend auf der Antwort von @ Prasath. So geht's in Swift :
quelle
iOS 8 hat die Benachrichtigungsregistrierung nicht abwärtskompatibel geändert. Während Sie iOS 7 und 8 unterstützen müssen (und Apps, die mit dem 8 SDK erstellt wurden, nicht akzeptiert werden), können Sie nach den benötigten Selektoren suchen und diese für die laufende Version unter bestimmten Bedingungen korrekt aufrufen.
Hier ist eine Kategorie zu UIApplication, die diese Logik hinter einer sauberen Schnittstelle verbirgt, die sowohl in Xcode 5 als auch in Xcode 6 funktioniert.
Header:
Implementierung:
quelle
Settings
isRegisteredForRemoteNotifications
YES
Ich denke, dies ist der bessere Weg, um die Abwärtskompatibilität aufrechtzuerhalten, wenn wir diesen Ansatz wählen. Er funktioniert für meinen Fall und die Hoffnung wird für Sie funktionieren. Auch ziemlich leicht zu verstehen.
quelle
if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
wie hierFür die Swift-geneigten:
quelle
Ich konnte nicht herausfinden, auf welche NSSet-Variable "Kategorien" gesetzt werden sollte. Wenn mich also jemand ausfüllen könnte, werde ich diesen Beitrag gerne bearbeiten. Im Folgenden wird jedoch der Push-Benachrichtigungsdialog angezeigt.
Bearbeiten: Ich habe eine Push-Benachrichtigung erhalten, die ich mit diesem Code an mein Telefon senden kann. Daher bin ich mir nicht sicher, ob der Parameter category erforderlich ist.
quelle
categories
wird verwendet, um Benachrichtigungsaktionen in iOS 8 einzurichten. Weitere Informationen finden Sie im WWDC 2014-Video "Was ist neu in iOS-Benachrichtigungen?"Es stellt sich also heraus, dass Sie, da AnyObject der spirituelle Nachfolger von id ist, jede gewünschte Nachricht auf AnyObject aufrufen können. Dies entspricht dem Senden einer Nachricht an id. OK Fair genug. Aber jetzt fügen wir dem Konzept hinzu, dass alle Methoden in AnyObject optional sind und wir etwas haben, mit dem wir arbeiten können.
Vor diesem Hintergrund hoffte ich, dass ich UIApplication.sharedApplication () einfach in AnyObject umwandeln, dann eine Variable erstellen konnte, die der Methodensignatur entspricht, diese Variable auf die optionale Methode setzen und dann die Variable testen konnte. Das schien nicht zu funktionieren. Ich vermute, dass der Compiler beim Kompilieren mit dem iOS 8.0 SDK weiß, wo er diese Methode finden sollte , und dies alles bis hin zu einer Speichersuche optimiert. Alles funktioniert einwandfrei, bis ich versuche, die Variable zu testen. An diesem Punkt erhalte ich eine EXC_BAD_ACCESS.
In demselben WWDC-Vortrag, in dem ich festgestellt habe, dass alle Methoden optional sind, verwenden sie die optionale Verkettung, um eine optionale Methode aufzurufen - und dies scheint zu funktionieren. Der lahme Teil ist, dass Sie tatsächlich versuchen müssen, die Methode aufzurufen, um zu wissen, ob sie vorhanden ist. Dies ist bei der Registrierung für Benachrichtigungen ein Problem, da Sie versuchen, herauszufinden, ob diese Methode vorhanden ist, bevor Sie eine erstellen UIUserNotificationSettings-Objekt. Es scheint, als wäre es in Ordnung, diese Methode mit nil aufzurufen. Die Lösung, die für mich zu funktionieren scheint, lautet also:
Nach langem Suchen im Zusammenhang damit kamen die wichtigsten Informationen aus diesem WWDC-Vortrag https://developer.apple.com/videos/wwdc/2014/#407 genau in der Mitte des Abschnitts über "Optionale Methoden in Protokollen".
In Xcode 6.1 Beta funktioniert der obige Code nicht mehr, der folgende Code funktioniert:
quelle
Wenn Sie IOS7 IOS8 unterstützen möchten, können Sie diesen Code in Ihr Projekt anwenden.
quelle
Nach Xcode 6.1 Beta funktioniert der folgende Code, leichte Bearbeitung des Tom S-Codes, der mit der 6.1 Beta nicht mehr funktioniert (funktioniert mit der vorherigen Beta):
quelle
Sie können dies verwenden
quelle
Swift 2.0
quelle
Wenn Sie nur den ios 8-Code benötigen, sollte dies der Fall sein.
quelle
Das ist sauberer, wie ich es mache und es funktioniert einfach großartig
quelle
für iOS 8 und höher
quelle