云套件:如何仅从您的联系人组获取公共数据库订阅通知

Posted

技术标签:

【中文标题】云套件:如何仅从您的联系人组获取公共数据库订阅通知【英文标题】:Cloud kit: how to get public database subscription notification from your group of contacts only 【发布时间】:2021-05-24 19:28:44 【问题描述】:

我在公共数据库中有位置详细信息的 CKRecord。我想为存储在公共数据库中的具有位置详细信息的 CKrecord 创建订阅。我想设置订阅,所以我只收到来自我的联系人组中的通知。 Location CKrecord 上的订阅通知会通知我所有用户需要更多时间来整理,我想避免这种情况。

如何设置订阅?

【问题讨论】:

这在一定程度上取决于您的数据结构。您的 Location 记录类型是否有一个 CKReference 字段指向您的 Contact 记录类型? 当我指的是联系人时,我指的是我的 iphone 联系人。我所有的 iphone 联系人可能不是应用程序用户。如果我创建一个 CKRecordContact 来代表我的联系人并将其指向位置,我仍然必须拉下所有 iphone 用户的所有 CKRecordContact,然后搜索我的联系人,然后拉位置。如何将搜索最小化到我的 iphone 联系人?我希望我已经解释清楚了 在我看来你走错了方向。您应该首先从手机中提取联系人,然后执行 CKQueryNSPredicate,将搜索限制为手机上的联系人。然后,您将只获取您需要的CKRecords。 我可以拉联系人。现在我如何限制我只搜索来自云端的联系人。我的 NSPredicate 和 CKQuery 应该是什么样的?可以分享一下代码吗? 【参考方案1】:

假设您的 Location 记录类型上有某种 userEmail 字段,您可以像这样查询这些记录:

let predicate = NSPredicate(format: "userEmail = %@", argumentArray: ["name@example.com"])
  
let query = CKQuery(recordType: "Location", predicate: predicate)
let operation = CKQueryOperation(query: query)
  
var records = [CKRecord]()
operation.recordFetchedBlock =  record in
  records.append(record)


operation.queryCompletionBlock =  cursor, error in
  print("Done.")
  print(records)


CKContainer(identifier: "iCloud.yourContainer").publicCloudDatabase.add(operation)

【讨论】:

好吧,我可以传递我的联系人的电子邮件数组来获取所有位置记录。但是如何才能将我的联系人最小化为仅安装了该应用程序的人?有没有办法找出谁安装了该应用程序,然后只发送那些联系人的电子邮件以获取记录。 不,您必须查询所有联系人的所有电子邮件。当记录从CKQuery 返回时,您将知道谁安装了该应用程序。事实的来源是 CloudKit。您的联系人不会存储有关谁安装了您的应用的任何信息。 好的,所以如果用户的记录回来了,那么用户已经安装了应用程序,否则视为否? 是的,您在公共数据库中的Users 表对于安装了您的应用程序的每次使用都有一个唯一的recordName。这样您就知道是谁安装了它并开始与 CloudKit 交互。 好的。我仍在开发中,没有用户安装该应用程序。那么我应该如何设置它以进行跨用户测试呢?如果我在具有不同 Apple ID 的不同手机上运行该应用程序,它会在公共数据库的用户表中创建记录吗?

以上是关于云套件:如何仅从您的联系人组获取公共数据库订阅通知的主要内容,如果未能解决你的问题,请参考以下文章

如何确保只有特定域可以从您的 REST api 查询?

云套件。订阅问题

在 sharedDB cloudkit 中订阅记录更改

如何在不请求通知权限的情况下获取 Firebase 云消息传递的注册令牌?

如何从 ios 应用程序获取手表套件扩展集中的通知?

如何仅从 ResultSet 中获取第一行