ios/Runner.xcworkspace を起動して iOS プロジェクトを開いてください。
このガイドでは、MoEngage の Service Extension と Content Extension を iOS アプリケーションに統合する方法について説明します。これらの拡張機能により、通知インプレッションのトラッキング、リッチメディア(画像、GIF、動画)のサポート、リッチプッシュ通知テンプレートの使用が可能になります。
Service Extension と Content Extension の統合
これらの拡張機能がない場合、MoEngage はプッシュインプレッションをトラッキングできず、リッチメディア通知はプレーンテキストにフォールバックし、リッチプッシュテンプレートはフォールバックテンプレートでレンダリングされます。ステップ 1: 前提条件
先に進む前に、以下が揃っていることを確認してください。- Extension Integrator Tool を利用するには、MoEngage Flutter SDK バージョン 10.6.0 以上を使用していることを確認してください。
- SDK の初期化: ファイルベースの初期化を使用して MoEngage SDK を初期化します。
- App Group の設定:
AppGroupNameキー(例:group.com.organization.app)を使用して、設定内で App Group を定義します。- この App Group を Xcode の Signing & Capabilities に追加します。

- この App Group を Xcode の Signing & Capabilities に追加します。
- App Group の設定:
- 統合が完了すると、コード署名のためにキーチェーンへのアクセスを求められる場合があります。常に許可 をクリックしてください。

ステップ 2: Service Extension の設定
Service Extension は、通知インプレッションをトラッキングし、リッチメディアコンテンツをダウンロードします。- App Identifier を作成します:
[appBundleId].[serviceExtensionName].の形式を使用します。[appBundleId]をアプリケーション固有のバンドル識別子に置き換えます。[serviceExtensionName]を任意の名前(デフォルトは MoEngageNotificationService)に置き換えます。例 : アプリのバンドル識別子がcom.org.appで、拡張機能の名前がNotificationServiceの場合、識別子はcom.org.app.NotificationServiceになります。
既存の Notification Service Extension がある場合は、それを再利用できます。新しく作成する必要はありません。ステップ 5 の Run Script Phase を設定する際に、
--notification-service-extension-name フラグを使用してその名前を渡してください。ツールは、カスタムコードを上書きすることなく、必要な MoEngage のロジックを挿入します。- 手順 1 で作成した Service Extension の識別子を選択し、Capabilities タブを開いて App Groups を追加します。
AppGroupNameキーと一致する名前を入力します。
- プロビジョニングプロファイルの生成: Apple Developer Portal で、手順 1 で作成した識別子用の新しいプロビジョニングプロファイルを作成し、ダウンロードします。Xcode でダウンロードするには、メニューバーの Xcode をクリックし、Settings を選択します。

- Apple Accounts セクションに切り替え、Apple デベロッパーアカウントを選択します。Apple Accounts ページで Download Manual Profiles を選択します。

ステップ 3: Content Extension の設定(オプション)
Content Extension は、MoEngage のリッチプッシュ通知テンプレートを使用する場合にのみ必要です。- App Identifier を作成します:
[appBundleId].[contentExtensionName].の形式を使用します。[appBundleId]をアプリケーション固有のバンドル識別子に置き換えます。[contentExtensionName]を任意の名前(デフォルトは MoEngageNotificationContent)に置き換えます。例_:_ アプリのバンドル識別子がcom.org.appで、拡張機能の名前がNotificationContentの場合、識別子はcom.org.app.NotificationContentになります。
- Content Extension の識別子を選択し、Capabilities タブを開いて App Groups を追加します。
AppGroupNameキーと一致する名前を入力します。
- プロビジョニングプロファイルの生成: Apple Developer Portal で、手順 1 で作成した識別子用の新しいプロビジョニングプロファイルを作成し、ダウンロードします。Xcode でダウンロードするには、メニューバーの Xcode をクリックし、Settings を選択します。

