如何接收有关与我共享的记录中所做更改的cloudkit通知?

问题描述:

我在两个不同的设备上有两个icloud帐户(AB)。从其中一人(一个)我分享ckrecord到另一个()是这样的:如何接收有关与我共享的记录中所做更改的cloudkit通知?

let controller = UICloudSharingController { controller, preparationCompletionHandler in 

    let share = CKShare(rootRecord: record) 
    share[CKShareTitleKey] = "title" as CKRecordValue 

    share[CKShareTypeKey] = "pl.blueworld.fieldservice" as CKRecordValue 
    share.publicPermission = .readWrite 

    let modifyOperation = CKModifyRecordsOperation(recordsToSave: [record, share], recordIDsToDelete: nil) 
    modifyOperation.savePolicy = .ifServerRecordUnchanged 
    modifyOperation.perRecordCompletionBlock = { record, error in 
     print(error?.localizedDescription ?? "") 
    } 

    modifyOperation.modifyRecordsCompletionBlock = { records, recordIds, error in 

     print(share.url) 
     preparationCompletionHandler(share, CloudAssistant.shared.container, error) 
    } 

    CloudAssistant.shared.container.privateCloudDatabase.add(modifyOperation) 
} 

controller.delegate = self 

UIViewController.top()?.present(controller, animated: true) 

当第二设备()没有接受cloudkit份额我取的记录和认购的变化:

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata) { 

    let acceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata]) 
    acceptSharesOperation.perShareCompletionBlock = { metadata, share, error in 

     if let error = error { 
      UIAlertController.show(withMessage: error.localizedDescription) 
     } else { 

      let operation = CKFetchRecordsOperation(recordIDs: [cloudKitShareMetadata.rootRecordID]) 
      operation.perRecordCompletionBlock = { record, _, error in 

       if let error = error { 
        UIAlertController.show(withMessage: error.localizedDescription) 
       } else if let record = record { 
        CloudAssistant.shared.save(records: [record], recordIDsToDelete: []) 

        let options: CKQuerySubscriptionOptions = [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion] 
        let territorySubscription = CKQuerySubscription(recordType: "Territory", predicate: NSPredicate(value: true), options: options) 

        let notificationInfo = CKNotificationInfo() 
        notificationInfo.shouldBadge = false 
        notificationInfo.shouldSendContentAvailable = true 

        territorySubscription.notificationInfo = notificationInfo 

        CloudAssistant.shared.sharedDatabase?.save(territorySubscription) { _, _ in } 
       } 
      } 

      CloudAssistant.shared.container.sharedCloudDatabase.add(operation) 
     } 
    } 
    acceptSharesOperation.qualityOfService = .userInteractive 
    CKContainer(identifier: cloudKitShareMetadata.containerIdentifier).add(acceptSharesOperation) 
} 
从设备

现在成功地(我知道这一点,改变保存在iCloud中)进行更新Ø与他人分享的记录。但设备B不知道这一点,除非我再次手动获取记录。

但从另一方面来说,它工作得很好。

如果我成功上则设备一个 mnagically得到一个变革,一切通知是罚款与我分享(器件)的记录进行更新。什么改变了?

如何订阅与我共享的记录更改?

P.S当我将能够开始200或甚至更多的人来帮助我这个人。

iOS的11,斯威夫特4时,Xcode 9

+0

我的理解是 - “当所有者修改共享记录时,其他设备没有获得有关通知的更新,但其他方式运行良好”? – manismku

+0

......现在是这样的 –

+0

您是否注册过其他设备上的推送通知?推送通知的 – manismku

这是我在调试无法按预期出现订阅通知清单。听起来你可能已经排除了其中一些。

  1. 确保应用程序注册为通知
  2. 确保通知在设备上启用该应用
  3. 确保所有设备都使用相同的容器
  4. 在下一个应用程序启动时,读所有订阅使用fetchAllSubscriptionsWithCompletionHandler和NSLog每个子的详细信息(特别是:subscriptionID,触发选项,记录类型和谓词)。验证预期的潜艇是否存在。验证每个子句的谓词是否符合期望值(在这种情况下,比较两个设备上找到的谓词)。

我浪费了很多时间调试时“失踪”的通知:

  1. 我本地建立的版本用的是测试环境和TestFlight用户进行访问PROD环境。调试步骤2发现了这一点。
  2. 当无意中重新使用订阅ID时,每个新版本都覆盖了之前的版本。调试步骤4最终发现问题

到目前为止,这四个调试步骤帮助我理解了所有“缺少通知”问题。一旦我明白了为什么notifs没有出现,就缩小了哪个代码块的责任。

+0

要提取订阅,您需要首先订阅更改...并且这种情况...它不工作...我订阅更改,但它仍然没有从记录的所有者那里收到通知(但是所有者从其他用户获得通知) –

+0

当您在用户的计算机上调用FetchAllSubscriptions时,会找到多少个潜在客户?你有多少期望? – Thunk

+0

获取所有订阅的原因是什么?他们可能会被提取用于数据库。我想我需要他们共享数据库,对吧?我会在一天内检查它...... –