xcode SwiftUI CloudKit共享权限不符合预期

ig9co6j1  于 2023-01-10  发布在  Swift
关注(0)|答案(1)|浏览(147)

我正在为UICloudSharingController上的权限而苦苦挣扎。我有一个使用Core Data和CloudKit的SwiftUI应用程序。这个应用程序运行得很好a-所有设备上的所有数据都与iCloud同步。我想为用户提供与他人共享记录的选项。除了我努力通过编程控制权限之外,共享也能正常工作。理想情况下,我希望所有共享的访问权限为.allowPrivate only,然后包含一个开关,将权限设置为.allowReadOnly或. allowReadWrite。
当代码中显示的共享表没有权限限制,并且用户点击“共享选项”,然后选择“仅查看”时,共享表会正确显示此选项,并显示“被邀请的人只能查看”。

然而,一旦点击“与更多人共享”,权限就会重置为“只有被邀请的人才能编辑”。

如果用户随后点击该链接并再次点击“仅查看”,则许可再次变为“仅被邀请的人可以查看”。

点击一个被邀请者并发送消息会导致正确的共享,而用户只有只读访问权限。这显然是一个非常糟糕的用户体验。
苹果的文档中有几处提到,访问和权限可以通过一系列所需的权限来控制,但这对我不起作用。显然,我误解了一些东西。

这是我的控制器:

struct CloudSharingView: UIViewControllerRepresentable {

    //a switch sets this property
    @AppStorage("shareReadOnly") var shareReadOnly: Bool = true

    let share: CKShare
    let container: CKContainer
    //this is my Core Data Entity
    let recipe: Recipe

    func makeCoordinator() -> CloudSharingCoordinator {
        CloudSharingCoordinator(recipe: recipe)
    }

    func makeUIViewController(context: Context) -> UICloudSharingController {
        share[CKShare.SystemFieldKey.title] = recipe.rName
    
        let controller = UICloudSharingController(share: share, container: container)

        //this does not help
        //controller.availablePermissions = [.allowPrivate, .allowReadOnly]
        
        //this is what I want, but it does not work either
        /*
        if shareReadOnly {
            controller.availablePermissions = [.allowPrivate, .allowReadOnly]
        } else {
            controller.availablePermissions = [.allowPrivate, .allowReadWrite]
        }
        */

        controller.modalPresentationStyle = .formSheet
        controller.delegate = context.coordinator

        return controller
    }//make

    func updateUIViewController(_ uiViewController: UICloudSharingController, context: Context) {
        print("in update shareReadOnly is \(shareReadOnly.description)")
    }//update
}

final class CloudSharingCoordinator: NSObject, UICloudSharingControllerDelegate {
    let stack = CoreDataStack.shared
    let recipe: Recipe
    init(recipe: Recipe) {
        self.recipe = recipe
    }

    func itemTitle(for csc: UICloudSharingController) -> String? {
        recipe.rName
    }

    func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error) {
        print("Failed to save share: \(error)")
    }

    func cloudSharingControllerDidSaveShare(_ csc: UICloudSharingController) {
        print("Saved the share")
    }

    func cloudSharingControllerDidStopSharing(_ csc: UICloudSharingController) {
        if !stack.isOwner(object: recipe) {
            stack.delete(recipe)
        }
    }
}//coordinator

如有任何指导,将不胜感激。Xcode 14.2 iOS 16.2

laawzig2

laawzig21#

UIViewControllerRepresentable未正确实现。但实际上SwiftUI中已有ShareLink提供此功能。示例代码请参见docs

相关问题