Docs Menu
Docs Home
/ /
Atlas App Services

チュートリアル: Swift UI を使用した Swift 用 Atlas Device Sync

項目一覧

  • 学習目的
  • 前提条件
  • テンプレートを使用して開始
  • テンプレート アプリを調べる
  • アプリを開く
  • アプリ構造の探索
  • アプリを実行する
  • バックエンドの確認
  • アプリケーションを変更する
  • 新しいプロパティの追加
  • モデルへのプロパティの追加
  • 新しいアイテムの作成時の優先順位の設定
  • およびテストの実行
  • サブスクリプションを変更する
  • サブスクライブを更新する
  • およびテストの実行
  • まとめ
  • 次のステップ

完了までの推定時間: 30分(SwiftUI の経験により異なります)

Realm は Swift SDK を提供しており、Swift または Objective-C でネイティブ iOS モバイル アプリケーションを作成できます。 このチュートリアルは、ToDo リスト アプリケーションの作成を説明する、 swiftui.todo.flexという名前の SwiftUI Flexible Sync テンプレート アプリに基づいています。 このアプリケーションを使用すると、ユーザーは次のことが可能になります。

  • メールを新しいユーザー アカウントとして登録します。

  • メールとパスワードを使用してアカウントにサインインします(その後サインアウトします)。

  • 自分のタスクを表示、作成、変更、削除します。

  • ユーザーが所有者でない場合でも、すべてのタスクを表示します。

また、テンプレートアプリには、デバイスがオフラインモードになっていることをシミュレートするトグルが用意されています。 このトグルを使用すると、シミュレーターで Device Sync 機能をすばやくテストして、インターネットに接続していないユーザーをエミュレートできます。 ただし、本番アプリケーションではこのトグルを削除する可能性が高いでしょう。

このチュートリアルでは、テンプレート アプリを対象に構築を行います。 既存のItemモデルに新しいpriorityフィールドを追加し、 Flexible Sync サブスクライブを更新して、優先順位の範囲内のアイテムのみを表示します。

このチュートリアルでは、テンプレート アプリを独自のニーズに合わせて調整する方法について説明します。 テンプレート アプリの現在の構造を考慮すると、必ずしもこの変更を行う必要はありません。

このチュートリアルでは、次の方法を学習します。

  • Realm オブジェクトモデルを重大じゃない変更で更新します。

  • Device Sync サブスクライブを更新します。

  • 同期されるデータを変更するには、サーバー上の Device Sync 構成にクエリ可能なフィールドを追加します。

Tip

ガイド付きチュートリアルに従うのではなく、独自のアプリケーションを使い始める場合は、 Swift クイック スタートを確認してください。 コピー可能なコード サンプルと、Atlas App Services バックエンドを設定するために必要な重要な情報が含まれています。

SwiftUI 固有の使い始めるエクスペリエンスについては、「 SwiftUI Quick Start による Realm 」を参照してください。

  • このチュートリアルは、テンプレート アプリから始めます。 テンプレート アプリを作成するには、 Atlas アカウント、 API キー、 App Services CLI が必要です。

    • Atlas アカウントの作成の詳細については、「 Atlas の使用開始」ドキュメントを参照してください。 このチュートリアルでは、無料階層クラスターを持つ Atlas アカウントが必要です。

    • ログインする MongoDB Cloud アカウントの Atlas API キーも必要です。 App Services CLI を使用してテンプレート アプリを作成するには、プロジェクト オーナーである必要があります。

    • App Services CLI のインストールについて詳しくは、「 App Services CLI のインストール」を参照してください。 インストール後、Atlas プロジェクトの API キーを使用して「 login 」コマンドを実行します。

このチュートリアルは、 swiftui.todo.flexという名前の SwiftUI Flexible Sync テンプレート アプリを基本にして作成されており、 デフォルトのアプリから始めて、新しい機能について説明しています。

