簡體   English   中英

CloudKit 通知的動態 alertBody

[英]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類型沒有titlesubtitledetails ,您可能需要在其上添加額外的字段,以顯示您希望在通知中顯示的確切文本。

實現此目的的一種方法是訂閱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
)

而最后一步是處理您的通知AppDelegatedidReceiveRemoteNotification

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM