Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

イベント ライブラリ - Swift SDK

項目一覧

  • Overview
  • 始める前に
  • イベント記録の有効化
  • デフォルトのイベント構成
  • イベント構成へのパラメーターの渡し
  • イベント メタデータの更新
  • イベントの記録
  • イベント Realm とのやり取り
  • 読み取りイベントまたは書込み (write) イベントの記録
  • カスタム イベントの記録
  • イベント オブジェクト直列化
  • JSON オブジェクト直列化
  • イベント直列化をカスタマイズ
  • イベント Realm ファイルのサイズ
  • イベント ライブラリ参照
  • イベント
  • イベントペイロード

イベント ライブラリを使用すると、同期対応のモバイル アプリケーションを使用しながらユーザーのアクティビティを追跡できます。 イベント ライブラリは、読み取りトランザクションと書込みトランザクションを記録できます。 開発者は、カスタム イベントを設定して、ボタンの操作、UI に表示されるデータ、またはその他の重要な詳細を記録することもできます。

イベント ライブラリを使用するときに、レコードするイベントを指定できます。 これは 2 つの Realm を開くことを意味します。

  • ユーザー邦土(ユーザーがクライアント アプリケーションで読み取りと書込みを行う)

  • イベントライブラリが記録するスコープ設定イベントとカスタム イベントが記録されるイベント邦土

両方のレルムのデータは App Services App に同期されます。 クライアント ユーザーは、イベント Realm またはそのデータを直接操作することはありません。や イベント Realm Sync ユーザーは、ユーザー Realm と異なる場合もあります。

Event ライブラリは大量のデータを生成するため、

  • クライアント デバイスには、データを保存するのに十分な容量が必要です

  • イベント邦土での Device Sync の使用量が、ユーザ邦土の読み取りと書込みよりも高いことが予想されます

  • アプリのバッキング Atlas クラスターには、イベント ライブラリによって生成されたデータを処理するのに十分なストレージ容量が必要です

イベント ライブラリは、リンクされた Atlas データソース内の AuditEventコレクションにデータを保存します。 App Services AppAtlasで 開発モード を有効にすると、 がコレクションを作成し、アップロードされたイベントからスキーマを推測できます

重要

必要なパーティションベースの同期

イベント ライブラリは、Flexible Sync を使用したAuditEventsの記録をサポートしていません。 この機能では、AuditEvent データを記録するには、パーティションベースの Sync App Services Appが必要です。

イベント記録を有効にするには、Realm.Configuration のEvent.Configurationプロパティを設定します。

EventConfigurationは、次の 2 つの方法で初期化できます。

  • 詳細を指定する必要がない場合は、デフォルトの初期化構成を使用してください

  • 追加のパラメーターを渡し、イベント構成をカスタマイズします

特定のパラメータを指定する必要がない場合は、デフォルトで初期化されたEventConfigurationを使用できます。

var config = user.configuration(partitionValue: "Some partition value")
config.eventConfiguration = EventConfiguration()

任意のパラメータを渡して、 EventConfigurationをカスタマイズできます。

  • metadata: 各イベントに追加するメタデータ フィールドの string の辞書

  • syncUser: イベント邦土を同期するために使用するユーザー。 nil の場合、デフォルトはRealm.Configurationのユーザーになります。

  • partitionPrefix: イベント パーティション値に追加する string プレフィックス

  • logger: イベントに使用するカスタム ロガー。 nil の場合、デフォルトはユーザー邦土のロガーになります。

  • errorHandler: イベント データのアップロード中に 同期エラー が発生した場合に呼び出されるカスタム エラー ハンドラー。 nilの場合、SDK はイベントをログに記録し、 abort()を呼び出します。 実稼働アプリでは、エラーで中止することが目的の動作でない限り、常にイベントerrorHandlerを定義する必要があります。