テンプレート アプリの詳細については、「テンプレート アプリ 」を参照してください。

Atlas アカウントがまだない場合は、テンプレート アプリを配置するためにサインアップしてください。

App Services App」ガイドに記載されている手順に従い、 Create App from Templateを選択します。Real-time Sync テンプレートを選択します。これにより、Device Sync テンプレート App Services App クライアントの 1 つで使用するために事前構成された App Services App が作成されます。

テンプレート アプリを作成すると、UI に Get the Front-end Code for your Template というラベルの付いたモーダルが表示されます。このモーダルには、テンプレート アプリのクライアントコードを .zip ファイルとしてダウンロードする方法や、App Services CLI を使用してクライアントを取得する方法が表示されます。

.zip または App Services CLI メソッドを選択した後、画面の指示に従ってクライアント コードを取得します。このチュートリアルでは、SwiftUI (iOS + SwiftUI) クライアント コードを選択します。

注意

デフォルトの Windows ZIP ユーティリティで、.zip ファイルが空白ファイルとして表示される。この問題が発生した場合は、利用可能なサードパーティの zip プログラムのいずれかを使用してください。

appservices apps createコマンドでバックエンドを設定し、SwiftUI テンプレート アプリを作成してこのチュートリアルのベースとして使用します。

ターミナル ウィンドウで次のコマンドを実行して、「Myチュートリアル App」という名前のアプリを作成し、環境が「開発」(本番環境やQAではなく)に設定されているUS-VAリージョンに配置されます。

appservices app create \
--name MyTutorialApp \
--template swiftui.todo.flex \
--deployment-model global \
--environment development

このコマンドは、 --nameフラグの値と同じ名前で現在のパスに新しいディレクトリを作成します。

Device Sync クライアントコードを含む Github リポジトリをフォークしてクローンできます。 SwiftUI クライアント コードは https://github.com/mongodb/template-app-swiftui-todo で入手できます。

このプロセスを使用してクライアントのコードを取得する場合は、クライアントで使用するテンプレート アプリを作成する必要があります。 「テンプレート アプリの作成」 の手順に従って、Atlas App Services UI、App Services CLI、または管理 API を使用して Device Sync テンプレート アプリを作成します。

1

Xcode でフロントエンド クライアントのApp.xcodeprojを開きます。

クライアントを .zip ファイルとしてダウンロードした場合、またはクライアントGithubリポジトリをクローンした場合は、クライアント内の適切な場所にApp Services App IDを手動で挿入する必要があります。 アプリ ID を挿入する場所については、クライアントREADME.mdConfigurationの手順に従ってください。

2

Swift パッケージ マネージャーが Realm Swift SDK の最新バージョンをダウンロードしている間、プロジェクトがどのように構成されているかを調べます。 アプリディレクトリ内には、注目に値するファイルがいくつかあります。

ファイル
目的
AppConfig.swift
このファイルには、 Realm.plistからappIdbaseUrlを読み取るロジックが含まれています。 これには、テンプレート アプリのappIdが事前に入力されています。
App.swift

このファイルは、 の値を使用してAppConfig.swift RealmSwift.Appを初期化します。Appは、アプリが App Services バックエンドと通信する方法を示します。 これにより、ログインと認証にアクセスできます。 このファイルには、Device Sync エラーをリッスンするエラー ハンドラーも含まれています。

アプリ構成をカスタマイズする方法の詳細については、「 Atlas App Services バックエンドへの接続 」を参照してください。

このファイルは、SwiftUI アプリへのエントリポイントでもあります。 ユーザー認証状態用にアプリ状態を観察するContentViewAppを渡します。

このチュートリアルでは、次のファイルを操作します。

ファイル
目的
Item.Swift
プロジェクトのルートにあるこのファイルは、データベースに保存する Realm オブジェクトを定義します。
CreateItemView.swift
Viewsディレクトリにあるこのファイルは、新しい項目をリストに追加する機能を提供します。
ContentView.Swift
Viewsディレクトリにあるこのファイルは、Flexible Sync サブスクリプションを定義します。
3

