2016-03-28 24 views
2

Ich versuche, eine Messaging-App mit iOS, Swift und CloudKit zu erstellen. Ich habe es erfolgreich gemacht und ich habe Push-Benachrichtigungen gesendet, wenn jemand eine andere Nachricht hinzufügt. Allerdings möchte ich für den Text der Push-Benachrichtigung sagen, was jemals in der Nachricht war. Hier ist, was ich habe versucht:So aktualisieren Sie CloudKit-Abonnements

Standard-Code für das Senden von Benachrichtigungen:

let subscription = CKSubscription(recordType: "Responses", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil), options: .FiresOnRecordCreation) 
let notification = CKNotificationInfo() 
notification.alertBody = "New Message Sent" 
notification.soundName = UILocalNotificationDefaultSoundName 

subscription.notificationInfo = notification 

CKContainer.defaultContainer().publicCloudDatabase.saveSubscription(subscription) { (result, error) -> Void in 
    if error != nil { 
     print(error!.localizedDescription) 
    } 
} 

Dies erlaubt mir Benachrichtigungen für jede Nachricht zu senden, die „Neue Nachricht gesendet“ sagt. Das ist, was ich für bestimmte Benachrichtigungen versucht:

//publicDB is the CKContainer.defaultContainer.publicDatabase 
publicDB.fetchAllSubscriptionsWithCompletionHandler({ (subscriptions, error) in 

    if error != nil { 

     self.displayError(self.getStringFromError(error!)) 

    } else { 

     for subscription in subscriptions! { 

      subscription.notificationInfo?.alertBody = self.responseTextField.text 

     } 

    } 

}) 

let record = CKRecord(recordType: "Responses") 
record.setObject(currentUsername, forKey: "respondedBy") 
record.setObject(responseTextField.text, forKey: "response") 
publicDB.saveRecord(record) { (record, error) in 
    //code for updating tables, etc. 
    //Notification on other device sent 
} 

Einstellen der alertBody des Abonnements (was ich versuchte, oben zu tun) funktioniert nicht. Gibt es eine andere Lösung für die Aktualisierung des alertBody eines Abonnements? Vielen Dank!

Antwort

0

Abonnements können nicht aktualisiert werden. Sie müssen es zuerst löschen und dann neu erstellen.

aber warum dann den alertBody ändern? Sie könnten zunächst festlegen, dass das Antwortfeld des Datensatzes angezeigt wird. Dazu sollten Sie etwas wie folgt verwenden:

notificationInfo?.alertLocalizationKey = "Response: %[email protected]" 
notificationInfo?.alertLocalizationArgs = ["response"] 

Dann brauchen Sie auch dies in Ihrer Localization.Strings-Datei.

"Response: %[email protected]" = "Response: %[email protected]"; 

In Ihrem Fall möchten Sie das Abonnement jedes Mal, wenn eine neue Nachricht ändern, erstellt wird. Sie legen die Benachrichtigung gleich wie eines der Felder des Datensatzes fest. Stattdessen können Sie CloudKit das Feld automatisch senden lassen. Sie müssen das Abonnement nur einmal erstellen. In den 2 Codezeilen über dem

ist alertLocalizationKey der Schlüssel, der in der Datei Localization.Strings nachgeschlagen wird, und alertLocalizationArgs sind die CloudKit-Felder, die zum Ersetzen der Parameter verwendet werden.

Weitere Informationen zur Lokalisierung siehe zum Beispiel http://nshipster.com/nslocalizedstring/

+0

Es tut mir leid, ich verstehe nicht, wie Ihr Code funktioniert. Nachdem ich diese Eigenschaften zu meinen Benachrichtigungsinformationen hinzugefügt habe, was soll ich danach machen? Was sind die Localization.Strings? Vielen Dank für Ihre Hilfe – penatheboss

+0

Ich habe die Antwort aktualisiert ... Aber dann, wenn Sie eine Messaging-App basierend auf Cloudkit machen, dann schlage ich vor, Sie sollten sich einen Blick auf: https://github.com/evermeer/EVCloudKitDao –

+0

Ok. Ich werde den Code heute Nachmittag ausprobieren, wenn ich eine Chance bekomme. Ich werde dich wissen lassen, wie es läuft. Sieht vielversprechend aus! – penatheboss

Verwandte Themen