let eventSyncUser = try await app.login(credentials: Credentials.anonymous)
var config = user.configuration(partitionValue: "Some partition value")
config.eventConfiguration = EventConfiguration(metadata: ["username": "Jason Bourne"], syncUser: eventSyncUser, partitionPrefix: "event-")

イベントの記録を開始した後でもメタデータを更新できます。 イベント構成で提供されたメタデータを新しい値に置き換えるには、 updateMetadata()関数を使用します。

イベント スコープがアクティブなときにメタデータを更新すると、イベント ライブラリは次のイベント スコープが開始されるまで新しいメタデータを使用しません。

var config = user.configuration(partitionValue: "Some partition value")
config.eventConfiguration = EventConfiguration(metadata: ["username": "Jason Bourne"], syncUser: user, partitionPrefix: "event-")
let realm = try! Realm(configuration: config)
let events = realm.events!
let updateUsernameScope = events.beginScope(activity: "Update username")
// Call some function that updates the user's username
updateUsername()
updateUsernameScope.commit()
// Update the metadata you supplied with the initial EventConfiguration
events.updateMetadata(["username": "John Michael Kane"])

イベント構成を定義したら、 Realm で新しい イベント プロパティを使用してイベント記録機能を呼び出すことができます。これにより、その Realm に関連付けられたEventインスタンスが返されます。

let realm = try! Realm(configuration: config)
let events = realm.events!

バージョン 10.36.0 での変更: endScopes() は、 commit() およびCancel() では非推奨となり、新しいスコープ オブジェクト

イベント ライブラリは、スコープのコンテキスト内の読み取りイベントと書込み (write) イベントを記録します。 スコープは、イベント ライブラリが Realm のアクティビティを監視し、記録する期間です。 異なるタイプのイベントを記録するには、異なるスコープを設定できます。 たとえば、「ログイン」などの特定のユーザーフローに対してスコープを設定したり、さまざまな画面に対して異なるスコープを設定したり、特定のコンプライアンス関連のアクティビティに対して異なるスコープを設定したりできます。

startScoper(アクティビティ: "いくつかのアクティビティ")を使用して、指定されたアクティビティ名で新しいイベントの記録を開始します。 これにより、後でスコープをコミットまたはキャンセルするために使用できるSscopeオブジェクトが返されます。 スコープを開始すると、そのスコープ内で発生するアクティビティを読み取りまたは書込みイベントとして記録します。

  • 読み取りイベント: クエリを実行し、オブジェクトをインスタンス化します。 スコープが終了すると、イベント邦土はこれらのアクティビティを読み取りイベントとして記録します。

  • 書き込みイベント: オブジェクトを変更します。 スコープが終了すると、イベント邦土はオブジェクトの初期状態と、イベントのスコープ内で変更されたプロパティの新しい値を記録します。

イベントを記録するには、 beginScopeを使用します(イベント邦土がまだ開いていない場合)。 SDK はバックグラウンド スレッドでイベント邦土を開き、エラーをエラー コールバックに報告します。

注意

イベント スコープの重複

複数のイベント スコープが同時にアクティブになっている場合、生成されたイベントはすべてのアクティブなスコープによって記録されます。

スコープのイベントを記録し始めたら、 commit()を使用してスコープ内で発生したイベントを保存します。 記録を終了すると、イベント ライブラリはイベントをローカルにディスクに保存します。 次に、デバイスにネットワーク接続がある場合、SDK は非同期にデータをサーバーに送信します。

// Read event
let readEventScope = events.beginScope(activity: "read object")
let person = realm.objects(Person.self).first!
print("Found this person: \(person.name)")
readEventScope.commit()
let mutateEventScope = events.beginScope(activity: "mutate object")
// Write event
try! realm.write {
// Change name from "Anthony" to "Tony"
person.name = "Tony"
}
mutateEventScope.commit()

あるいは、イベントスコープをcancel()することもできます。 これにより、イベントの記録が停止し、イベントがディスクやサーバーに永続化しません。