コードを変更しなくても、iOS シミュレーターまたは物理デバイス上でアプリを実行できるはずです。

アプリを実行し、新しいユーザーアカウントを登録し、新しいアイテムを Todo リストに追加します。

4

Atlas App Servicesにログインします。 Data Servicesタブで、 Browse Collectionsをクリックします。 データベースのリストで、 todoデータベース、 Itemコレクションを検索して展開します。 このコレクションで作成したドキュメントが表示されます。

1

すべて期待どおりに動作していることが確認できたため、変更を追加できます。 このチュートリアルでは、各アイテムに「優先順位」プロパティを追加し、アイテムに優先順位をつけてフィルタリングできるようにしました。 優先順位プロパティは、可能な値を制限するために PrimaryLevel 列挙型を使用します。

これを行うには、次の手順に従います。

  1. Xcode でApp.xcodeprojを開きます。

  2. Item.swiftクラスファイルを開きます。

  3. 次のプロパティをItemクラスに追加します。

    @Persisted var priority: PriorityLevel
  4. また、 Itemクラスの下に優先順位PersistableEnumを追加します。

    class Item: Object, ObjectKeyIdentifiable {
    @Persisted(primaryKey: true) var _id: ObjectId
    @Persisted var isComplete = false
    @Persisted var summary: String
    @Persisted var owner_id: String
    @Persisted var priority: PriorityLevel
    }
    enum PriorityLevel: Int, PersistableEnum, CaseIterable {
    case severe = 0
    case high = 1
    case medium = 2
    case low = 3
    var description: String {
    switch self {
    case .severe: return "Severe"
    case .high: return "High"
    case .medium: return "Medium"
    case .low: return "Low"
    }
    }
    }

    PeristableEnum は、列挙型を Realm で直接永続可能としてマークするプロトコルです。 ここでは列挙型のタイプをStringではなくIntに設定しているため、後で数値優先レベルに基づいてクエリを実行できます。 description 計算プロパティを使用して、UI に優先順位のstring表現を表示します。

