2017-10-09 109 views
1

假设John开发了应用程序A并且Heather开发了应用程序B.他们各自拥有不同的Apple开发人员帐户,并且他们不在同一个团队中或以任何方式关联。应用程序B由公共CloudKit数据库提供支持。有没有办法让App A写入App B的公共CloudKit数据库?也就是说,App A可以这样做:访问其他应用程序的CloudKit数据库?

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

然后写入或读取这个DB

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

+0

不,没有办法做到这一点。这是一件好事。 – rmaddy

回答

0

如果应用程序在同一个组织中,则可以设置共享访问权限。但正如你所描述的那样,这是不可能的。

+0

做其他云数据库,如Heroku等。人。允许这样的事情?或者一般情况下,一个应用程序获取一个数据库? – mlecoz

+1

大多数其他解决方案(除了CloudKit)可以在多个应用程序之间共享。这是否是一个好主意取决于你的用例。 – picciano

0

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

CloudKit share Data between different iCloud accounts but not with everyonehttps://stackoverflow.com/users/1878264/edwin-vermeer所述,是一个iCloud专家。

此链接上还有第三方解释。 https://medium.com/@kwylez/cloudkit-sharing-series-intro-4fc82dad7a9

关键步骤无耻cut'n'pasted ...确保您阅读并授予Cory在medium.com!

// 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 

///设置分享参与者(参加CK UserIdentityLookupInfo来自您提取的身份)

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) 

真的,我不能希望做文章正义,去读它......它分三部分!

+0

这是一篇很好的文章,但这不是我想要解决的问题。我不想在应用程序的*用户*之间共享数据;相反,我想在不属于同一开发人员的多个应用中共享一个CloudKit数据库。我决定改用Firebase来代替。 – mlecoz

+0

@mlecoz我看着,决定尝试使用firebase,但要小心;在阅读本文之前,请先阅读这篇关于定价结构的文章。https://startupsventurecapital.com/firebase-costs-increased-by-7-000-81dc0a27271d – user3069232

相关问题