let eventScope = events.beginScope(activity: "read object")
let person1 = realm.objects(Person.self).first!
print("Found this person: \(person1.name)")
eventScope.cancel()

特定のスコープが現在進行中かどうかは、 isActiveブール値を使用して、特定のスコープが現在進行中かどうかを確認できます。 まだコミットまたはキャンセルしていないスコープを開始した場合は、 trueが返されます。

let readPersonScope = events.beginScope(activity: "read object")
let person2 = realm.objects(Person.self).first!
print("Found this person: \(person2.name)")
if readPersonScope.isActive {
print("The readPersonScope is active")
} else {
print("The readPersonScope is no longer active")
}
readPersonScope.cancel()

記録が完了するときに、任意の完了ブロックをcommit()に渡すことができます。 SDK は、イベント Realm のアップロードが完了した場合ではなく、イベント データが正常に保存された場合にこのブロックを呼び出します。

let mutateScope = events.beginScope(activity: "mutate object with completion")
// Write event
try! realm.write {
// Add a userId
person.userId = "tony.stark@starkindustries.com"
}
mutateScope.commit(completion: { error in
if let error = error {
print("Error recording write event: \(error.localizedDescription)")
return
}
print("Successfully recorded a write event")
})

イベント ライブラリを使用すると、ボタンをクリックしたり、データベースの読み取りや書込みを含まないその他のイベントを記録できます。 カスタム イベントを記録するには、 RecordEventを使用します。 この関数は、次のパラメーターを取ります。

  • activity: アクティビティ名。 これは「user register」などの任意の string です。

  • eventType: イベントの種類。 これは「送信ボタンを押した」などの任意のstringです。

  • data: イベントの任意のデータペイロード。

  • completion: 任意の完了ハンドラー。 イベント ライブラリは、イベントがイベント レルムに保存されると、またはエラーが発生した場合にこの完了ブロックを呼び出します。 nil エラーは成功を示します。

カスタム イベントには、読み取りイベントや書込みイベントのようなスコープはありません。 代わりに、カスタム イベントを記録することは、trigger を起動することよりも類似しています。

events.recordEvent(activity: "event", eventType: "custom event")

イベント ライブラリは、各イベント オブジェクトを JSON オブジェクトに変換します。 ほとんどのRealm タイプは類似した JSON 表現をとります。 たとえば、Realm string プロパティは JSON string になります。

以下は、イベント ライブラリが直接的な JSON アナライザを持たない型を表す方法です。

日付
ISO8601 -1 :2019 形式 の string にエンコードされます。
データ
イベントから完全に除外されました。
UUID
RFC-4122 にエンコードされました 準拠の string。
ObjectID
ObjectId string表現にエンコードされます。
Decimal128
数値ではなく string にエンコードされます。 JSON 番号は公式には無限の精度ですが、実際にそのように実装されることはほぼありません。
リスト
配列としてエンコードされます。
セット
配列としてエンコードされます。
Dictionary
オブジェクトとしてエンコードされます。
埋め込みオブジェクト
オブジェクトとしてエンコードされます。

非埋め込みオブジェクト リンクは、ターゲットのプライマリキーとしてエンコードされます。 読み取り イベントでは、 リンクに従うと、完全なオブジェクトに展開されます。 リンクを追跡しない場合は、これはプライマリキーのままになります。

イベント オブジェクトの JSON シリアル化をカスタマイズできます。 イベントペイロードをカスタマイズするには、 CustomEventRepresentationableプロトコルを使用します。

オブジェクトがCustomEventRepresentableに準拠している場合、イベント ライブラリは次の方法でオブジェクトを直列化します。

  • accessor オブジェクトの構築

  • そのアクセス オブジェクトでcustomEventRepresentationを呼び出す

  • 元のオブジェクトではなく結果を直列化

