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

Posted

技术标签:

【中文标题】访问另一个应用程序的 CloudKit 数据库?【英文标题】:Accessing another app's CloudKit database? 【发布时间】:2017-10-09 20:45:33 【问题描述】:

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

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

然后写入或读取此DB

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

【问题讨论】:

没有。这是不可能的。这是一件好事。 【参考方案1】:

这看起来/听起来像您寻求的解决方案。

CloudKit share Data between different iCloud accounts but not with everyone 由 SO 的 iCloud 专家 https://***.com/users/1878264/edwin-vermeer 概述。

此链接上也有第三方解释。 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)

真的我不能希望文章公正,去阅读它......它分为三个部分!

【讨论】:

这是一篇好文章,但这不是我要解决的问题。我不想在应用的用户之间共享数据;相反,我想在不属于同一开发人员的多个应用程序之间共享一个 CloudKit 数据库。我决定改用 Firebase。 @mlecoz 我调查并决定尝试使用firebase,但要小心;在深入了解之前阅读这篇关于定价结构的文章。startupsventurecapital.com/…【参考方案2】:

如果应用位于同一组织中,则可以设置共享访问权限。但正如你所描述的情况,这是不可能的。

【讨论】:

做其他云数据库,比如 Heroku 等。人。允许这样的事情吗?还是一个应用程序获得一个数据库的情况很普遍? 大多数其他解决方案(除了 CloudKit)可以在多个应用程序之间共享。这是否是一个好主意取决于您的用例。

以上是关于访问另一个应用程序的 CloudKit 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

通过 cloudKit 云或解析方案数据

多个应用程序用户访问 CloudKit 中的私有数据库

无法从应用程序扩展访问我的“CKContainer”中的任何数据 - CloudKit,Swift

我可以将 CloudKit 数据转移到新的 Container 中吗?

在禁用 iCloud 驱动器的情况下运行 CloudKit 应用程序

用于网站和 iOS 的 CloudKit