J'ai récemment mis à niveau l'un de mes iphones de test vers iOS 8, puis le code d'enregistrement Push a été mis à niveau comme ci-dessous (à l'aide de xCode 6)
-(BOOL)hasNotificationsEnabled {
NSString *iOSversion = [[UIDevice currentDevice] systemVersion];
NSString *prefix = [[iOSversion componentsSeparatedByString:@"."] firstObject];
float versionVal = [prefix floatValue];
if (versionVal >= 8)
{
NSLog(@"%@", [[UIApplication sharedApplication] currentUserNotificationSettings]);
//The output of this log shows that the app is registered for Push so should receive them
if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {
return YES;
}
}
else
{
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types != UIRemoteNotificationTypeNone){
return YES;
}
}
return NO;
}
-(void)registerForPUSHNotifications {
NSString *iOSversion = [[UIDevice currentDevice] systemVersion];
NSString *prefix = [[iOSversion componentsSeparatedByString:@"."] firstObject];
float versionVal = [prefix floatValue];
if (versionVal >= 8)
{
//for iOS8
UIUserNotificationSettings *settings =
[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert |
UIUserNotificationTypeBadge |
UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
}
Malgré cette mise à niveau et le fait que [[UIApplication sharedApplication] currentUserNotificationSettings] indique que le Push est activé pour le périphérique, je ne reçois pas de notifications Push.
J'utilise Parse et je fais tout ce qui est écrit dans le livre en ce qui les concerne ( https://parse.com/tutorials/ios-Push-notifications ).
Est-ce que quelqu'un connaît le même problème? Y a-t-il autre chose qui me manque?
Le mode d’enregistrement des notifications Push a été modifié dans iOS 8:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
Si vous souhaitez vérifier si les notifications Push sont activées ou non, utilisez le code ci-dessous:
- (BOOL) pushNotificationOnOrOff
{
if ([UIApplication instancesRespondToSelector:@selector(isRegisteredForRemoteNotifications)]) {
return ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]);
} else {
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
return (types & UIRemoteNotificationTypeAlert);
}
}
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings: (UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
//handle the actions
if ([identifier isEqualToString:@"declineAction"]){
}
else if ([identifier isEqualToString:@"answerAction"]){
}
}
#endif
Le code ci-dessus ne fonctionnera que sur Xcode 6+ ...
Ajoutez cette ligne en haut de votre fichier .m
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
1) Vous devez mettre la condition lorsque vous vous inscrivez à la notification Push dans IOS8
. ajoutez ce code dans l'application did finish launch
.
if(IS_IOS_8_OR_LATER) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: (UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
//register to receive notifications
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
2) Ajoutez ensuite ces méthodes pour IOS8
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings: (UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
//handle the actions
if ([identifier isEqualToString:@"declineAction"]){
}
else if ([identifier isEqualToString:@"answerAction"]){
}
}
#endif
Ensuite, votre méthode de délégué de notification sera appelée. J'espère que ceci vous aidera !!!
Runtime et anciennes options sûres du compilateur ... si vous utilisez un ancien xcode (5.0 ou antérieur)
// changes of API in iOS 8.0
- (void) registerForPushNotification
{
NSLog(@"registerForPushNotification");
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0 //__IPHONE_8_0 is not defined in old xcode (==0). Then use 80000
NSLog(@"registerForPushNotification: For iOS >= 8.0");
[[UIApplication sharedApplication] registerUserNotificationSettings:
[UIUserNotificationSettings settingsForTypes:
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)
categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
} else {
NSLog(@"registerForPushNotification: For iOS < 8.0");
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}
}
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
// For iOS 8
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
// For iOS < 8
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
Après ça:
Cela réinitialisera les paramètres de notification. Réinstallez l'application et tout fonctionnera bien :)
Essayez ceci si vous avez à la fois iOS 8 et versions antérieures:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
// For iOS 8
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
// For iOS < 8
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
Sur le site de développement d'Apple:
UIUserNotificationSettings
Un objet UIUserNotificationSettings encapsule les types de notifications pouvant être affichées à l'utilisateur par votre application. Des applications qui utiliser des alertes visibles ou sonores en conjonction avec un Push local ou Push notification doit enregistrer les types d'alertes qu'ils utilisent. UIKit met en corrélation les informations que vous fournissez avec les préférences de l'utilisateur avec déterminer les types d'alertes que votre application est autorisée à utiliser.
Utilisez cette classe pour encapsuler votre demande d'enregistrement initiale et pour afficher les résultats de la demande. Après avoir créé une instance de cette classe et spécifié vos paramètres préférés, appelez la méthode
registerUserNotificationSettings:
de la classe UIApplication pour enregistrer ces paramètres. Après avoir vérifié votre demande par rapport aux préférences de l'utilisateur, l'application envoie les résultats à la méthodeapplication:didRegisterUserNotificationSettings:
de son délégué d'application. L'objet transmis à cette méthode spécifie les types de notifications que votre application est autorisée à utiliser.Outre l'enregistrement des types d'alerte de votre application, vous pouvez également utiliser cette classe pour enregistrer des groupes d'actions personnalisées à afficher en association avec des notifications locales ou Push. Les actions personnalisées représentent des tâches immédiates que votre application peut effectuer en réponse à la notification. Vous définissez des groupes d’actions et associez le groupe entier à une notification donnée. Lorsque l'alerte correspondante est affichée, le système ajoute des boutons pour chaque action spécifiée. Lorsque l'utilisateur appuie sur le bouton de l'une des actions, le système réveille votre application et appelle la méthode
application:handleActionWithIdentifier:forRemoteNotification:completionHandler:
ouapplication:handleActionWithIdentifier:forLocalNotification:completionHandler:
de son délégué d'application. Utilisez ces méthodes pour effectuer l'action demandée.
C'est très simple:
Ajouter la ligne suivante dans didFinishLaunchingWithOptions
de votre projet dans xcode6
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
J'ai essayé d'obtenir les informations de type de l'objet settings et j'ai découvert que la propriété types est fondamentalement un masque de bits. Voici comment vous pouvez extraire les informations.
Mon exemple est dans Swift et> = iOS 8.0 cependant.
let settings = UIApplication.sharedApplication().currentUserNotificationSettings()
if settings.types.rawValue & UIUserNotificationType.Alert.rawValue == UIUserNotificationType.Alert.rawValue
{
// can receive alert!
}
else
{
// if the user is not even able to receive alerts, show him a hint on how to reenable notifications in system settings
}
if settings.types.rawValue & UIUserNotificationType.Badge.rawValue == UIUserNotificationType.Badge.rawValue
{
// can receive badge!
}
if settings.types.rawValue & UIUserNotificationType.Sound.rawValue == UIUserNotificationType.Sound.rawValue
{
// can receive sound!
}
The code below resolved:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
UIUserNotificationType types;
types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
if (types & UIUserNotificationTypeAlert)
pushEnabled=YES;
else
pushEnabled=NO;
}
else
{
UIRemoteNotificationType types;
types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types & UIRemoteNotificationTypeAlert)
pushEnabled=YES;
else
pushEnabled=NO;
}