Lorsque vous essayez de vous inscrire aux notifications push sous iOS 8.x:
application.registerForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound)
J'obtiens l'erreur suivante:
registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
Des idées quelle est la nouvelle façon de le faire? Cela fonctionne lorsque j'exécute cette application Swift sur iOS 7.x.
ÉDITER
Sur iOS 7.x lorsque j'inclus le code conditionnel que j'obtiens (SystemVersion conditionnel ou #if __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000)
dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings
objective-c
ios8
apple-push-notifications
dyld
Wojtek Turowicz
la source
la source
Réponses:
Comme vous l'avez décrit, vous devrez utiliser une méthode différente basée sur différentes versions d'iOS. Si votre équipe utilise à la fois Xcode 5 (qui ne connaît aucun sélecteur iOS 8) et Xcode 6, vous devrez utiliser la compilation conditionnelle comme suit:
Si vous utilisez uniquement Xcode 6, vous pouvez vous en tenir à ceci:
La raison en est que la façon dont vous obtenez les autorisations de notification a changé dans iOS 8. A
UserNotification
est un message affiché à l'utilisateur, qu'il soit distant ou local. Vous devez obtenir la permission d'en afficher un. Ceci est décrit dans la vidéo WWDC 2014 "Quoi de neuf dans les notifications iOS"la source
__IPHONE_OS_VERSION_MAX_ALLOWED
pour vérifier cela car il s'agit d'une vérification à la compilation.registerUserNotificationSettings:
est documenté iciPour iOS <10
Pour iOS10
la source
systemVersion
, vous devriez vérifier[[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]
[[UIApplication sharedApplication] registerForRemoteNotifications];
ne va pas non plusapplication:didRegisterForRemoteNotificationsWithDeviceToken:
ouapplication:didFailToRegisterForRemoteNotificationsWithError:
si un utilisateur a désactivé "Autoriser les notifications" dans Paramètres -> Notifications -> <Mon application>.S'appuyant sur la réponse de @ Prasath. Voici comment vous le faites dans Swift :
la source
iOS 8 a modifié l'enregistrement des notifications d'une manière non rétrocompatible. Bien que vous deviez prendre en charge iOS 7 et 8 (et que les applications conçues avec le SDK 8 ne soient pas acceptées), vous pouvez vérifier les sélecteurs dont vous avez besoin et les appeler conditionnellement correctement pour la version en cours d'exécution.
Voici une catégorie sur UIApplication qui cachera cette logique derrière une interface propre pour vous qui fonctionnera à la fois dans Xcode 5 et Xcode 6.
Entête:
La mise en oeuvre:
la source
Settings
notifications et les désactiver,isRegisteredForRemoteNotifications
revient toujoursYES
Je pense que c'est la meilleure façon de conserver la compatibilité descendante si nous adoptons cette approche, cela fonctionne pour mon cas et j'espère que cela fonctionnera pour vous. Aussi assez facile à comprendre.
la source
if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
comme indiqué iciPour les inclinés Swift:
la source
Je ne pouvais pas comprendre à quoi la variable NSSet "categories" devrait être définie, donc si quelqu'un pouvait me renseigner, je serais ravi de modifier ce message. Cependant, ce qui suit fait apparaître la boîte de dialogue de notification push.
Edit: j'ai reçu une notification push à envoyer à mon téléphone avec ce code, donc je ne suis pas sûr que le paramètre categories soit nécessaire.
la source
categories
est utilisé pour configurer les actions de notification dans iOS 8. Vous pouvez voir la vidéo de la WWDC 2014 "Quoi de neuf dans les notifications iOS" pour plus de détailsIl s'avère donc que, comme AnyObject est le successeur spirituel de id, vous pouvez appeler n'importe quel message de votre choix sur AnyObject. C'est l'équivalent d'envoyer un message à id. OK très bien. Mais maintenant, nous ajoutons dans le concept que toutes les méthodes sont facultatives sur AnyObject , et nous avons quelque chose avec lequel nous pouvons travailler.
Compte tenu de ce qui précède, j'avais bon espoir de pouvoir simplement convertir UIApplication.sharedApplication () en AnyObject, puis créer une variable égale à la signature de la méthode, définir cette variable sur la méthode facultative, puis tester la variable. Cela ne semblait pas fonctionner. Je suppose que lorsqu'il est compilé avec le SDK iOS 8.0, le compilateur sait où il pense que cette méthode devrait être, il optimise donc tout cela jusqu'à une recherche de mémoire. Tout fonctionne bien jusqu'à ce que j'essaie de tester la variable, auquel cas j'obtiens un EXC_BAD_ACCESS.
Cependant, dans le même discours sur la WWDC où j'ai trouvé le joyau de toutes les méthodes étant facultatives, ils utilisent le chaînage facultatif pour appeler une méthode facultative - et cela semble fonctionner. La partie boiteuse est que vous devez réellement essayer d'appeler la méthode afin de savoir si elle existe, ce qui dans le cas de l'inscription aux notifications est un problème parce que vous essayez de déterminer si cette méthode existe avant de créer un Objet UIUserNotificationSettings. Il semble que d'appeler cette méthode avec nil soit correct, donc la solution qui semble fonctionner pour moi est:
Après de nombreuses recherches à ce sujet, les informations clés sont venues de cette conférence de la WWDC https://developer.apple.com/videos/wwdc/2014/#407 en plein milieu de la section sur les "Méthodes facultatives dans les protocoles"
Dans Xcode 6.1 beta, le code ci-dessus ne fonctionne plus, le code ci-dessous fonctionne:
la source
Si vous souhaitez ajouter un support à IOS7 IOS8, vous pouvez appliquer ce code dans votre projet.
la source
Après Xcode 6.1 Beta, le code ci-dessous fonctionne, légère modification du code Tom S qui a cessé de fonctionner avec la version bêta 6.1 (fonctionnait avec la version bêta précédente):
la source
Vous pouvez utiliser ceci
la source
Swift 2.0
la source
Si tout ce dont vous avez besoin est le code ios 8, cela devrait le faire.
la source
C'est une façon plus propre que je fais et ça fonctionne très bien
la source
pour iOS 8 et supérieur
la source