- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时,当我在第一台设备上执行更改(例如添加 40 条记录)时,我会在第二台设备上收到 40 CKQueryNotifications
。
尽管我可以将 CKQueryNotifications
标记为已读,但我无法将 CKNotifications
标记为已读。为什么?每次启动后,他们总是回到我的设备。为什么?
如何获取待处理的通知?
var serverChangeToken: CKServerChangeToken? {
return UserDefaults(suiteName: SharedGroupName)?.object(forKey: "a") as? CKServerChangeToken
}
func fetchPendingNotifications(notifications: [CKNotification] = [], completion: ErrorHandler? = nil) {
var queryNotifications = notifications
let operation = CKFetchNotificationChangesOperation(previousServerChangeToken: serverChangeToken)
let operationQueue = OperationQueue()
operation.notificationChangedBlock = { notification in
print("+++++ \(notification)")
queryNotifications.append(notification)
}
operation.fetchNotificationChangesCompletionBlock = { token, error in
if let token = token {
UserDefaults(suiteName: SharedGroupName)?.set(NSKeyedArchiver.archivedData(withRootObject: token), forKey: "a")
UserDefaults(suiteName: SharedGroupName)?.synchronize()
}
if error == nil && operation.moreComing {
self.fetchPendingNotifications(notifications: queryNotifications, completion: completion)
} else {
self.perform(queryNotifications: queryNotifications, completion: completion)
}
}
operationQueue.addOperation(operation)
}
如何将通知标记为已读?
func perform(queryNotifications: [CKNotification], completion: ErrorHandler? = nil) {
var currentQueryNotifications = queryNotifications
if let queryNotification = currentQueryNotifications.first {
currentQueryNotifications.removeFirst()
let operation = CKMarkNotificationsReadOperation(notificationIDsToMarkRead: [queryNotification.notificationID!])
operation.markNotificationsReadCompletionBlock = { _, _ in
print("marked as read")
self.perform(queryNotifications: currentQueryNotifications, completion: completion)
}
OperationQueue().addOperation(operation)
} else {
completion?(nil)
}
}
控制台上的输出是什么?
+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>+++++ , containerIdentifier=iCloud.pl.blueworld.fieldservice, badge=0>marked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as readmarked as read
最佳答案
关于为什么一直出现已读通知,文档直接与WWDC视频相矛盾。 Apple Docs清楚地说(强调):
If you mark one or more notifications as read using a CKMarkNotificationsReadOperation object, those notifications are not returned, even if you specify nil for previousServerChangeToken.
然而,WWDC 2014 视频 231 (Advanced Cloudkit) 清楚地表明,阅读通知不会被删除并且总是返回,因此用户的其他设备仍然可以看到它们.演示者甚至举了一个例子,引用了一个在所有设备上突出显示大笔交易的应用程序,一旦任何设备将通知标记为已读,任何其他设备都应该看到该“已读”通知并禁用突出显示。为此,他们必须能够仔细阅读标记为“已读”的通知。
因此,我们必须考虑通知的两个独立属性:
将您收到的更改 token 保存在提取的完成 block 中,并将其传递给后续的提取。这是确保设备只看到"new"通知的唯一方法。使用已读/未读状态了解用户是否已在另一台设备上对事件进行操作。
关于ios - CloudKit 中的 CKNotification 和 CKQueryNotification 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42733687/
要在私有(private) CKRecordZone 中添加 CKRecord,您需要确保该区域已经存在。 但这是否意味着每次我需要插入记录时,我都需要获取所有区域并使用 fetchAllRecord
我正在与 cloudkit 仪表板交互并查看我的应用程序收集的数据。 如何从仪表板导出所有数据(数据 -> csv 或 json),以便我可以对其进行一些分析? 谢谢! 最佳答案 我认为苹果永远不会提
我使用 Cloudkit 和私有(private)数据库将一些文件存储到 iCloud 并在 iOS 和 OSX 之间同步。现在我想实现一些东西,用户可以在不离开应用程序并查看首选项的情况下查看他的
我有两个看起来像这样的 CloudKit 数据对象: 父对象: { "records": [ { "recordName": "14102C0A-60F
有谁知道这个闭包中的String字段的用途public var recordWithIDWasDeletedBlock: ((CKRecordID, String) -> Void)?。我不知道它的用
我的应用程序在 CloudKit 中执行的几乎所有操作现在都会返回此错误: (lldb) po [error userInfo] { CKDHTTPHeaders = {
我在尝试初始化 Cloudkit schema 时遇到此错误: Error Domain=NSCocoaErrorDomain Code=134060 "A Core Data error occur
我正在更新 iOS13 之前的 Core Data 应用程序以使用 Core Data+CloudKit 同步来支持多个设备上的单个用户。同步应该是自动发生的,并且在我开发的一个中间步骤中它确实起作用
有没有办法使用 CloudKit 获取 iCloud 笔记?我看过文档: https://developer.apple.com/library/archive/documentation/DataM
swift 3.1,Xcode 8.3.3 我在 CloudKit 中有一个名为 Aircraft 的记录类型,它有一个名为 fieldValues 的字段,类型为 Reference List。 在
swift 3.1,Xcode 8.3.3 我在 CloudKit 中有一个名为 Aircraft 的记录类型,它有一个名为 fieldValues 的字段,类型为 Reference List。 在
当我尝试从 CloudKit Dashboard 查询 CloudKit 时,收到一条错误消息: There was a problem querying the “Entry” type. no a
出于某种原因,一小部分 iOS 10 用户无法从我的公共(public) iCloud 容器中读取数据。 CloudKit 返回的 localisedError 是“Account doesn't h
我有一个在 iOS 上运行良好的应用程序,但是当使用催化剂运行时,如果我在 macOS 上滑动到另一个虚拟桌面,然后再返回大约 10 次,它会间歇性地崩溃。它主要发生在 UICollectionVie
用户 B 从用户 A 拥有的共享记录中删除自己的正确方法是什么?我想我记得从一些 WWDC 视频中用户 B 会删除 CKShare来自他的共享数据库,但在查看用户 A 设备的权限时,该用户似乎仍然是参
对于我们的消息传递应用程序,如果我们将用户消息直接发送到 CloudKit (不做任何我们自己的加密),我们可以声称我们的应用程序是 end-to-end encrypted ,“只有通信用户可以阅读
我之前曾尝试使用 OSX/iOS 应用程序实现 CloudKit,由于我的强制症,我非常担心设备之间某些数据的优先级,以及可能丢失数据或恢复已删除的数据。 我的逻辑是,将从 iCloud 获取的数据和
Apple 发布了一种针对 CloudKit 的服务器到服务器进行身份验证的新方法。 https://developer.apple.com/library/content/documentation
因此根据Apple的文档,未登录iCloud的用户仍然可以从公共(public)数据库中读取数据,但是在查询公共(public)数据库时,我收到以下错误: Error Domain=NSCocoaEr
我需要创建一个CKQuery,其中谓词包含记录的引用,而不是记录的字段。 像这样 let query = CKQuery(recordType: "OUP", predicate: NSPredica
我是一名优秀的程序员,十分优秀!