我正在为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
1条答案
按热度按时间laawzig21#
UIViewControllerRepresentable
未正确实现。但实际上SwiftUI中已有ShareLink
提供此功能。示例代码请参见docs。