CustomEventRepresentableに準拠するには、カスタマイズされた直列化を定義するcustomEventRepresentation関数をオブジェクトが実装する必要があります。

// To customize event serialization, your object must
// conform to the `CustomEventRepresentable` protocol.
class Person: Object, CustomEventRepresentable {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var name: String
@Persisted var employeeId: Int
@Persisted var userId: String?
convenience init(name: String, employeeId: Int) {
self.init()
self.name = name
self.employeeId = employeeId
}
// To conform to `CustomEventRepresentable`, your object
// must implement a `customEventRepresentation` func that
// defines your customized event serialization
func customEventRepresentation() -> String {
if employeeId == 0 {
return "invalid json"
}
return "{\"int\": \(employeeId)}"
}
}

デバイスが長時間オフラインになると、イベント邦土はかなり大きくなる可能性があります。

これを補うために、イベント ライブラリは必要に応じてイベント データを複数のパーティションに自動的に分割します。 パーティションが最大サイズに達すると、イベント ライブラリはイベント レルムを閉じ、自動的に新しいパーティションへの書き込みを開始します。

イベント ライブラリは、ユーザーに同期されていないパーティションがあるかどうかを確認します。 その場合、イベント ライブラリは 1 つのファイルを開き、データをアップロードした後、ファイルを閉じて削除します。 ユーザーに同期されていないパーティションがなくなるまで、これが繰り返されます。

イベントが保存されるAuditEventコレクションには、アプリがイベントを受信するためにサーバー上に定義されたスキーマが必要です。

スキーマには、次のフィールドが含まれている必要があります。

ID
_id
ObjectId.
イベントの種類
event
任意string 。 スコープ指定されたイベントの場合はreadまたはwrite 、カスタム イベントの場合は任意の string。
イベントスコープ
activity
任意string 。 イベントの記録を開始するためにbeginScope()に渡されるスコープ名(またはカスタム イベントの場合は任意の string)。
タイムスタンプ
timestamp
イベント スコープが終了し、データがコミットされたときの デバイスのローカル時間 、またはイベントがサーバーにヒットした時間。
データ
data
イベントのペイロード。 これは、スコープ指定されたイベントの JSON string であり、カスタム イベントの場合は任意の string です。
Metadata
metadata key (string)
任意のメタデータ辞書。 この辞書にキーと値が含まれている場合、キーはイベント オブジェクトのフィールド名になり、値はすべてのイベントについてそのフィールドに保存されます。

各イベントには、読み取りまたは書き込みされるオブジェクトの現在の状態を取得するdataプロパティのペイロードが含まれています。

カスタム イベントのペイロードは、 nil を含む開発者が希望するものにすることができます。

重要

ペイロードは読み取りまたは書き込み中のオブジェクトの現在の状態をキャプチャするため、非常に大量のデータが生成されます。 ただし、ユーザーが表示する正確なデータがサーバー側に存在しない場合があるため、これはサーバーではなくクライアントで実行する必要があります。 実際には、オフラインにする場合、デバイスは大量のデータを保存するための容量が必要であることを意味します。 さらに、イベント邦土での Device Sync の使用量は、ユーザーが ユーザー レルムで行う読み取りと書込みよりもはるかに高くなる可能性があります。

上記のレコード イベントの例では、読み取りイベントと書込みイベントのdataペイロードは次のとおりです。

読み取りイベント ペイロード
{
"type":"Person",
"value": [{
"_id":"62b38b3c10846041166f5deb",
"_partition":"",
"employeeId":2,
"name":"Anthony",
"userId":null
}]
}
書込み (write) イベント ペイロード
{
"Person": {
"modifications": [{
"newValue": {
"name":"Tony"
},
"oldValue":{
"_id":"62b38b3c10846041166f5deb",
"_partition":"",
"employeeId":2,
"name":"Anthony",
"userId":null
}
}]
}
}

戻る

クライアント ログ レベルの設定