web-dev-qa-db-ger.com

iOS 8-fähiges Gerät empfängt nach der Code-Aktualisierung keine Push-Benachrichtigungen

Ich habe kürzlich eines meiner Test-iPhones auf iOS 8 und dann den Push-Registrierungscode aktualisiertAs unten (mit 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)];


    }
}

Trotz dieses Upgrades und der Tatsache, dass [UIApplication sharedApplication] currentUserNotificationSettings] zeigt, dass Push für das Gerät aktiviert ist, erhalte ich keine Push-Benachrichtigungen. 

Ich benutze Parse und mache alles nach dem Buch, soweit es sie betrifft ( https://parse.com/tutorials/ios-Push-notifications ).

Hat jemand das gleiche Problem? Gibt es noch etwas, das ich vermisse?

31
Zigglzworth

Die Registrierungsweise für Push-Benachrichtigungen wurde in iOS 8 geändert: Nachfolgend finden Sie den Code für alle Versionen bis iOS 9:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];

}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

Wenn Sie prüfen möchten, ob Push-Benachrichtigungen aktiviert sind oder nicht, verwenden Sie folgenden Code:

- (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

Der obige Code wird nur auf Xcode 6+ ausgeführt ...

70
pankaj

Fügen Sie diese Zeile oben in Ihrer .m-Datei ein

 #define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

1) Sie müssen eine Bedingung setzen, wenn Sie sich für die Push-Benachrichtigung in IOS8..__ registrieren. Fügen Sie diesen Code in Anwendung did finish launch hinzu.

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) Dann fügen Sie diese Methoden für IOS8 hinzu.

#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

Dann wird Ihre Benachrichtigungsdelegierungsmethode aufgerufen. hoffe das wird dir helfen !!!

12
Nits007ak

Runtime und alte sichere Compiler-Optionen ... wenn Sie alten Xcode (5.0 oder früher) verwenden

    // 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)];
    }
}
4
karim
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)];
}

Danach:

  1. Löschen Sie die Apps, die keine Push-Benachrichtigungen mehr vom Gerät haben.
  2. Schalten Sie das Gerät vollständig aus und wieder ein.
  3. Gehen Sie zu den Einstellungen und stellen Sie Datum und Uhrzeit einen Tag voraus
  4. Schalten Sie das Gerät wieder aus und drehen Sie es zurück
  5. Installieren Sie die Apps erneut und Sie werden wie bei der ersten Installation nach einer Benachrichtigung gefragt.
  6. Stellen Sie Datum und Uhrzeit erneut ein, wenn sie nicht automatisch eingestellt werden.

Dadurch werden die Benachrichtigungseinstellungen zurückgesetzt. Installieren Sie die App erneut und alles funktioniert gut :)

4
Muzammil

Probieren Sie dies aus, wenn Sie sowohl über iOS 8 als auch ältere Versionen verfügen:

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)];
}

Auf der Entwicklungsseite von Apple:

UIUserNotificationSettings

Ein UIUserNotificationSettings-Objekt kapselt die Typen von Benachrichtigungen, die dem Benutzer von Ihrer App angezeigt werden können. Apps, die Verwenden Sie sichtbare oder hörbare Warnungen in Verbindung mit einem lokalen oder Push Benachrichtigung muss die Arten von Alarmen registrieren, die sie verwenden. UIKit korreliert die von Ihnen bereitgestellten Informationen mit den Voreinstellungen des Benutzers mit Bestimmen Sie, welche Arten von Benachrichtigungen Ihre App verwenden darf.

Verwenden Sie diese Klasse, um Ihre erste Registrierungsanforderung zu kapseln und die Anforderungsergebnisse anzuzeigen. Nachdem Sie eine Instanz dieser Klasse erstellt und Ihre bevorzugten Einstellungen angegeben haben, rufen Sie die registerUserNotificationSettings:-Methode der UIApplication-Klasse auf, um diese Einstellungen zu registrieren. Nachdem Sie Ihre Anfrage mit den Benutzereinstellungen abgeglichen haben, liefert die App die Ergebnisse an die application:didRegisterUserNotificationSettings:-Methode ihres App-Delegierten. Das an diese Methode übergebene Objekt gibt die Benachrichtigungstypen an, die Ihre App verwenden darf.

Neben der Registrierung der Benachrichtigungstypen Ihrer App können Sie mit dieser Klasse auch Gruppen benutzerdefinierter Aktionen registrieren, die zusammen mit lokalen Benachrichtigungen oder Push-Benachrichtigungen angezeigt werden. Benutzerdefinierte Aktionen stellen sofortige Aufgaben dar, die Ihre App als Reaktion auf die Benachrichtigung ausführen kann. Sie definieren Aktionsgruppen und ordnen die gesamte Gruppe einer bestimmten Benachrichtigung zu. Wenn die entsprechende Warnung angezeigt wird, fügt das System für jede von Ihnen angegebene Aktion Schaltflächen hinzu. Wenn der Benutzer für eine der Aktionen auf die Schaltfläche tippt, aktiviert das System Ihre App und ruft die application:handleActionWithIdentifier:forRemoteNotification:completionHandler:- oder application:handleActionWithIdentifier:forLocalNotification:completionHandler:-Methode ihres App-Delegaten auf. Verwenden Sie diese Methoden, um die angeforderte Aktion auszuführen.

1

Es ist sehr einfach:

Fügen Sie folgende Zeile in didFinishLaunchingWithOptions Ihres Projekts in xcode6 hinzu.

 [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
 [[UIApplication sharedApplication] registerForRemoteNotifications];
1
Divya Bharathi

Ich habe versucht, die Typinformationen des Einstellungsobjekts abzurufen, und habe festgestellt, dass die Types-Eigenschaft im Wesentlichen eine Bitmaske ist. So können Sie die Informationen extrahieren.

Mein Beispiel ist jedoch in Swift und> = iOS 8.0.

    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!
    }
0
Raphael
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;

}
0
Adelmo Júnior