2017-10-09 5 views
1

JohnがApp Aを開発し、HeatherがApp Bを開発したと仮定します。それぞれに異なるApple Developerのアカウントがあり、同じチームに所属していないか、関連付けられていません。 App Bは公開CloudKitデータベースによってバックアップされています。 App Aの公開CloudKitデータベースに書き込む方法はありますか?別のアプリのCloudKitデータベースにアクセスしていますか?

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

、その後に書き込むか、このDBから読み:つまり、アプリケーションAは、これを行うことができますか?

これは箱からは許可されていないと思いますが、これが可能なように認証を設定する方法はありますか?

+0

いいえこれはできません。それは良いことです。 – rmaddy

答えて

0

アプリが同じ組織内にあった場合、共有アクセスを設定する方法があります。しかし、あなたが状況を説明したように、それは不可能です。

+0

Herokuなどの他のクラウドデータベースを実行します。 al。このようなものを許可しますか?それとも、かなり一般的に、1つのアプリケーションが1つのデータベースを取得するのでしょうか? – 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

重要なステップは恥知らずにカット&ペーストされています...あなたは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 

///参加者を共有用に設定する(CK取得したIDの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) 

本当に私は記事の正義を行うことはできません、それを読む...それは3つの部分で!

+0

これは良い記事ですが、これは私が解決しようとしている問題ではありません。私はアプリの*ユーザー*との間でデータを共有したくありません。むしろ、私は同じ開発者が所有していない複数のアプリの中で1つのCloudKitデータベースを共有したいと考えています。私は代わりにFirebaseを使用することに決めました。 – mlecoz

+0

@mlecozあまりにもfirebaseを使ってみることにしましたが、気をつけてください。あなたがあまりにも遠くに入る前に、料金体系についてこの記事をお読みください。https://startupsventurecapital.com/firebase-costs-increased-by-7-000-81dc0a27271d – user3069232

関連する問題