4

私は、CloudKit公開されているデータを保存するために使用してNSPersistentCloudKitContainerおり、コア データ スタックの一部として新しいものを使用して、プライベート データを保存/同期しています。

ユーザーがアプリを開くと、次の 4 つの状態のいずれかになります。

  1. 彼らはiCloudにアクセスできる新しいユーザーです
  2. 彼らはiCloudにアクセスできるリピーターです
  3. 彼らは新しいユーザーですが、何らかの理由でiCloudにアクセスできません
  4. 彼らはリピーターですが、何らかの理由で iCloud にアクセスできません。

状態 1 と 2 は、私の幸せな道を表しています。彼らが新しいユーザーである場合、最初のビューを表示する前に、ユーザーのプライベート ストアにデータをシードしたいと思います。彼らがリピーターの場合は、Core Data からデータを取得して初期ビューに渡したいと思います。

新しい/古いユーザーの決定: 私の計画は を使用することNSUbiquitousKeyValueStoreです。これに関する私の懸念は 、アプリをダウンロードする->以前にアプリを起動したことが記録されている->新しいデバイスでアプリを削除して再インストール/インストールする場合の処理​​です。更新を受け取るには時間がかかる と思わNSUbiquitousKeyValueStoreれるので、最初のビューに移動する前に、同期が完了するまで待ちます。次に、iCloud にアクセスできない場合はどうなるかという問題があります。NSUbiquitousKeyValueStoreアップデートを受け取れない場合、彼らがリピーターかどうかはどうすればわかりますか?

iCloud アクセスの決定: 私が行った調査に基づいて、iCloud が利用可能かどうかを確認することFileManager.default.ubiquityIdentityTokenはできますが、理由nilはわかりません。iCloud が利用できない理由を知るために使用する必要があります。問題は、非同期呼び出しであり、アカウントのステータスが何であるかを知る前に、アプリが先に進んでしまうことです。CKContainer.default().accountStatus

私は本当にこれに頭を悩ませています。これらすべての状態が適切に処理されるようにする最善の方法は何ですか?

4

2 に答える 2

1

私も最近この問題に苦労しました。私が思いついた解決策は、CloudKit を使用して iCloud に直接クエリを実行し、初期化されているかどうかを確認することでした。それは実際には非常に簡単です:

public func checkRemoteData(completion: @escaping (Bool) -> ()) {
    let db = CKContainer.default().privateCloudDatabase
    let predicate = NSPredicate(format: "CD_entityName = 'Root'")
    let query = CKQuery(recordType: .init("CD_Container"), predicate: predicate)
    db.perform(query, inZoneWith: nil) { result, error in
        if error == nil {
            if let records = result, !records.isEmpty {
                completion(true)
            } else {
                completion(false)
            }
        } else {
            print(error as Any)
            completion(false)
        }
    }
}

Containerこのコードは、派生モデル (この場合は と呼ばれる) を持つエンティティのインスタンスがある、より複雑なケースを示していますRoot。私は似たようなものを持っていて、ルートの存在をデータが設定された証拠として使用できました。

Core Data 情報が iCloud に引き継がれる方法に関する直接のドキュメントについては、こちらを参照してください: https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data

于 2020-05-27T13:19:03.600 に答える