2017-10-09 66 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

相關問題