問題タブ [nspersistentcloudkitcontainer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - Cloud Kit コア データ レコードのクエリ
CloudKit を使用してコア データを保存し、デバイス間で同期できるように移行しようとしているアプリがあります。
同期は正常に機能しています。私が抱えている問題は、アプリが初期データをデータベースに追加することです。これにより、別のデバイスにインストールすると複製が発生します。現在、最初の実行が実行された場合、ローカルにブール値を保存するためにユーザーのデフォルトを使用していますが、これは明らかにデバイスごとにのみ機能します
データがクラウドに既に存在するかどうかを確認し、初期データの追加を防ぐ方法はありますか?
Apple のドキュメントでは、オブジェクトが既に存在するが、最初の起動時にローカル ストアにオブジェクトがない場合に、その可能性が示唆されています。 https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data
core-data - NSPersistentCloudKitContainer がバックグラウンドで同期しない
現在、NSPersistentCloudKitContainerをテストしています。新しいドキュメントのガイドラインに厳密に従っています。基本的にすべてが希望どおりに機能します。説明でオプションNSPersistentStoreRemoteChangeNotificationPostOptionKeyを使用して、リモート データ ストアから更新を受け取ります。ただし、リモート データベースからの更新は、アプリがフォアグラウンドにある場合にのみ配信されます。しかし、バックエンドのデータ変更に基づいてウィジェットを更新したいと考えています。
この問題を解決する方法を知っている人はいますか?
私がこれまでにやったこと:
- 機能のバックグラウンド モードが有効になっています
- プッシュ通知が有効になっています
- 私は registerForRemoteNotifications を呼び出しました
- PersistentStore の説明で HistoryTracking と RemoteChange オプションが有効になっている
同期はフォアグラウンドで機能します ✅</p>
アプリがバックグラウンドの場合、同期は機能しません ❌</p>
編集: 09.09.2020
現時点で私たちにできることは何もないようです。Apple 開発者サポートが数日前に私の質問に答えました
Apple Developer Technical Support (DTS) にお問い合わせいただきありがとうございます。あなたが説明する動作とその結果生じる制限は、設計によるものです。Apple が別のアプローチを検討する必要があると思われる場合は、この設計上の決定がお客様に与える影響と、別の方法を希望する点についての情報を添えて、機能強化リクエストを提出することをお勧めします。動作が変更されるという保証はありませんが、決定を担当するチームが問題に関するあなたの考えを確認できるようにする最善の方法です。このリクエストに対して、テクニカル サポート インシデント (TSI) が最初に Apple Developer Program アカウントから引き落とされましたが、代わりのインシデントがアカウントに割り当てられました。
core-data - CoreData+CloudKit アプリで履歴を削除する方法は?
私のアプリは、iCloud をバックエンドとして CoreData を使用しています。したがって、複数のデバイスが iCloud データベースにアクセスできます.public
。
ローカルの CoreData ストアは、NSPersistentCloudKitContainer
. Apple の提案
に従って、履歴追跡を使用しています。
そこで、Apple は可能な限り履歴を削除することを提案しています。彼らが言うには
永続的な履歴追跡トランザクションはディスク上のスペースを占有するため、不要になったトランザクションを削除するためのクリーンアップ戦略を決定します。履歴をプルーニングする前に、単一のゲートキーパーが、アプリとそのクライアントが必要な履歴を消費したことを確認する必要があります。
もともとこれは、 26 :10 から始まるWWDC 2017 トークでも提案されていました。
私の質問は次のとおりです。この単一のゲートキーパーを実装するにはどうすればよいですか?
アプリのすべてのユーザーがデバイスを最後に同期した時刻を単一のインスタンスが認識しているという考えだと思います。その場合、この日付より前のトランザクションの履歴は削除できます。
しかし、ユーザーがローカル データを同期した後、アプリを長期間使用しなくなった場合はどうなるでしょうか。この場合、このユーザーがローカル データを再度同期するまで、履歴を整理することはできません。したがって、履歴データは任意に大きくなる可能性があります。これは、解決方法がわからない中心的な問題のように思えます。
上記のAppleのドキュメントは次のことを示唆しています:
履歴のフェッチと同様に、deleteHistory(before:) を使用して、トークン、トランザクション、または日付より古い履歴を削除できます。たとえば、7 日以上経過したすべてのトランザクションを削除できます。
しかし、これで問題が解決するわけではありません。
この一般的な問題とは別に、ローカル データベースが最後に更新された日付をすべてのデバイスに対して直接 (つまり、CoreData なしで) 格納するパブリック iCloud データベースに iCloud レコード タイプを用意するというのが私の考えです。すべてのデバイスがこれらのレコードを読み取ることができるため、すべてのローカル データベースが最後に更新されたのはいつかを簡単に特定でき、この日付より前の履歴を削除できます。
これは問題を処理する正しい方法ですか?
core-data - 関係の名前を変更するときの Core Data と CloudKit の統合の問題 (コード 134110)
私は現在、App Store で Core Data を使用したアプリを持っています。このアプリを使用すると、人々は水やセーリングのアクティビティを記録できます (セーラー向けの Strava のようなものだと考えてください)。私は 3 年間アプリを更新していません。アプリは最新の iOS バージョンで問題なく動作しているようですが、最近アプリを改善する計画を立てました。
現在、このアプリの更新に取り組んでおり、データ モデルとスキーマを変更する必要があります。自動軽量移行を希望します。一部のエンティティ、プロパティ、および関係の名前を変更しましたが、エディターの名前変更 ID フィールドに以前の ID を入力したことを確認しました。CloudKit で更新されたスキーマを同期する機会を利用したいと考えています。Apple Developer documentation の指示に従って、同期をセットアップしました。また、initializeCloudKitSchema() を使用してスキーマを初期化するようにしました。ダッシュボードにアクセスすると、正しいスキーマが表示されます。コンテナは開発モードのみであり、本番環境にはプッシュされていません。
利用可能なアプリによって生成された sqlite ファイルを使用してアプリを起動すると、データがまだここにあり、正しいため、移行がうまく機能しているようです。アプリ内を通常どおりナビゲートでき、CloudKit ダッシュボードにアクセスすると、データが正しく保存されます。
ただし、起動時に次のエラーでアプリがクラッシュすることがあります。
関連するエンティティの名前が変更されました。これは、関係と関係が多対多であり、両側でオプションであるためです。これは、CloudKit 開発コンテナーをリセットしても発生します。これがいつ表示されるかについては、明確な考えがありません (データを更新した後、または Core Data モデルを更新した後、ランダムに見えます)。アプリがクラッシュする理由はわかりますか? エンティティと関係の新しい命名を可能な限り維持したいと考えています。
- SKPRCrewMemberMOがセーラーに改名
- SKPRTrackMO の名前が Activity に変更されました
- crewMembers <<--->> は、名前が変更された船員 <<--->> のアクティビティを追跡します
以下は、移行の問題が発生したエンティティの以前のデータ モデルと更新されたデータ モデルのスクリーンショットと、Core Data スタックの初期化と取得したコンソール エラーに関するコードです。
PS: このアプリは数百人が使用しています。それほど多くはありませんが、中には何十ものアクティビティが記録されているものもあり、何かを壊したり、データを紛失したり破損したりしたくありません. 新しいアプリを起動することはできますが、共有コンテナーにローカルに保存されるだけなので、ユーザーは進行状況を失います (コア データを Apple Watch 拡張機能と共有したかったため、アプリ グループが使用されました)。そして、ユーザー ベースと App Store 関連のものを失うことになります。