リモートコマンド:Braze
AndroidおよびSwift/iOS用BrazeのTealiumリモートコマンド統合。
必要条件
- Braze APIキー
- 以下のいずれかのモバイルライブラリ:
- Tealium for Android-Kotlin (1.0.0+)
- Tealium for Android-Java (Braze 1.0.0+用は5.9.0+、それ以前のバージョン用は<5.9.0)
- Tealium for iOS-Swift (2.8.0+)
- 以下のいずれかのリモートコマンド統合:
- Braze Remote Command JSON File (Android-Kotlin 1.0.0+またはiOS-Swift 2.1.0+が必要)
- Tealium iQ Tag Management内のBraze Remote Commandタグ
動作原理
Braze統合は以下の項目を使用します:
- BrazeネイティブSDK。
- Brazeメソッドをラップするリモートコマンドモジュール。
- JSON構成ファイルまたはイベントトラッキングをネイティブのBrazeコールに変換するRemote Commandタグのいずれか。
アプリにBrazeリモートコマンドモジュールを追加すると、アプリにベンダー固有のコードを追加することなく、必要なBrazeライブラリが自動的にインストールされてビルドされます。依存関係マネージャーのインストールを使用している場合、Braze SDKを別途インストールする必要はありません。
リモートコマンドオプションには、JSON構成ファイルを使用するか、iQ Tag Managementを使用してマッピングを構成するかの2つがあります。ベンダー統合には、アプリ内またはリモートでホストされるJSON構成ファイルの使用を推奨します。iQ Tag Managementを使用する場合は、ベンダー統合のためのRemote Commandタグを追加します。ベンダー統合についての詳細はこちらをご覧ください。
インストール
依存関係マネージャ
- Xcodeプロジェクトで、File > Add Packages… > Add Package Dependencyを選択します。
- リポジトリURLを入力します:
https://github.com/tealium/tealium-ios-braze-remote-command
。 - バージョンルールを構成します。通常は
Up to next major
が推奨されます。現在のTealiumBraze
バージョンがリストに表示されない場合は、Swiftパッケージキャッシュをリセットしてください。 - インストールする
TealiumBraze
モジュールを選択し、そのモジュールをインストールしたいアプリターゲットを選択します。
プロジェクトに複数のアプリターゲットがあり、それらのターゲットにTealiumBraze
モジュールが必要な場合は、Frameworks, Libraries, and Embedded Contentセクションで手動で追加する必要があります。
追加のアプリターゲットにTealiumBraze
をインストールするには:
- Project NavigatorでXcodeプロジェクトを選択します。
- Xcodeプロジェクトで、TARGETSセクションのアプリターゲットを選択します。
- General > Frameworks, Libraries & Embedded Contentに移動し、アプリターゲットに
TealiumBraze
モジュールを追加します。
Tealium Swiftライブラリから追加のモジュールを追加するには、Swift Package Managerの指示に従ってください。
-
Podfileから
tealium-swift
とpod "BrazeKit"
を削除します。tealium-swift
の依存関係はすでにTealiumBraze
フレームワークに含まれています。 -
Podfileに次の依存関係を追加します:
pod "TealiumBraze"
TealiumBraze
ポッドには次のTealiumSwift
依存関係が含まれています:'tealium-swift/Core' 'tealium-swift/RemoteCommands'
-
TealiumHelper
ファイルおよびTealium
クラスまたはBrazeリモートコマンドにアクセスするその他のファイルでTealiumSwift
およびTealiumBraze
モジュールをインポートします。
-
Cartfileから
tealium-swift
を削除します。tealium-swift
の依存関係はすでにTealiumBraze
フレームワークに含まれています。 -
Cartfileに次の依存関係を追加します:
github "tealium/tealium-ios-braze-remote-command"
-
Tealium for Android (Kotlin)またはTealium for Android (Java)をインストールし、まだ行っていない場合はプロジェクトのトップレベルの
build.gradle
ファイルにTealium Maven URLを追加します。allprojects { repositories { mavenCentral() maven { url "https://maven.tealiumiq.com/android/releases/" } } }
-
アプリプロジェクトの
build.gradle
ファイルにBraze SDKとTealium-Brazeリモートコマンドの依存関係を追加します:dependencies { implementation 'com.tealium.remotecommands:braze:3.0.0' implementation 'com.braze:android-sdk-ui:29.0.1' }
-
React Nativeプロジェクトのルートに移動します。
-
次のコマンドで
tealium-react-braze
パッケージをダウンロードしてインストールします:yarn add tealium-react-braze
-
NPMパッケージのバージョン1.0.7でReact Native Autolinkingが有効になっており、React Nativeのバージョン0.60+を使用している場合、
react-native link
を実行する必要はありません。
手動インストール
Brazeリモートコマンドの手動インストールには、Tealium for Swiftライブラリのインストールが必要です。iOSプロジェクト用のBrazeリモートコマンドをインストールするには:
-
まだ行っていない場合は、Braze SDKをインストールします。
-
Tealium iOS Brazeリモートコマンドリポジトリをクローンし、
Sources
フォルダ内のファイルをプロジェクトにドラッグします。 -
remoteAPIEnabled
構成フラグをtrue
に構成します。
Brazeリモートコマンドの手動インストールには、Tealium for Android (Kotlin)またはTealium for Android (Java)のインストールが必要です。
Androidプロジェクト用のBrazeリモートコマンドをインストールするには:
-
プロジェクトルートの
build.gradle
ファイルにflatDir
を追加します:allprojects { repositories { mavenCentral() flatDir { dirs 'libs' } } }
-
<PROJECT_ROOT>/<MODULE>/libs
にtealium-braze.aar
を追加します。 -
build.gradle
ファイルにTealiumライブラリの依存関係を追加します:dependencies { implementation(name:'tealium-braze', ext:'aar') }
初期化
TealiumのiOS(Swift)ライブラリ用のJSON構成ファイルまたはRemote Commandタグでリモートコマンドを初期化します:
var tealium : Tealium?
let config = TealiumConfig(account: "ACCOUNT",
profile: "PROFILE",
environment: "ENVIRONMENT",
dataSource: "DATASOURCE")
config.dispatchers = [Dispatchers.TagManagement, Dispatchers.RemoteCommands]
config.remoteAPIEnabled = true // リモートコマンドを使用するために必要
tealium = Tealium(config: config) { _ in
guard let remoteCommands = self.tealium?.remoteCommands else {
return
}
// Webviewタグ
let braze = BrazeRemoteCommand(brazeLocation: BrazeLocationProvider())
// ローカルJSON
//let braze = BrazeRemoteCommand(type: .local(file: "braze"), brazeLocation: BrazeLocationProvider())
// リモートJSON
//let braze = BrazeRemoteCommand(type: .remote(url: "https://some.domain.com/braze.json"), brazeLocation: BrazeLocationProvider())
remoteCommands.add(braze)
}
TealiumのKotlinライブラリ用のJSON構成ファイルまたはRemote Commandタグでリモートコマンドを初期化します:
val config = TealiumConfig(application,
"ACCOUNT",
"PROFILE",
Environment.DEV,
dispatchers = mutableSetOf(Dispatchers.RemoteCommands, Dispatchers.TagManagement));
// Braze Remote Commandを追加する新しいコード
val braze = BrazeRemoteCommand(application,
true,
sessionHandlingBlacklist,
true,
inAppMessageBlacklist)
var tealium = Tealium.create(TEALIUM_MAIN, config) {
// オプション:Tealium IQのタグでまだサポートされていない構成オプションを構成するか、
// ローカルで構成を上書きする。
braze.registerConfigOverride { builder ->
// builder.setIsLocationCollectionEnabled(true);
// builder.setGeofencesEnabled(true);
// builder.setPushDeepLinkBackStackActivityEnabled(true);
// builder.setPushDeepLinkBackStackActivityClass(UserActivity.class);
}
// コマンドを登録
// Webviewタグ
remoteCommands?.add(braze);
// ローカルJSON
//remoteCommands?.add(braze, filename = "braze.json");
// リモートJSON
//remoteCommands?.add(braze, remoteUrl = "https://some.domain.com/braze.json");
}
TealiumのAndroid(Java)ライブラリ用のRemote Commandタグでリモートコマンドを初期化します:
import com.tealium.remotecommands.BrazeRemoteCommand;
Tealium.Config config = Tealium.Config.create(application, "ACCOUNT", "PROFILE", "ENVIRONMENT");
Tealium teal = Tealium.createInstance(TEALIUM_MAIN, config);
BrazeRemoteCommand braze;
// デフォルトの構成オプションで初期化。
braze = new BrazeRemoteCommand(config);
// または追加の構成オプションで初期化する場合:
Set<Class> sessionHandlingBlacklist = new HashSet<>();
Set<Class> inAppMessageBlacklist = new HashSet<>();
// sessionHandlingBlacklist.add(MainActivity.class);
// inAppMessageBlacklist.add(UserActivity.class);
braze = new BrazeRemoteCommand(config,
true, // sessionHandlingEnabled
sessionHandlingBlacklist, // sessionHandlingBlacklist
true, // registerInAppMessageManager
inAppMessageBlacklist); // inAppMessageBlackList
// オプション:Tealium IQのタグでまだサポートされていない構成オプションを構成するか、
// ローカルで構成を上書きする。
braze.registerConfigOverride(new BrazeRemoteCommand.ConfigOverrider() {
@Override
public void onOverride(AppboyConfig.Builder b) {
b.setPushDeepLinkBackStackActivityEnabled(true);
b.setPushDeepLinkBackStackActivityClass(UserActivity.class);
}
});
// コマンドを登録
teal.addRemoteCommand(braze);
React Native用のJSON構成ファイルまたはRemote Commandタグでリモートコマンドを初期化します:
import BrazeRemoteCommand from 'tealium-react-braze';
BrazeRemoteCommand.initialize();
// Webviewタグ
let braze = { id: BrazeRemoteCommand.name }
// ローカルJSON
//let braze = { id: BrazeRemoteCommand.name, path: "braze.json" }
// リモートJSON
//let braze = { id: BrazeRemoteCommand.name, url: "https://some.domain.com/braze.json" }
let config = TealiumConfig {
// ...
remoteCommands: [braze]
}
JSONテンプレート
JSON構成ファイルを使用してリモートコマンドを構成する場合は、以下のテンプレートを参照してください。このテンプレートには、標準的なeコマースインストールで使用される一般的なマッピングが含まれています。必要に応じてマッピングを編集してください。
{
"config": {
"api_key": "YOUR_API_KEY",
"custom_endpoint": "sdk.iad-01.braze.com",
"session_timeout": 30,
"trigger_interval_seconds": 100,
"enable_geofences": true,
"enable_automatic_geofences": true,
"enable_automatic_location": true,
"push_story_identifier": "YOUR_IDENTIFIER",
"use_uuid_as_device_id": true,
"forward_universal_links": true
},
"mappings": {
"customer_id": "user_id",
"customer_first_name": "first_name",
"customer_last_name": "last_name",
"customer_gender": "gender",
"customer_language": "language",
"customer_email": "email",
"customer_home_city": "home_city",
"customer_dob": "date_of_birth",
"customer_alias": "user_alias",
"customer_alias_label": "alias_label",
"pet": "set_custom_attribute.pet",
"pet_count": "set_custom_attribute.pet_count",
"pet_count_unset": "unset_custom_attribute.pet_count_unset",
"pet_count_increment": "increment_custom_attribute.pet_count_increment",
"pet_names": "set_custom_array_attribute.pet_names",
"pet_names_append": "append_custom_array_attribute.pet_names_append",
"pet_names_remove": "remove_custom_array_attribute.pet_names_remove",
"screen_name": "screen_name",
"email_notification": "email_notification",
"push_notification": "push_notification",
"event_name": "event_name",
"current_level": "event.current_level",
"start_date": "event.start_date",
"high_score": "event.high_score",
"product_id": "product_id",
"product_quantity": "product_qty",
"product_unit_price": "product_unit_price",
"currency_code": "product_currency",
"rewards_member": "purchase.rewards_member",
"rewards_points_earned": "purchase.rewards_points_earned",
"date_joined_program": "purchase.date_joined_program",
"latitude": "location_latitude",
"longitude": "location_longitude",
"horizontal_accuracy": "location_horizontal_accuracy",
"vertical_accuracy": "location_vertical_accuracy"
},
"commands": {
"launch": "initialize",
"setengagement": "emailnotification,pushnotification",
"log_custom_event": "logcustomevent",
"set_location": "setlastknownlocation",
"custom_attribute": "setcustomattribute",
"unset_custom_attribute": "unsetcustomattribute",
"custom_array_attribute": "appendcustomarrayattribute",
"append_custom_array_attribute": "appendcustomarrayattribute",
"remove_custom_array_attribute": "removecustomarrayattribute",
"increment_custom_attribute": "incrementcustomattribute",
"log_purchase": "logpurchase",
"user_attribute": "userattribute,useridentifier,useralias",
"user_login": "useridentifier,useralias",
"user_alias": "useralias",
}
}
サポートされているメソッド
各Brazeメソッドにコマンドをマッピングします。Brazeメソッドをトリガーするには、指定された形式で対応するコマンドを渡します。
リモートコマンド | Brazeメソッド |
---|---|
addtosubscriptiongroup |
user.addToSubscriptionGroup(id:) |
appendcustomarrayattribute |
user.addToCustomAttributeArray() |
emailnotification |
user.set(emailSubscriptionState:) |
enablesdk |
enabled = true/false |
flush |
requestImmediateDataFlush() |
incrementcustomattribute |
user.incrementCustomUserAttribute() |
initialize |
Braze(configuration:) |
logcustomevent |
logCustomEvent() |
logpurchase |
logPurchase() |
pushnotification |
user.set(pushNotificationSubscriptionState:) |
removefromsubscriptiongroup |
user.removeFromSubscriptionGroup(id:) |
removecustomarrayattribute |
user.removeFromCustomAttributeArray() |
setadtrackingenabled |
set(adTrackingEnabled:) |
setcustomattribute |
user.setCustomAttribute()) |
setcustomarrayattribute |
user.setCustomAttributeArray() |
setlastknownlocation |
user.setLastKnownLocation() |
setsdkauthsignature |
set(sdkAuthenticationSignature:) |
useralias |
user.add(alias:) |
unsetcustomattribute |
user.unsetCustomAttribute() |
userattribute |
user.set() |
useridentifier |
changeUser() |
wipedata |
wipeData() |
Braze SDKはTealium SDKと一緒にインストールされているため、対応するタグ構成でネイティブのBraze機能をトリガーできます。
SDKのセットアップ
初期化
Braze APIキーとカスタムエンドポイントが必要で、タグ構成で構成する必要があります。
リモートコマンド | Brazeメソッド (iOS) | Brazeメソッド (Android) |
---|---|---|
initialize |
Braze(configuration:) |
configure() |
以下のマッピングは起動オプションを構成するために使用されます。
パラメータ | タイプ | 説明 |
---|---|---|
api_key (必須) |
String |
APIキーを構成します |
custom_endpoint (必須) |
String |
カスタムAPIエンドポイントを構成します。この形式で送信されます sdk.api.braze.eu |
device_options |
[String] |
Braze SDKによって収集されるデバイスフィールドのホワイトリスト(デフォルトでは、すべてのフィールドが収集されます)。 |
enable_automatic_geofences |
Bool |
ジオフェンスの自動収集を有効にします(true または false )。 |
enable_automatic_location |
Bool |
位置情報の収集を有効にします(true または false )。 |
enable_geofences |
Bool |
ジオフェンスの収集を有効にします(true または false )。 |
flush_interval |
Double |
データフラッシュ間隔を構成します(秒単位)。値はNSTimeIntervalsに変換され、1.0 より大きくなければなりません。 |
is_sdk_authentication_enabled |
Bool |
SDK認証を有効にします、デフォルトはfalse です。 |
push_story_identifier |
String |
このキーは、Push Story Notification Content拡張のアプリグループ名を表す文字列値に構成されます。 |
request_processing_policy |
String |
SDKのリクエスト処理の可能な値(manual または automatic )。デフォルトは automatic です。 |
session_timeout |
Int (秒) |
セッションタイムアウトは秒単位です(デフォルトは 30 秒)。 |
trigger_interval_seconds |
Int (秒) |
アプリ内メッセージトリガー間の最小間隔をオーバーライドします(デフォルトは 30 秒)。 |
use_uuid_as_device_id |
Bool |
(iOS) デバイスIDとしてランダムに生成されたUUIDを使用するかどうかを決定します(デフォルトは true )。 |
forward_universal_links |
Bool |
SDKが自動的にユニバーサルリンクを認識し、システムメソッドに転送するかどうかを指定します(デフォルトは false )。 |
Android
iOS
- Braze開発者ガイド: 初期SDKセットアップ
- Braze開発者ガイド: ネットワークトラフィック制御の詳細
- Braze開発者ガイド: 位置情報とジオフェンス
- Braze開発者ガイド: Push Storyの構成
- Braze開発者ガイド: セッションの追跡
SDK認証署名の構成
リモートコマンド | Brazeメソッド (iOS) | Brazeメソッド (Android) |
---|---|---|
setsdkauthsignature |
set(sdkAuthenticationSignature:) |
setSdkAuthenticationSignature |
パラメータ | タイプ |
---|---|
sdk_authentication_signature |
String |
フラッシュ
リモートコマンド | Brazeメソッド |
---|---|
flush |
requestImmediateDataFlush |
- Braze開発者ガイド: アナリティクスの無効化
ユーザートラッキング
ユーザーIDの割り当て
リモートコマンド | Brazeメソッド |
---|---|
useridentifier |
changeUser |
パラメータ | タイプ |
---|---|
user_id (必須) |
String |
sdk_authentication_signature |
String |
ユーザーのエイリアス作成
リモートコマンド | Brazeメソッド |
---|---|
useralias |
user.add(alias:) |
パラメータ | タイプ |
---|---|
user_alias (必須) |
String |
alias_label (必須) |
String |
ユーザー属性
標準属性
イベント | Brazeメソッド |
---|---|
userattribute | Braze.User オブジェクトのフィールドを構成 |
パラメータ | タイプ |
---|---|
first_name |
String |
last_name |
String |
email |
String |
date_of_birth |
String |
country |
String |
language |
String |
home_city |
String |
phone |
String |
gender |
String |
- Braze開発者ガイド: アナリティクス ユーザー属性
- Braze開発者ガイド: ユーザーデータAPI
カスタム属性の構成
リモートコマンド | Brazeメソッド |
---|---|
setcustomattribute |
user.setCustomAttribute |
パラメータ | タイプ |
---|---|
set_custom_attribute.PROPERTY |
[String: Any] / JSONObject |
カスタム属性の解除
リモートコマンド | Braze メソッド |
---|---|
setcustomattribute |
user.unsetCustomAttribute |
パラメータ | タイプ |
---|---|
set_custom_attribute.PROPERTY |
String |
カスタム属性のインクリメント
リモートコマンド | Braze メソッド |
---|---|
incrementcustomattribute |
user.incrementCustomUserAttribute |
パラメータ | タイプ |
---|---|
increment_custom_attribute.PROPERTY |
String |
カスタム配列属性の構成
リモートコマンド | Braze メソッド |
---|---|
setcustomarrayattribute |
user.setCustomAttributeArray |
パラメータ | タイプ |
---|---|
set_custom_array_attribute.PROPERTY |
[String: [Any]] / JSONObject |
カスタム配列属性の追加
リモートコマンド | Braze メソッド |
---|---|
appendcustomarrayattribute |
user.addToCustomAttributeArray |
パラメータ | タイプ |
---|---|
append_custom_array_attribute.PROPERTY |
[String: String] / JSONObject |
カスタム配列属性の削除
リモートコマンド | Braze メソッド |
---|---|
removecustomarrayattribute |
user.removeFromCustomAttributeArray |
パラメータ | タイプ |
---|---|
remove_custom_array_attribute.PROPERTY |
[String: String] / JSONObject |
カスタムイベントトラッキング
カスタムイベント
リモートコマンド | Braze メソッド |
---|---|
logcustomevent |
logCustomEvent |
パラメータ | タイプ |
---|---|
event_name (必須) |
String |
event_properties |
[String: Any] / JSONObject |
通知
Eメール通知
リモートコマンド | Braze メソッド |
---|---|
emailnotification |
setEmailNotificationSubscriptionType |
パラメータ | タイプ | 例 |
---|---|---|
email_notification |
String |
["optedin" , "subscribed" , "unsubscribed" ] |
サブスクリプショングループへの追加
リモートコマンド | Braze メソッド |
---|---|
addtosubscriptiongroup |
user.addToSubscriptionGroup(id:) |
パラメータ | タイプ |
---|---|
subscription_group_id (必須) |
String |
サブスクリプショングループからの削除
リモートコマンド | Braze メソッド |
---|---|
removefromsubscriptiongroup |
user.removeFromSubscriptionGroup(id:) |
パラメータ | タイプ |
---|---|
subscription_group_id (必須) |
String |
プッシュ通知
リモートコマンド | Braze メソッド |
---|---|
pushnotification |
setPushNotificationSubscriptionType |
パラメータ | タイプ | 例 |
---|---|---|
push_notification |
String |
["optedin" , "subscribed" , "unsubscribed" ] |
購入トラッキング
購入ログ
リモートコマンド | Braze メソッド |
---|---|
logpurchase |
logPurchase |
パラメータ | タイプ |
---|---|
product_id (必須) |
[String] / String[] |
product_currency (必須) |
String / String |
price (必須) |
[Double] / Double[] |
product_qty |
[Int] / Int[] |
purchase_properties |
[AnyHashable: Any] / JSONObject |
位置情報トラッキング
ユーザーの最後の既知の位置の構成
リモートコマンド | Braze メソッド |
---|---|
setlastknownlocation |
user.setLastKnownLocation |
パラメータ | タイプ |
---|---|
latitude (必須) |
Double |
longitude (必須) |
Double |
horizontalAccuracy (必須) |
Double |
altitude |
Double |
verticalAccuracy |
Double |
データプライバシー(同意オプション)
SDKの有効化
リモートコマンド | Braze メソッド (iOS) | Braze メソッド (Android) |
---|---|---|
enablesdk |
enabled |
enableSdk |
SDKの無効化
リモートコマンド | Braze メソッド (iOS) | Braze メソッド (Android) |
---|---|---|
disablesdk |
enabled |
disableSdk |
データの消去
リモートコマンド | Braze メソッド |
---|---|
wipedata |
wipeData |
広告トラッキングの有効化構成
リモートコマンド | Braze メソッド |
---|---|
setadtrackingenabled |
set(adTrackingEnabled:) |
パラメータ | タイプ |
---|---|
ad_tracking_enabled (必須) |
Bool |
Braze インスタンスへのアクセス (iOS)
リモートコマンドは、イベントや購入のログ記録など、Brazeが提供する機能の一部をアプリにマッピングする便利な方法を提供します。 しかし、コンテンツカード、機能フラグ、通知などのいくつかのBraze機能は、アプリにBrazeインスタンスを使用して統合する必要があります。
Brazeインスタンスに直接アクセスするには、onReady
メソッドを使用します。onReady
メソッドは、適切に構成された後に完了ブロックでBrazeインスタンスを返します。
brazeRemoteCommand.onReady { braze in
// ここでBrazeインスタンスを使用
}
Brazeインスタンスへの参照を取得したら、Brazeのドキュメントに記載されているように使用してください。
自動プッシュ統合
最新のBrazeバージョンは、リモート通知の処理を自動化する方法をサポートしています。詳細については、Braze 開発者ガイド: 自動プッシュ統合を参照してください。
この機能を使用するには、アプリデリゲートの didFinishLaunchingWithOptions
メソッドでメインスレッド上で同期的にBrazeインスタンスを初期化する必要があります。これは、リモートコマンド構成を使用するのではなく、Brazeインスタンスを直接構成する必要があることを意味します。
Brazeインスタンスを直接構成するには、このコードを使用します:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let brazeConfig = Braze.Configuration(apiKey: "YOUR_API_KEY", endpoint: "YOUR_ENDPOINT")
brazeConfig.push.automation = true
// ...
// 他のすべての構成をここに追加
// ...
let brazeInstanceWrapper = BrazeInstance()
brazeInstanceWrapper.initializeBraze(brazeConfig: brazeConfig)
let brazeCommand = BrazeRemoteCommand(brazeInstance: brazeInstanceWrapper)
let tealiumConfig = TealiumConfig(...)
tealiumConfig.remoteCommands = [brazeCommand]
// ...
// tealiumの初期化を完了
return true
}
マニュアルプッシュ統合
マニュアルプッシュ統合を実装するには、リモートコマンド構成を維持し、Brazeインスタンスに直接アクセスしてプッシュ統合を有効にします。
詳細については、Braze 開発者ガイド: マニュアルプッシュ統合を参照してください。
最終更新日 :: 2025年March月19日