代码之家  ›  专栏  ›  技术社区  ›  Clifton Labrum

如果所有者将我从Cloudkit上的ckshare中删除,如何得到通知

  •  1
  • Clifton Labrum  · 技术社区  · 7 年前

    假设一张唱片的所有者和我分享了它。我收到一个共享链接,我打开它并接受如下共享:

    let operation = CKAcceptSharesOperation(shareMetadatas: [metadata])
    operation.acceptSharesCompletionBlock = { error in
      if let error = error{
        print("accept share error: \(error)")
      }else{
        //Share accepted...
      }
    }
    CloudKit.container.add(operation)
    

    我以前也订阅了 共享 数据库已经这样了:

    let subscriptionSharedDatabase = CKDatabaseSubscription(subscriptionID: "subscriptionSharedDatabase")
    let sharedInfo = CKSubscription.NotificationInfo()
    sharedInfo.shouldSendContentAvailable = true
    sharedInfo.alertBody = "" //This needs to be set or pushes don't get sent
    subscriptionSharedDatabase.notificationInfo = sharedInfo
    
    let subShared = CKModifySubscriptionsOperation(subscriptionsToSave: [subscriptionSharedDatabase], subscriptionIDsToDelete: nil)
    CloudKit.sharedDB.add(subShared)
    

    但现在让我们假设 CKShare 将我作为参与者删除 并将更新的参与者列表保存到Cloudkit。

    据我所知, 只有 我收到的通知是另一个共享数据库订阅( subscriptionSharedDatabase )更改,但没有任何记录被更改或删除(我在获取记录时查看了并且没有更改的记录)。

    据我所知,唯一的方法是通知参与者 CKshare公司 是订阅上的通知 cloudkit.share 记录类型,但在共享数据库中不可用,对吗?

    当我从 CKshare公司 ?

    0 回复  |  直到 7 年前
        1
  •  1
  •   Jaanus    7 年前

    有趣的是,这没有答案。我刚刚实现了一些与ckshare相关的代码,它看起来工作得相当好。这是基本方法。

    1)在我的应用程序开始时,我会 CKFetchRecordZonesOperation.fetchAllRecordZonesOperation() 在共享数据库上,获取与我共享的所有当前记录区域。

    2)我设置 CKDatabaseSubscription 根据您的建议在共享数据库上。

    3)在共享数据库上收到此通知后,我将执行批处理 CKFetchRecordZoneChangesOperation 在所有共享记录区域中。(您可以将多个记录区域以及每个区域的服务器更改令牌传递给它,以执行批量更新查询。)

    4)如果任何股份未共享,但记录区本身仍然有效,我观察到 recordWithIDWasDeletedBlock 运行两次,一次不共享 CKRecord 一旦与相关 CKShare .

    5)(我还没有完全理解这一部分)如果共享是给定用户的最后一个共享,那么该用户的整个共享记录区域将从我的共享数据库中删除。我还没有完全弄清楚如何最好地处理这一部分。每次我得到一个 CKDatabaseNotification 但这似乎是浪费。我看到我能跑了 CKFetchDatabaseChanges 告诉我变化区域的操作,但我还没有找出运行它的最佳时间。

    推荐文章