[英]Dynamic alertBody for CloudKit notifications
我正在嘗試使用 CloudKit 向訂閱了發布劇集的頻道的用戶發送推送通知。 我可以創建CKRecord
,訂閱用戶,並在新劇集發布時接收通知,盡管我希望我的alertBody
成為新發布的劇集的標題。
眼下推送通知顯示了alertBody
原來的CKRecord
用來保存訂閱。
我讀過人們解釋使用 Localization.Strings 文件,但不知道這對我有什么幫助。 CloudKit 甚至可以做到這一點嗎?
static func registerSubscriptionWith(ID: String) {
let predicate = NSPredicate(format: "channelID == %@", ID)
let subscription = CKQuerySubscription(recordType: "Episode", predicate: predicate, options: .firesOnRecordCreation)
let myContainer = CKContainer.default()
let publicDatabase = myContainer.publicCloudDatabase
let recordID = CKRecord.ID(recordName: ID)
publicDatabase.fetch(withRecordID: recordID) { (record, error) in
if let error = error {
print("Error: \(error.localizedDescription)")
} else {
if record != nil {
let notification = CKSubscription.NotificationInfo()
notification.title = record!["channelName"]
notification.alertBody = record!["caption"]
notification.soundName = "default"
subscription.notificationInfo = notification
publicDatabase.save(subscription) { result, error in
if error != nil {
print(error!.localizedDescription)
} else {
print("Success subscribing user to episode notifications")
}
}
}
}
}
}
是的,這絕對是可能的。
== 第 1 步 ==
在 Xcode 項目的/Resources
文件夾中創建一個Localizable.strings
文件並將其放入其中:
"%1$@" = "%1$@";
== 第 2 步 ==
向CKSubscriptions.NotificationInfo()
添加更多詳細信息,如下所示:
let info = CKSubscription.NotificationInfo()
//Notification Title
info.titleLocalizationKey = "%1$@"
info.titleLocalizationArgs = ["title"] //Matches a CKRecord field on your Episode recordType
//Notification Subtitle (Optional)
info.subtitleLocalizationKey = "%1$@"
info.subtitleLocalizationArgs = ["subtitle"] //Matches a CKRecord field
//Notification Body/Message
info.alertLocalizationKey = "%1$@"
info.alertLocalizationArgs = ["details"] //Matches a CKRecord field
//One key for each of the above to fetch
info.desiredKeys = ["title", "subtitle", "details"]
//Always set this to true
info.shouldSendContentAvailable = true
//More Notification Options
info.shouldBadge = false
info.soundName = "Notification.wav"
subscription.notificationInfo = info
如果您的Episode
類型沒有title
、 subtitle
和details
,您可能需要在其上添加額外的字段,以顯示您希望在通知中顯示的確切文本。
實現此目的的一種方法是訂閱Episode
上的記錄更改,例如當為頻道 ID 創建新劇集時
let subscription = CKQuerySubscription(
recordType: "Episode",
predicate: NSPredicate(format: "channelID == %@", ID),
subscriptionID: CKQuerySubscription.ID("episode_subscription"),
options: [
CKQuerySubscription.Options.firesOnRecordCreation,
]
)
比將訂閱保存到數據庫
let info = CKSubscription.NotificationInfo()
info.shouldSendContentAvailable = true
subscription.notificationInfo = info
let operation = CKModifySubscriptionsOperation(
subscriptionsToSave: [subscription],
subscriptionIDsToDelete: nil
)
而最后一步是處理您的通知AppDelegate
在didReceiveRemoteNotification
if let dict = userInfo as? [String: NSObject] {
if let notification = CKNotification(fromRemoteNotificationDictionary: dict) {
if let queryNotification = notification as? CKQueryNotification {
//Fetch record with id
let operation = CKFetchRecordsOperation(recordIDs:[queryNotification.recordID])
...
//Show notification when fetch is completed.
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.