2015-07-12 3 views
9

Ich verwende CloudKit zum Speichern von Benutzerdaten und möchte Push-Benachrichtigungen erhalten, wenn die Datensätze geändert oder neue Datensätze erstellt werden. Aber es funktioniert nicht ...CloudKit Push Benachrichtigungen didReceiveRemoteNotification nie aufgerufen

I für die Abonnements registrieren wie folgt aus:

- (void) updateCloudSubscriptions { 

    NSPredicate *allPredicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"]; 
    CKSubscription *newOrUpdateSubscription = [[CKSubscription alloc] 
     initWithRecordType:kMyRecordType predicate:allPredicate options: 
     (CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate)]; 
    CKNotificationInfo *newOrUpdateNotificationInfo = [CKNotificationInfo new]; 
    newOrUpdateNotificationInfo.shouldBadge = NO; 
    newOrUpdateNotificationInfo.shouldSendContentAvailable = YES; 
    newOrUpdateSubscription.notificationInfo = newOrUpdateNotificationInfo; 

    CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:kMyContainerID] 
     publicCloudDatabase]; 
    [publicDatabase saveSubscription:newOrUpdateSubscription 
     completionHandler:^(CKSubscription *theSubscription, NSError *saveError) { 
     if (saveError){ 
      //error handling 
     } 
     NSLog(@"Subscription created"); 
    }]; 
} 

Dies gelingt. Auf dem CloudKit Dashboard wird das Abonnement ordnungsgemäß erstellt.

In meinem AppDelegate Ich habe nun folgendes:

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

    UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes: 
     (UIUserNotificationTypeNone | UIUserNotificationTypeAlert | 
     UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil]; 
    [application registerUserNotificationSettings:notificationSettings]; 
    [application registerForRemoteNotifications]; 
} 

und diese Delegatmethoden umgesetzt:

- (void)application:(UIApplication *)application 
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    NSLog(@"%@ with token = %@", NSStringFromSelector(_cmd), deviceToken); 
} 


- (void)application:(UIApplication *)application 
    didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { 
    NSLog(@"%@ with error = %@", NSStringFromSelector(_cmd), error); 
} 


- (void)application:(UIApplication *)application 
    didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    NSLog(@"%@", NSStringFromSelector(_cmd)); 
} 

didRegisterForRemoteNotificationsWithDeviceToken erfolgreich mit einem Token genannt. Aber didReceiveRemoteNotification wird nie aufgerufen.

Ich habe dies getestet, indem ich Werte auf der Mac-Version meiner App und auf der iPhone-Version geändert habe. Beide laden die Änderungen hoch, lösen jedoch keine Benachrichtigung aus. Ich habe auch versucht, die Werte direkt auf dem Dashboard zu ändern, aber das hat auch keine Benachrichtigungen verursacht.

Was fehlt mir hier?

Falls relevant: Ich bin auf OS X 10.10 mit XCode 6.4

I apsd Protokollierung aktiviert, aber nur Nachrichten wie diese:

Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Saving database. 
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Destroying database. 
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Closed database. 
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Reopening database 
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Initializing database on thread: <NSThread: 0x7f8f1bf80dd0>{number = 55, name = (null)} 
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling auto vacuum. 
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling WAL journal mode. 
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling Foreign Key support. 
+0

Derzeit gibt es einen CloudKit Bug mit Update-Benachrichtigungen. Hast du deine App mit einem neuen Datensatz getestet? Weitere Informationen über den Update-Fehler finden Sie unter https://forums.developer.apple.com/thread/7288 –

+0

@EdwinVermeer, das ist interessant. Ich erhalte jedoch auch keine Benachrichtigungen zur Erstellung von Datensätzen. – codingFriend1

+0

Haben Sie in den Zielanwendungsfunktionen die Hintergrundmodi für Remote-Benachrichtigungen aktiviert? –

Antwort

6

Ihre Benachrichtigung Registrierung ist korrekt für iOS 8, aber auf OS X müssen Sie registerForRemoteNotificationTypes: Methode NSApplication und auf iOS 7 die registerForRemoteNotificationTypes: Methode von UIApplication verwenden. Documentation:

Eine App mit Apple Push Notification Service (APNs) zu erhalten Remote-Benachrichtigungen gesendet von dem App-Push-Provider registrieren. In iOS 8 und später Registrierung hat vier Stufen:

  1. Registrieren Sie die Benachrichtigungstypen App registerUserNotificationSettings unterstützt die :.
  2. Registrieren Sie sich, um Push Benachrichtigungen über APNs zu erhalten, indem Sie die Methode registerForRemoteNotifications der App aufrufen.
  3. Speichern Sie das zurückgegebene Geräte-Token an den App-Delegaten vom Server für eine erfolgreiche Registrierung oder Handle Registrierungsfehler ordnungsgemäß.
  4. Leiten Sie das Geräte-Token an den Push-Anbieter der App weiter.