- Apple Accounts セクションに切り替え、Apple デベロッパーアカウントを選択します。Apple Accounts ページで Download Manual Profiles を選択します。

ステップ 4: MoEngageRichNotification の統合(オプション)
次のいずれかのプッシュ通知機能をサポートする必要がある場合は、MoEngageRichNotification を統合します。
- リッチメディア — 通知バナーに画像、GIF、動画を表示する
- リッチプッシュテンプレート — カルーセルなどのインタラクティブな通知レイアウトをレンダリングする
ステップ 3 で説明した Content Extension を統合している場合、この手順は必須です。
- Swift Package Manager (SPM)
- CocoaPods
SPM を使用して
MoEngageRichNotification をインストールするには、次の手順を実行します。- File > Add Package に移動します。
- リポジトリの URL を入力します。
https://github.com/moengage/apple-sdk.git
- master ブランチまたは特定のバージョンを選択し、Add Package を選択します。
- パッケージのターゲットをアプリケーションに設定します。
ステップ 5: Extension Integrator Tool の統合
ビルドプロセスにカスタムスクリプトを追加して、拡張機能の設定を自動化します。- Xcode でアプリケーションターゲットを選択し、Build Phases に移動して + をクリックし、New Run Script Phase を追加します。

- Input Files セクションに次のパスを追加します。
$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)$(INSTALL_DIR)/$(INFOPLIST_PATH)

- 上の画像の integrate_extensions を置き換えて、使用している依存関係マネージャーに応じたコマンドを入力します。
既にスクリプトフェーズを追加して入力ファイルを設定している場合は、以下で説明するように実行コマンドを更新するだけで済みます。
- Swift Package Manager (SPM)
- CocoaPods
Swift Package Manager (SPM)
利用可能なオプション
$OPTIONS を次の 1 つ以上に置き換えます。
コマンドの例(SPM)
NotificationService という名前の Service Extension と NotificationContent という名前の Content Extension を統合する場合、SPM の完全なコマンドは次のようになります。
Swift Package Manager (SPM)
- サンドボックスの無効化: アプリケーションターゲットの Build Settings で、USER_SCRIPT_SANDBOXING を No に設定します。

Extension Integrator Tool への移行
既存の手動実装から Integrator Tool に移行するには、こちらを参照してください。トラブルシューティングと FAQ
Integrator Tool がエラーを返しました。どのように解決すればよいですか?
Integrator Tool がエラーを返しました。どのように解決すればよいですか?
詳細については、ビルドログを確認してください。
一般的な原因は次のとおりです。

