wake-up-neo.com

die registerForRemoteNotifications-Methode wird nicht ordnungsgemäß aufgerufen

Ich verwende derzeit Xcode6 Beta (erste Version). Mit parse.com versuche ich, Push-Benachrichtigungen zu implementieren. In meiner App-Delegierten habe ich 

  [application registerForRemoteNotifications];

Wenn ich es auf meinem ios8 beta iPhone ausführe, fragt die App nicht, ob ich Push-Benachrichtigungen aktivieren möchte, und der entsprechende application:didRegisterForRemoteNotificationsWithDeviceToken: wird nie aufgerufen. Als ich es jedoch auf einem ios7-iPhone ausführen wollte, stürzte die App ab und ich erhielt einen unrecognized selector-Fehler für die registerForRemoteNotifications-Methode. 

Dann habe ich versucht, es mit einer früheren Version von Xcode (Version 5.0) auszuführen, aber ich habe den Kompilierungsfehler no visible @interface declares registerForRemoteNotifications erhalten.

Ich gehe davon aus, dass dieser Fehler mit Fehlern beim Übergang zu iOS 8 zusammenhängt, aber ich bin mir nicht sicher, wie ich dieses Problem lösen kann.

15
Mahir

Lesen Sie den Code in UIApplication.h.

Sie werden wissen, wie das geht.

Zuerst:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

code wie folgt hinzufügen

#ifdef __IPHONE_8_0
  //Right, that is the point
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
    //register to receive notifications
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif

Zweite:

Fügen Sie diese Funktion 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

Und Sie können das gerätetoken bekommen 

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

wenn es immer noch nicht funktioniert, verwenden Sie diese Funktion und NSLog dieerror

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
29
Madao

Ein paar Beobachtungen:

  • die Frage war REMOTE, nicht lokal
  • einige fragen beziehen sich auf lokale, das ist eine ganz andere sache
  • Ich bin damit einverstanden, dass die Antwortzeit sehr lang sein kann, aber Sie müssen Rückrufe (auch als Delegatmethoden bezeichnet) implementieren, wie andere Personen darauf hingewiesen haben
  • nICHT gegen das Compiler-Flag testen, ist konzeptionell und praktisch falsch
  • testen Sie die Anwesenheit von Selektoren wie in diesem Code:

    func registerForPushForiOS7AndAbove(){
    
    UIApplication.sharedApplication()
    let application = UIApplication.sharedApplication()
    if application.respondsToSelector(Selector("registerUserNotificationSettings:")) {
    
        let notifSettings = UIUserNotificationSettings(forTypes: .Sound | .Alert | .Badge,
            categories: nil)
    
        application.registerUserNotificationSettings(notifSettings)
        application.registerForRemoteNotifications()
    
    }
    else{
        application.registerForRemoteNotificationTypes( .Sound | .Alert | .Badge )
    }
    

    }

(Verpassen Sie nicht UIBackgroundModes in PList .. können in Capabilities ausgeführt werden.)

5
ingconti

Verwenden Sie einfach dieses Codefragment, um sich für Benachrichtigungen in iOS 8 zu registrieren:

UIUserNotificationSettings *settings = 
    [UIUserNotificationSettings 
        settingsForTypes: (UIUserNotificationTypeBadge | 
                           UIUserNotificationTypeSound |                 
                           UIUserNotificationTypeAlert) 
        categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

Verwenden Sie UIUserNotificationType anstelle von UIRemoteNotificationType!

2
Kai Burghardt

In iOS 8 fordert das System den Benutzer nicht auf, der App das Senden von Push-Benachrichtigungen (Remote-Benachrichtigungen) zu erlauben. Dies ist standardmäßig zulässig.

Der Benutzer kann das Zulassen von Benachrichtigungen über Ihre App unter Einstellungen> Ihre App> Benachrichtigungen> Benachrichtigungen zulassen deaktivieren.

2
Lucien

Die registerForRemoteNotifications-Methode ist ab iOS8 verfügbar.

Die application:didRegisterForRemoteNotificationsWithDeviceToken:-Delegatenmethode wird nur aufgerufen, wenn die Registrierung erfolgreich ist. Wenn ein Fehler auftritt, wird die application:didFailToRegisterForRemoteNotificationsWithError:-Methode aufgerufen.

Weitere Informationen finden Sie unter: Referenz zur UIApplication-Klasse

Check-Benachrichtigung ist auch für die App Settings -> Notifications -> YourApp -> Enable_Notifications aktiviert.

Laut der Dokumentation wird keiner der Rückrufe passieren bis das Gerät eine dauerhafte Verbindung mit dem Push-Server hat. So Wenn keine WLAN- oder Datenverbindung verfügbar ist, werden die Rückrufe nicht passieren - und Apple betrachtet dies nicht als Fehlerbedingung. Nur Fehler, die das didFail verursachen können ... Rückruf ist ein falsches Problem mit Zertifikat-/App-Berechtigungen (ein Entwicklungsproblem) oder der Benutzer hat die Berechtigung abgelehnt.

Bitte gehen Sie durch Push-Benachrichtigung Programmieranleitung

1
Yatheesha B L