Не удается получить CKRecord.ID из структуры CloudKit messagesInfo и userInfo - PullRequest
0 голосов
/ 10 февраля 2019

Я установил подписку на общедоступную базу данных для приложения CloudKit.Я хочу получить recordName из уведомлений, что возвращается.Мне не удалось найти какую-либо документацию, объясняющую, как извлечь recordName с помощью каркасных методов, поэтому я попытался разобрать информацию вручную, она не работает, но это кажется грубой силой, и я не уверен, что могу рассчитывать наструктура уведомлений всегда одинакова.Любое руководство будет оценено.Вот фрагмент кода.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    var changedCKRecord : String

    let dict = userInfo as! [String : NSObject]
    let notification = CKNotification(fromRemoteNotificationDictionary: dict)
    let db = CloudKitDatabase.shared

    if notification.subscriptionID == db.ckStyleSubscriptionID {
        db.handleNotification()
        completionHandler(.newData)
        print(".newData for CKStyle returned")

        for (key,value) in dict {
            if key == "ck" {
                let newDict : [String : NSObject] = value as! [String : NSObject]
                for (key2,value2) in newDict {
                    if key2 == "qry" {
                        let thirdDict : [String : NSObject] = value2 as! [String : NSObject]
                        for (key3,value3) in thirdDict {
                            if key3 == "rid" {
                                if let end = value3 as? String {
                                    changedCKRecord = end
                                    print(changedCKRecord as Any)
                                }
                            }//if key3
                        }//for key3
                    }//if key2
                }//for key 2 in
            }//if key is ck
        }//for in

    } else {
        completionHandler(.noData)
        print(notification.subscriptionID as Any)
        print(db.ckStyleSubscriptionID)
        print(".noData for CKStyle returned")
    }//if notification else

}//didReceiveRemoteNotification

Если я распечатаю уведомлениеInfo:

[AnyHashable("aps"): {"content-available" = 1;},
AnyHashable("ck"): {
ce = 2;
cid = "iCloud. the real bundle identifier  ";
ckuserid = "_c4478d4d3a212da39cca27eb17dffe03";
nid = "58372f81-d10b-4e3b-98ae-40a0d1e048a2";
qry =     {
dbs = 2;
fo = 2;
rid = "97DB306F-3277-07A1-04F5-40228A5EF036";
sid = "ckstyle-changes";
zid = "_defaultZone";
zoid = "_defaultOwner";
};
}]

1 Ответ

0 голосов
/ 10 февраля 2019

Если уведомление является результатом подписки, то CKNotification(fromRemoteNotificationDictionary:) фактически вернет экземпляр CKQueryNotification.Затем вы можете получить доступ к свойству CKQueryNotification recordID, чтобы получить идентификатор измененной записи.

let dict = userInfo as! [String : NSObject]
let notification = CKNotification(fromRemoteNotificationDictionary: dict)
if let queryNotification = notification as? CKQueryNotification,
   let recordName = queryNotification.recordID?.recordName {
       print("Record name is \(recordName)")
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...