访问另一个应用程序的 CloudKit 数据库?

Accessing another app's CloudKit database?

假设 John 开发了 App A,Heather 开发了 App B。他们每个人都有不同的 Apple Developer 帐户,并且他们不属于同一个团队或以任何方式关联。应用程序 B 由 public CloudKit 数据库支持。 App A 有没有办法写入 App B 的 public CloudKit 数据库?即,App A 可以这样做吗:

let DB = CKContainer(identifier: "iCloud.com.Heather.AppB").publicCloudDatabase

然后写入或读取此 DB?

我猜这是不允许开箱即用的,但是有没有办法设置身份验证,这样就可以了?

如果应用程序在同一个组织中,则可以设置共享访问权限。但是按照你描述的情况,是不可能的。

这 looks/sounds 喜欢您寻求的解决方案。

as outlined by https://whosebug.com/users/1878264/edwin-vermeer SO 上的 iCloud 专家。

这个link也有第三方的解释。 https://medium.com/@kwylez/cloudkit-sharing-series-intro-4fc82dad7a9

关键步骤无耻地剪切'n'粘贴...确保您在 medium.com!

上阅读并归功于 Cory
// Add an Info.plist key for CloudKit Sharing
 <key>CKSharingSupported</key>
 <true/>

更多代码...

CKContainer.default().discoverUserIdentity(withPhoneNumber: phone, completionHandler: {identity, error in

        guard let userIdentity: CKUserIdentity = identity, error == nil else {

            DispatchQueue.main.async(execute: {
                print("fetch user by phone error " + error!.localizedDescription)
            })

            return
        }

        DispatchQueue.main.async(execute: {
            print("user identity was discovered \(identity)")
        })
    })

/// 创建切碎根记录

let recordZone: CKRecordZone = CKRecordZone(zoneName: "FriendZone")
let rootRecord: CKRecord = CKRecord(recordType: "Note", zoneID: recordZone.zoneID)

// 创建一个CloudKit 分享记录

let share = CKShare(rootRecord: rootRecord)

share[CKShareTitleKey] = "Shopping List” as CKRecordValue
share[CKShareThumbnailImageDataKey] = shoppingListThumbnail as CKRecordValue
share[CKShareTypeKey] = "com.yourcompany.name" as CKRecordValue

/// 设置共享参与者(从您获取的身份中获取 CKUserIdentityLookupInfo)

let fetchParticipantsOperation: CKFetchShareParticipantsOperation = CKFetchShareParticipantsOperation(userIdentityLookupInfos: [userIdentity])

fetchParticipantsOperation.fetchShareParticipantsCompletionBlock = {error in

if let error = error {
    print("error for completion" + error!.localizedDescription)
}
}

fetchParticipantsOperation.shareParticipantFetchedBlock = {participant in

print("participant \(participant)")
/// 1
participant.permission = .readWrite

/// 2
share.addParticipant(participant)

let modifyOperation: CKModifyRecordsOperation = CKModifyRecordsOperation(recordsToSave: [rootRecord, share], recordIDsToDelete: nil)

modifyOperation.savePolicy = .ifServerRecordUnchanged
modifyOperation.perRecordCompletionBlock = {record, error in
    print("record completion \(record) and \(error)")
}
modifyOperation.modifyRecordsCompletionBlock = {records, recordIDs, error in

    guard let ckrecords: [CKRecord] = records, let record: CKRecord = ckrecords.first, error == nil else {
        print("error in modifying the records " + error!.localizedDescription)
        return
    }

    /// 3
    print("share url \(url)")
}

CKContainer.default().privateDB.add(modifyOperation)
}

CKContainer.default().add(fetchParticipantsOperation)

在围栏的另一边。

let acceptShareOperation: CKAcceptSharesOperation =     CKAcceptSharesOperation(shareMetadatas: [shareMeta])
    acceptShareOperation.qualityOfService = .userInteractive
    acceptShareOperation.perShareCompletionBlock = {meta, share, error in
        Log.print("meta \(meta) share \(share) error \(error)")
    }
    acceptShareOperation.acceptSharesCompletionBlock = {error in
        Log.print("error in accept share completion \(error)")
        /// Send your user to wear that need to go in your app
    }

    CKContainer.default().container.add(acceptShareOperation)

真的,我不能指望公正地对待这篇文章,去读吧……它分为三个部分!