无法从 CloudKit 通知信息和用户信息结构中获取 CKRecord.ID
Posted
技术标签:
【中文标题】无法从 CloudKit 通知信息和用户信息结构中获取 CKRecord.ID【英文标题】:Can't get CKRecord.ID from CloudKit notificationInfo and userInfo structure 【发布时间】:2019-02-10 00:53:29 【问题描述】:我已在公共数据库上为 CloudKit 应用程序设置订阅。我想从返回的 notificationInfo 中检索 recordName。我无法找到任何文档来解释如何使用框架方法检索记录名称,因此我尝试手动解析信息它不起作用,但这似乎很暴力,我不确定我是否可以指望notificationInfo 结构总是相同的。任何指导将不胜感激。这是代码sn-p。
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
如果我打印通知信息:
[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】:如果通知是订阅的结果,那么CKNotification(fromRemoteNotificationDictionary:)
实际上会返回一个CKQueryNotification
的实例。然后您可以访问CKQueryNotification
的recordID
属性以获取更改记录的ID。
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)")
【讨论】:
以上是关于无法从 CloudKit 通知信息和用户信息结构中获取 CKRecord.ID的主要内容,如果未能解决你的问题,请参考以下文章