- 統合の誤り: セットアップが Service Extension と Content Extension の統合ガイドに従っていません。
- 設定の欠落:
Info.plistに必要な MoEngage の設定オプションがありません。 - App Group の不一致:
Info.plistで指定されたAppGroupNameが、Service Extension と Content Extension のバンドル識別子の capabilities、またはアプリケーションの entitlements に含まれていません。 - 環境の不一致: プロビジョニングプロファイルが特定のビルド環境用に作成されていません(例: App Store ビルドの生成時に Development プロファイルを使用している)。
- カスタムディレクトリの問題: プロビジョニングプロファイルがデフォルトの Xcode ディレクトリに保存されていません。カスタムパスを渡すには、追加の設定用ビルド設定を使用してください。
- 証明書の問題: プロビジョニングプロファイルの生成時に、証明書の設定が欠落しているか誤っています。
- プロファイルの有効期限切れ: プロビジョニングプロファイルの有効期限が切れています。プロファイルを再生成して再ダウンロードする必要があります。
Service Extension と Content Extension の両方を統合する必要がありますか?
Service Extension と Content Extension の両方を統合する必要がありますか?
いいえ。Service Extension は、通知インプレッションのトラッキングとリッチメディア(画像/GIF/動画)のダウンロードに必須です。Content Extension は、MoEngage のインタラクティブな リッチプッシュテンプレート(カルーセルやカスタムボタンレイアウトなど)を使用する場合にのみ必要です。
「App Group」の設定が必須なのはなぜですか?
「App Group」の設定が必須なのはなぜですか?
iOS の拡張機能は、メインアプリケーションとは別のサンドボックスで実行されます。App Group は共有コンテナを作成し、メインアプリ内の MoEngage SDK が認証トークン、ユーザーデータ、ローカルストレージを拡張機能と共有できるようにします。これがないと、拡張機能はユーザーを検証したり、インプレッションを正しくトラッキングしたりできません。
Build Settings で「User Script Sandboxing」を無効にする必要があるのはなぜですか?
Build Settings で「User Script Sandboxing」を無効にする必要があるのはなぜですか?
Extension Integrator Tool は、標準の Xcode サンドボックス外のシステムフォルダーにあるプロジェクトのビルド成果物とプロビジョニングプロファイルにアクセスする必要があります。
ENABLE_USER_SCRIPT_SANDBOXING が Yes に設定されていると、スクリプトがブロックされ、ビルドフェーズ中に「Permission Denied」エラーが発生します。このツールで複数のビルド環境(Dev/Staging/Prod)を扱うにはどうすればよいですか?
このツールで複数のビルド環境(Dev/Staging/Prod)を扱うにはどうすればよいですか?
追加のビルド設定を使用して、ローカルビルドと CI ビルドの両方で Integrator Tool に特定の設定入力を提供できます。
MOENGAGE_EXTENSION_PROFILES_SEARCH_PATHS: プロビジョニングプロファイルを検索する追加のフォルダーを指定するために使用します。デフォルトでは、ツールは標準の Xcode ディレクトリを検索します。~/Library/Developer/Xcode/UserData/Provisioning Profiles~/Library/MobileDevice/Provisioning Profilesプロビジョニングプロファイルがこれらのフォルダーにない場合は、このビルド設定で追加のパスを指定してください。
MOENGAGE_NOTIFICATION_SERVICE_EXTENSION_PROFILE: Notification Service Extension のプロビジョニングプロファイルのファイル名を明示的に指定します。ツールはプロビジョニングプロファイルを検索する代わりに、このファイル名を使用します。プロファイルは上記のいずれかのフォルダーに存在する必要があります。ツールが正しいプロビジョニングプロファイルを選択できない場合に、このオプションを使用してください。MOENGAGE_NOTIFICATION_CONTENT_EXTENSION_PROFILE: Notification Content Extension のプロビジョニングプロファイルのファイル名を明示的に指定します。ツールはプロビジョニングプロファイルを検索する代わりに、このファイル名を使用します。プロファイルは上記のいずれかのフォルダーに存在する必要があります。ツールが正しいプロビジョニングプロファイルを選択できない場合に、このオプションを使用してください。
リッチメディアが通知に表示されません。何が問題ですか?
リッチメディアが通知に表示されません。何が問題ですか?
これは通常、次の 3 つの技術的なギャップのいずれかに起因します。
- App Group の不一致:
Info.plist内のAppGroupNameの文字列が Entitlements ファイルと完全に一致していることを確認してください。 - ペイロードのタイムアウト: iOS は拡張機能にメディアをダウンロードするための約 30 秒を与えます。アセットが大きすぎる場合やネットワークが遅い場合は、プレーンテキストにフォールバックします。
このツールはカスタムの Derived Data パスや CI/CD で動作しますか?
このツールはカスタムの Derived Data パスや CI/CD で動作しますか?
はい。ステップ 5 のスニペットの
case "$ACTION" ブロックはすべてのビルドアクションに対応しているため、記載どおりに使用してください。CI 環境で、パスの解決を妨げるカスタムの Derived Data またはビルドディレクトリを使用している場合は、代わりに moengage-extensions-integration バイナリへの絶対パスを指定してください。