2
  1. Views ディレクトリで、CreateItemView.swift にGoします。 既存のitemSummaryプロパティの下に新しい@Stateプロパティを追加します。 ここでは、デフォルト値を中優先度に設定します。

    @State var itemSummary = ""
    @State var priority = PriorityLevel.medium
  2. ここで、 Formボディに、新しいアイテムに設定する優先度レベルをユーザーが選択できるようにするピッカーを追加します。 ボタンを含むSectionを見つけ、そのに次のコードを挿入します。

    Section(header: Text("Priority")) {
    Picker(selection: $priority, label: Text("Set priority")) {
    ForEach(PriorityLevel.allCases, id: \.self) { priority in
    Text(priority.description)
    }
    }
    }
  3. ここで、ユーザーがSaveボタンを押したときにnewItemの値を設定するButton(action:に移動します。 newItem.summaryの下に行を追加して、 priorityプロパティも設定します。

    newItem.summary = itemSummary
    newItem.priority = priority
3

この時点で、アプリケーションを再度実行できます。 このチュートリアルの前半で作成したアカウントを使用してログインします。 過去に作成した 1 つのアイテムが表示されます。 新しいアイテムを追加すると、優先順位を設定できるようになります。 優先順位をHighに選択し、アイテムを保存します。

ブラウザで Atlas データページに切り替え、 Itemコレクションを更新します。 これでpriorityフィールドが追加され、 1に設定された新しいアイテムが表示されます。 既存のアイテムにはpriorityフィールドはありません。

コレクション内の 2 つのアイテム
クリックして拡大します

注意

同期が中断されなかった理由

Realm オブジェクトにプロパティを追加しても重大な変更ではないため、クライアントをリセットする必要はありません。 テンプレート アプリでは開発モードが有効になっているため、クライアント Realm オブジェクトへの変更はサーバー側のスキーマに反映されます。 詳しくは、「開発モードデータモデルの更新 」を参照してください。

1

ContentView.swiftファイルでは、ユーザーのデバイスおよびアカウントと同期するドキュメントを定義する Flexible Sync サブスクリプションを作成します。 初期サブスクリプションを設定するlet config = user.flexibleSyncConfiguration(initialSubscriptions:変数を探します。 subscriptions.append()メソッド内では、 owner_idプロパティが認証されたユーザーの ID と一致するすべてのドキュメントを現在サブスクライブしていることが確認できます。 これを維持したいが、優先度が「高」または「重要」とマークされたアイテムのみを同期します。

したがって、 PriorityLevel列挙型をIntタイプに設定する理由です。最高優先順位(重大)の値は 0、最低優先順位(低)の値は 3 です。Int と優先順位プロパティ そのためには、ここに示すように、クエリ ステートメントを更新して、優先順位が PrimaryLevel.High(または 1)以下のドキュメントを含めます。

また、 reRunOnOpenブール値を追加し、それをtrueに設定して、アプリを開くたびに同期するドキュメントをサブスクライブ クエリで再計算するよう強制します。

let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in
if let foundSubscription = subs.first(named: Constants.myItems) {
foundSubscription.updateQuery(toType: Item.self, where: {
$0.owner_id == user.id && $0.priority <= PriorityLevel.high
})
} else {
// No subscription - create it
subs.append(QuerySubscription<Item>(name: Constants.myItems) {
$0.owner_id == user.id && $0.priority <= PriorityLevel.high
})
}
}, rerunOnOpen: true)
2

アプリケーションを再度実行します。 このチュートリアルの前半で作成したアカウントを使用してログインします。 reRunOnOpenを追加したため、アプリは Flexible Sync クエリに一致するドキュメントのみを再同期する必要があります。 Realm がドキュメントコレクションを再同期する最初の瞬間、作成した優先順位の高い新しいアイテムのみが表示されます。

最初に作成したアイテム ドキュメントはpriorityフィールドがないため、同期されません。 このアイテムを同期する場合は、Atlas UI でドキュメントを編集し、優先順位フィールドに値を追加します。

Tip

開発者モードが有効になっている場合にサブスクリプションを変更する

このチュートリアルでは、サブスクリプションを変更し、優先順位フィールドを初めてクエリすると、フィールドは Device Sync Collection Queryable Fieldsに自動的に追加されます。 これは、テンプレート アプリで開発モードがデフォルトで有効になっているために発生します。 開発モードが有効になっていない場合、クライアント側の同期クエリで使用するには、フィールドをクエリ可能なフィールドとして手動で追加する必要があります。

詳細については、「クエリ可能なフィールド 」を参照してください。

機能をさらにテストしたい場合は、さまざまな優先順位のアイテムを作成できます。 優先順位の低い新しいアイテムがアイテム リストに一時的に表示され、その後消えます。 同期エラー ハンドラーは、この動作を説明するメッセージを提供します。

ERROR
"Client attempted a write that is outside
of permissions or query filters; it has been reverted"

このメッセージは、 コンソール ログにも表示されます。

このシナリオでは、Realm はアイテムをローカルに作成し、バックエンドと同期した後、サブスクライブ ルールを満たしていないため書込みを元に戻します。

既存の Realm オブジェクトにプロパティを追加することは重大じゃない変更であり、 開発モード によってスキーマの変更がサーバー側に反映されるようになります。

注意

フィードバックの共有

ではどのようにGoしましたか。 ページ右下にあるRate this pageウィジェットを使用して、有効性を評価します。 またはGithub リポジトリ に問題を報告する 問題が発生した場合は、。

次へ

Atlas アプリケーション サービスとは