2016-11-15 21 views
2

CloudKit共有の概念とWWDC 2016の「CloudKitの新機能」ビデオは、ユーザーが共有レコードを共有してアクセスできるようにするために必要なすべてのことを説明していません。CloudKit Sharing

私は自分のプライベートデータベースでレコードを作成および編集できるようにするためのアプリケーションを作成しました。 私はまた、共有レコードを作成し、提供を共有UIControllerを使用して、これを共有することができました。これは、参加者のユーザーが正常に受信して受け入れることができますが、この共有レコードを照会して表示する方法はわかりません。

アプリは、ユーザーのプライベートデータベースに「MainZone」を作成し、この「MainZone」にCKRecordを作成します。次に、CKShareレコードを作成して保存し、これを使用してUICloudSharingControllerを表示します。

このレコードにアクセスするには、sharedDatabaseをどのように照会しますか? - 私はAppDelegateで受け入れレコードを処理するために必要な、私は問題を発見

"ShareDB can't be used to access local zone" 

EDIT

:私はprivateDatabaseで使用されるが、次のエラーを取得されたのと同じクエリを使用して試してみました。今度はCloudKitダッシュボードに表示されますが、依然としてクエリを実行できません。それらを照会するには、sharedDatabase "MainZone"を取得する必要があるようです。

答えて

1

私はそれを持っています:まず、その共有レコードのCKRecordZoneを取得する必要があります。あなたは、次の操作を行って、それを実行します。

let sharedData = CKContainer.default().sharedCloudDatabase 
    sharedData.fetchAllRecordZones { (recordZone, error) in 
     if error != nil { 
      print(error?.localizedDescription) 
     } 
     if let recordZones = recordZone { 
      // Here you'll have an array of CKRecordZone that is in your SharedDB! 
     } 
    } 

、手でその配列を使用して、あなたがしなければならないすべてが正常にフェッチされます。

func showData(id: CKRecordZoneID) { 

    ctUsers = [CKRecord]() 

    let sharedData = CKContainer.default().sharedCloudDatabase 
    let predicate = NSPredicate(format: "TRUEPREDICATE") 
    let query = CKQuery(recordType: "Elder", predicate: predicate) 

    sharedData.perform(query, inZoneWith: id) { results, error in 
     if let error = error { 
      DispatchQueue.main.async { 
       print("Cloud Query Error - Fetch Establishments: \(error)") 
      } 
      return 
     } 
     if let users = results { 
      print(results) 
      self.ctUsers = users 
      print("\nHow many shares in cloud: \(self.ctUsers.count)\n") 
      if self.ctUsers.count != 0 { 
       // Here you'll your Shared CKRecords! 
      } 
      else { 
       print("No shares in SharedDB\n") 
      } 
     } 
    } 
} 
+0

私はこのアプローチをお勧めしません。何百万人ものユーザーが物事を共有しているとどうなりますか?何百万ものレコードゾーンが存在するため、このクエリは非常に大きくなる可能性があります。私は正しいアプローチは、あなたのユーザーと共有されているものへのローカル参照を格納し、これらを使用して変更を照会するように思えると思います。私はこの考え方もクエリを最小限に抑え、変更を登録してから変更を処理することだと考えていますが、状況によってはあまりにも多くのプッシュトラフィックが発生する可能性も懸念しています。 –

+0

Mmm - 実際には、ユーザーは共有されているレコードのゾーンのみを表示するので、正しいかもしれません。 –

0

私はかなりよく理解していませんでしたあなたはそれらの情報を取得したいと思います。私はあなたと同じ問題でんだけど、私はあなたは2つの機能が必要になりますことを行うには... URLをクリックすることにより、共有データを取得することができます。 AppDelegateでまず1:

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata) { 

    let acceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata]) 
    acceptSharesOperation.perShareCompletionBlock = { 
     metadata, share, error in 
     if error != nil { 
      print(error?.localizedDescription) 
     } else { 
      let viewController: ViewController = self.window?.rootViewController as! ViewController 
      viewController.fetchShare(cloudKitShareMetadata) 
     } 
    } 
    CKContainer(identifier: cloudKitShareMetadata.containerIdentifier).add(acceptSharesOperation) 
} 

ViewConrollerあなたはこのメタデータをフェッチする機能を持っている:私が前に言ったように、私は今なしShareDBを取得しようとしている、

func fetchShare(_ metadata: CKShareMetadata) { 
    let operation = CKFetchRecordsOperation(recordIDs: [metadata.rootRecordID]) 
    operation.perRecordCompletionBlock = { record, _, error in 
     if error != nil { 
      print(error?.localizedDescription) 
     } 
     if record != nil { 
      DispatchQueue.main.async() { 
       self.currentRecord = record 
       //now you have your Shared Record 
      } 
     } 
    } 
    operation.fetchRecordsCompletionBlock = { _, error in 
     if error != nil { 
      print(error?.localizedDescription) 
     } 
    } 
    CKContainer.default().sharedCloudDatabase.add(operation) 
} 

をURLにアクセスする。すでに共有を受け入れたら、私はリンクに頼りたくはありません。これがあなたを助けることを願って!

+0

おかげで、これは理にかなっているが、どのように私はすべての共有を照会しますデータベースからのレコード、またはアプリケーションがこれらの共有レコードのコピーを(ローカルまたはプライベートデータベースのいずれかに)保持することが予想されるアプリケーションですか?私はちょうど共有レコードを照会したいが、各共有ゾーンを照会する以外にそれをする手立てはないと思わローカルにデータを保存する必要はありません。 –

+0

悲しいことに、私はこれを、それを理解しようと、あなたと同じ場所にいますよ。共有されたコンテンツはあなたのprivateDBに残らず、sharedDBにとどまります。私がしようとしたのは、通常のCKRecordのようなクエリでした。結局のところ、CKShareはCKRecordへの参照です!私は* zoneidを*でクエリを実行したら、しかし、私はあなたが私が正常に動作するzoneidに記録するzoneid、クエリを確認し –

+0

「ShareDBがローカルゾーンにアクセスするために使用することはできません」だと同じメッセージが表示されました。だからプライベートデータベースのzoneIDを保持し、レコードのzoneIDと比較し、一致しない場合はsharedDatabaseクエリでなければならず、次にzoneIDがクエリに必要であることがわかります。ここでは、すべての共有ゾーンIDのコピーをprivateDatabaseに保存して、sharedDatabaseでどのゾーンを照会するかを簡単に知ることができます。 –