(In iOS 7 anstelle der ersten beiden Schritte, Sie sich registrieren, indem sie die registerForRemoteNotificationTypes Aufruf: Methode von UIApplication und in OS X durch die registerForRemoteNotificationTypes Aufruf. Methode NSApplication)

implementieren auch didReceiveRemoteNotification:fetchCompletionHandler: statt didReceiveRemoteNotification:

Verwenden Sie diese Methode, um eingehende Remote-Benachrichtigungen für Ihre App zu verarbeiten. Im Gegensatz zur Anwendung: didReceiveRemoteNotification: method, die nur aufgerufen wird, wenn Ihre App im Vordergrund ausgeführt wird, ruft das System diese Methode auf, wenn Ihre App im Vordergrund oder Hintergrund ausgeführt wird. Wenn Sie den Remote-Benachrichtigungsmodus im Hintergrundmodus aktiviert haben, startet das System Ihre App (oder weckt sie aus dem gesperrten Status ) und versetzt sie in den Hintergrundstatus, wenn eine Remote-Benachrichtigung eintrifft. Jedoch startet das System nicht automatisch Ihre App, wenn der Benutzer es erzwungen hat. In diesem Fall muss der Benutzer Ihre App neu starten oder das Gerät neu starten, bevor das System versucht, Ihre App automatisch erneut zu starten.

Wenn Sie die Benachrichtigungen möchten, dass Ihre App wecken, stellen Sie sicher, Info.plist zu bearbeiten und überprüfen Sie die „Enable Background Modi“ und „Remote-Benachrichtigungen“ Kontrollkästchen:

enter image description here

Da Sie wollen Stille Benachrichtigung, pro Dokumentation sollten Sie nur das Flag "content-available" an 1 senden, damit es korrekt ist. Aber es gibt andere Benutzer, die Probleme mit stillen Benachrichtigungen hatten, und anscheinend half das Senden der Eigenschaft "sound" als leere Zeichenfolge (see this question), so dass Sie versuchen konnten, CKNotificationInfo.soundName auf eine leere Zeichenfolge festzulegen.

+0

Danke für Ihre ausführliche Antwort, Baris. Ich habe mich korrekt auf OS X registriert; Der Code wurde gerade nicht in meiner Frage aufgeführt. Ich habe immer auf iOS 8 getestet, daher sollte die Registrierung dort korrekt sein. Die Apps waren beim Testen im Vordergrund, aber ich habe auch die Hintergrundbenachrichtigungen und 'didReceiveRemoteNotification: fetchCompletionHandler:' hinzugefügt, aber sie wird immer noch nicht aufgerufen. Für mich ist es sehr mysteriös ... – codingFriend1

+1

@ codingFriend1 Siehe meine aktualisierte Antwort: Versuchen Sie 'CKNotificationInfo.soundName' auf eine leere Zeichenfolge zu setzen. Vielleicht hilft es, es scheint für [andere] funktioniert zu haben (http://stackoverflow.com/questions/19239737/silent-push-notification-in-ios-7-does-not-work) ... –

+0

Ja! Das war das fehlende Puzzleteil. 'soundName' muss eingestellt werden, um Benachrichtigungen zu erhalten. Es tut mir leid, dass es so lange gedauert hat, das zu überprüfen, und du hast nur die Hälfte des Kopfgelds bekommen. Wie auch immer: Vielen Dank für Ihre Hilfe! – codingFriend1

10

Die 2015 WWDC CloudKit Tips & Tricks video wies darauf hin, dass, wenn Sie eine unbeaufsichtigte senden Push-Benachrichtigung, müssen Sie die shouldSendContentAvailable auf true auf Ihrem notificationInfo Wörterbuch setzen, etwa so:

let notificationInfo = CKNotificationInfo() 
notificationInfo.shouldSendContentAvailable = true 
subscription.notificationInfo = notificationInfo 
+0

Danke, aber das Hinzufügen der Flagge hatte keine Wirkung ... – codingFriend1

+0

Dies ist nicht verfügbar in TVos, nur für den Fall, dass Ihre Frage ... – user3069232

+0

Vielen Dank dafür !! Ich habe darum gekämpft, dass die Methode nicht aufgerufen wird, wenn die App jetzt länger als 4 Stunden im Hintergrund ist. – ShayanK