如何获取已存在共享的CKShare对象(以获取共享URL)

问题描述 投票:0回答:1

我试图让我的应用程序的用户能够检索到他们已经共享的记录的iCloud共享链接。我可以通过使用let share = CKShare(rootRecord: CKRecord)然后使用Apple的UISharingController来创建共享时获取URL。但是,每次使用此方法时,旧链接都将变为无效,并将其他链接从已加入的共享中踢出。如何允许用户(记录所有者)随时获取记录CKShare对象的可共享URL?

//Initially shares the record
let share = CKShare(rootRecord: newRecord)
share[CKShare.SystemFieldKey.title] = "Group" as CKRecordValue?        
let modifyRecordsOperation = CKModifyRecordsOperation( recordsToSave: [newRecord, share], recordIDsToDelete: nil)

//Activates the UISharingController (code not shown)
ios swift cloudkit cloudkit-sharing
1个回答
0
投票

听起来你在这里遇到了很多问题。我建议仔细浏览一下UICloudSharingController documentation

第一个问题出现在你提供的代码中,每次创建一个新的共享,当你想要做的就是创建一次,然后在你想要与之交互时显示该共享(包括获取共享) URL)。创建共享后,您可能希望以某种方式在设备上保留它(它可以像在UserDefaults中存储一样简单)。

第二个问题是听起来你没有正确地实例化UICloudSharingController。当您最初创建CKShare时,您必须使用UICloudSharingController init(preparationHandler:)初始化程序并创建其内部共享。

根据不同初始化程序的文档(强调我的):

重要

您必须使用正确的初始化方法初始化控制器。如果CKRecord已经共享,请不要使用init(prepareHandler :)。同样,如果CKRecord未共享,请不要使用init(share:container :)。保存记录时,使用错误的初始化程序会导致错误。

然后,当您想要显示shareSheet时,使用UICloudSharingController init(share:container:)初始化程序,并将其保存到设备的共享。

以下是UICloudSharingController文档中提供的用于创建CKShare的代码:

func presentCloudSharingController(_ sender: Any) {  guard
    let barButtonItem = sender as? UIBarButtonItem,
    let rootRecord = self.recordToShare else {
    return
  }

  let cloudSharingController = UICloudSharingController { [weak self] (controller, completion: @escaping (CKShare?, CKContainer?, Error?) -> Void) in
    guard let `self` = self else {
      return
    }
    self.share(rootRecord: rootRecord, completion: completion)
  }

  if let popover = cloudSharingController.popoverPresentationController {
    popover.barButtonItem = barButtonItem
  }
  self.present(cloudSharingController, animated: true) {}
}

func share(rootRecord: CKRecord, completion: @escaping (CKShare?, CKContainer?, Error?) -> Void) {
  let shareRecord = CKShare(rootRecord: rootRecord)
  let recordsToSave = [rootRecord, shareRecord];
  let container = CKContainer.default()
  let privateDatabase = container.privateCloudDatabase
  let operation = CKModifyRecordsOperation(recordsToSave: recordsToSave, recordIDsToDelete: []) 
  operation.perRecordCompletionBlock = { (record, error) in
    if let error = error {
      print("CloudKit error: \(error.localizedDescription)")
    }
  }

  operation.modifyRecordsCompletionBlock = { (savedRecords, deletedRecordIDs, error) in
    if let error = error {
      completion(nil, nil, error)
    } else {
      completion(shareRecord, container, nil)
    }
  }

  privateDatabase.add(operation)
}

下次你想展示它时,它会更直接:

 let share = // yourCKShare
 let container = // yourCKContainer
 let viewController = // yourViewController
 let shareController = UICloudSharingController(share: share, container: container)
 viewController.present(shareController, animated: true)

最后,为了回答问题的URL部分,UICloudSharingController用于所有共享内容 - 当控制器显示共享时,所有者可以使用“复制链接”按钮(如果允许公共,也可以使用用户)访问 - 我没有看过,因为我的东西是私人的):

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.