> ## Documentation Index
> Fetch the complete documentation index at: https://moengage.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# In-App NATIV

> MoEngage In-App NATIV SDK を使用して、Android アプリのユーザーにコンテキストに応じたアプリ内メッセージを表示します。

In-App NATIV キャンペーンは、ユーザーがアプリを使用している間にメッセージを表示することでユーザーをターゲティングします。コンテキストに応じた情報を提供するのに非常に効果的であり、アプリの特定の画面や、ユーザーがアプリ内で実行した特定のアクションに応じて、クロスセルやアップセルを促進するのに役立ちます。

![最新のポップアップ画像](https://mintcdn.com/moengage/3fwD92u70iGpcH9W/images/Latest_Popupimage.png?fit=max\&auto=format\&n=3fwD92u70iGpcH9W\&q=85\&s=2741d1ad469687e9d94bcf1f0282a4d0)

# 前提条件

アプリ内メッセージを統合する前に、`app/build.gradle` に以下の依存関係を追加します。

* **MoEngage In-App モジュール** — BOM を使用した統合を推奨します。[BOM を使用したインストール](/docs/ja/developer-guide/android-sdk/sdk-integration/basic-integration/Install-Using-BOM)を参照してください。BOM を構成すると、バージョン番号は自動的に管理されます。
* **Glide** — In-App バージョン **7.0.0** 以降、SDK はアプリ内メッセージで画像と GIF を描画するために [Glide](https://bumptech.github.io/glide/) を必要とします。実行時に Glide がない場合、画像や GIF を含むアプリ内メッセージはクラッシュします。

```groovy build.gradle wrap theme={null}
dependencies {
    ...
    implementation("com.moengage:inapp")
    implementation("com.github.bumptech.glide:glide:4.16.0")
}
```

BOM を構成したら、アプリケーションに必要な特定の MoEngage モジュールを含めます。 \
注: これらの依存関係にはバージョン番号は不要です。BOM がバージョンを自動的に管理します。

# アプリ内メッセージの表示

> [!NOTE]
>
> MoEngage は、meta API 呼び出しを介して対象となるアプリ内キャンペーンのリストを更新します。アクティブなセッション中は、アプリがバックグラウンドからフォアグラウンドに戻ったときにリストが更新され (最大で 15 分に 1 回)、新しいセッションが開始されたとき、またはアプリが強制終了されて再起動されたときには即座に更新されます。

MoEngage はデフォルトではアプリ内メッセージを表示できないため、アプリはユーザーにアプリ内メッセージを表示する必要がある箇所で以下のメソッドを呼び出す必要があります。このメソッドは、Activity の onStart() または Fragment の onResume() に追加することを推奨します。[MoEInAppHelper.getInstance().showInApp(context)](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/show-in-app.html) 

```kotlin Kotlin wrap theme={null}
MoEInAppHelper.getInstance().showInApp(context)
```

```java Java theme={null}
MoEInAppHelper.getInstance().showInApp(context);
```

# Nudge の表示

バージョン \*\*7.0.0\*\* 以降、MoEngage InApp SDK は邪魔にならない (Non-Intrusive) Nudge の表示をサポートしています。

MoEngage はデフォルトでは Nudge を表示できないため、アプリはユーザーに Nudge を表示する必要がある箇所で以下のメソッドを呼び出す必要があります。このメソッドは、Activity の onStart() または Fragment の onResume() に追加することを推奨します。[MoEInAppHelper.getInstance().showNudge(context)](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/show-nudge.html)

```kotlin Kotlin wrap theme={null}
MoEInAppHelper.getInstance().showNudge(context)
```

```java Java theme={null}
MoEInAppHelper.getInstance().showNudge(context);
```

# 構成変更の処理

SDK バージョン **11.4.00** 以降、アプリ内メッセージは縦向きモードと横向きモードの両方でサポートされています。Activity の再起動がシステムによって処理される場合、SDK は画面の向きの変更時のアプリ内メッセージの表示を内部で処理します。

Activity が構成変更を独自に処理している場合は、Activity がフレームワークから *onConfigurationChanged()* コールバックを受け取ったときに、[*MoEInAppHelper.getInstance().onConfigurationChanged()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/on-configuration-changed.html) API を呼び出して SDK に通知し、SDK がアプリ内メッセージを再描画できるようにする必要があります。

```kotlin Kotlin wrap theme={null}
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    MoEInAppHelper.getInstance().onConfigurationChanged()
}
```

```java Java theme={null}
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) {   
    super.onConfigurationChanged(newConfig);
    MoEInAppHelper.getInstance().onConfigurationChanged();
}
```

# コンテキストに応じたアプリ内メッセージ

アプリ内キャンペーンを特定の画面/Activity に制限するだけでなく、アプリケーション内のユーザーのコンテキストに基づいてアプリ内メッセージを制限することもできます。アプリケーション内のユーザーのコンテキストを設定するには、以下のように [*setInAppContext()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/set-in-app-context.html) API を使用します。

## コンテキストの設定

*showInApp()* を呼び出す前に、*Activity* または *Fragment* の *onStart()* で以下のメソッドを呼び出します。

```kotlin Kotlin wrap theme={null}
MoEInAppHelper.getInstance().setInAppContext(setOf("context1", "context2", "context3"))
```

```java Java theme={null}
Set<String> inAppContext = new HashSet<>();
inAppContext.add("context1");
inAppContext.add("context2");
inAppContext.add("context3");
MoEInAppHelper.getInstance().setInAppContext(inAppContext);
```

このコンテキストは、[Android Context](https://developer.android.com/reference/android/content/Context?hl=en) とは異なります。アプリケーションのフローにおけるユーザーのコンテキストです。

## コンテキストのリセット

ユーザーがそのコンテキストから離れたら、[*restInAppContext()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/reset-in-app-context.html) API を使用して既存のコンテキストをリセット/クリアします。

```kotlin Kotlin wrap theme={null}
MoEInAppHelper.getInstance().resetInAppContext()
```

```java Java theme={null}
MoEInAppHelper.getInstance().resetInAppContext();
```

以下はコード例です。

```kotlin Kotlin wrap theme={null}
 
      // Activity
      class MyCustomActivity: Activity() {
        override fun onStart() {
           super.onStart()
           MoEInAppHelper.getInstance().setInAppContext(setOf("context1", "context2"))
           MoEInAppHelper.getInstance().showInApp(this)
       }
        override fun onStop() {
           super.onStop()
           MoEInAppHelper.getInstance().resetInAppContext()
       }
      }
      
      
      
      // Fragment
      class MyCustomFragment: Fragment() {

      override fun onStart() {
          super.onStart()
          // Fragment's onStart code
        
          // context1 and context2 can be changes as per screen/requirement
          MoEInAppHelper.getInstance().setInAppContext(setOf("context1", "context2"))
          MoEInAppHelper.getInstance().showInApp(this)
      }

      override fun onStop() {
          super.onStop()
          // Fragment's onStop code
        
          MoEInAppHelper.getInstance().resetInAppContext()
      }
    }
```

```java Java theme={null}

      // Activity
      public class MyCustomActivity extends Activity {
      @Override
    protected void onStart() {
        super.onStart();
        // Activity's custom onStart logic here
        Set inAppContext = new HashSet<>();
        inAppContext.add("context1"); // Change the string name as per your requirement
        inAppContext.add("context2"); // Change the string name as per your requirement
        MoEInAppHelper.getInstance().setInAppContext(inAppContext);
        MoEInAppHelper.getInstance().showInApp(this)
    }

    @Override
    protected void onStop() {
        super.onStop();
        // Activity's custom onStop logic here
        MoEInAppHelper.getInstance().resetInAppContext();
        
    }
      }
      
      
      
          // Fragment
public class MyCustomFragment extends Fragment {

    // Other Fragment code
    
    @Override
    public void onStart() {
        super.onStart();
        // Fragment's onStart code here
        Set inAppContext = new HashSet<>();
        inAppContext.add("context1");
        inAppContext.add("context2");
        MoEInAppHelper.getInstance().setInAppContext(inAppContext);
        MoEInAppHelper.getInstance().showInApp(this)
    }

    @Override
    public void onStop() {
        super.onStop();
        MoEInAppHelper.getInstance().resetInAppContext();
    }
}
```

# WebView のカスタマイズ

In-App SDK バージョン **9.6.0** 以降、SDK は HTML アプリ内メッセージの描画に使用される基盤の WebView のカスタマイズをサポートしています。これにより、HTML アプリ内メッセージの描画に使用される WebView に対して、WebView の設定の変更、カスタム JavaScript インターフェースの追加、その他の構成の実装が可能になります。

WebView をカスタマイズするには、`MoEInAppHelper.getInstance().setInAppWebViewCustomizer()` API を呼び出す必要があります。この API を使用して定義したカスタム設定は、MoEngage In-App のデフォルトの WebView 設定をオーバーライドします。

```kotlin Kotlin wrap theme={null}
MoEInAppHelper.getInstance().setInAppWebViewCustomizer {
    addJavascriptInterface(MyBridge(), "bridge")
    settings.mediaPlaybackRequiresUserGesture = false
}
```

```java Java theme={null}
MoEInAppHelper.getInstance().setInAppWebViewCustomizer(
    new kotlin.jvm.functions.Function1<inappwebview,>() {
        @Override
        public kotlin.Unit invoke(InAppWebView webView) {
            WebSettings settings = webView.getSettings();
            settings.setMediaPlaybackRequiresUserGesture(false);
            webView.addJavascriptInterface(new CustomJavaScriptBridge(), "myBridge");
            return kotlin.Unit.INSTANCE;
        }
    }
);</inappwebview,>
```

# セルフハンドルのアプリ内メッセージ

セルフハンドルのアプリ内メッセージとは、SDK がアプリケーションに配信するメッセージであり、アプリケーションは SDK が配信したペイロードを使用して UI を構築します。

## 単一のセルフハンドルのアプリ内メッセージ

セルフハンドルのアプリ内メッセージを取得するには、以下の API を使用します。

```kotlin Kotlin wrap theme={null}
MoEInAppHelper.getInstance().getSelfHandledInApp(context, listener)
```

```java Java theme={null}
MoEInAppHelper.getInstance().getSelfHandledInApp(context, listener);
```

**listener** は [*SelfHandledAvailableListener*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-self-handled-available-listener/index.html) のインスタンスです。

このメソッドは、Fragment の *onResume()* または Activity の *onStart()* で呼び出す必要があります。\
上記のメソッドは非同期であり、ペイロードをすぐには返しません。ペイロードが利用可能になると、リスナーのコールバックである [*onSelfHandledAvailable()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-self-handled-available-listener/on-self-handled-available.html) がペイロードとともに呼び出されます。

### イベントトリガー型のセルフハンドルのアプリ内メッセージ

イベントトリガー型のコールバックを受け取るには、*SelfHandledAvailableListener* を実装し、[*MoEInAppHelper.getInstance().setSelfHandledListener()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/set-self-handled-listener.html) を使用してリスナーを登録します。キャンペーンが利用可能になると、SDK は登録されたリスナーに通知します。

トリガーイベントが複数の画面で発生する可能性がある場合は、このリスナーを *Application* クラスの *onCreate()* で登録することを推奨します。

## 複数のセルフハンドルのアプリ内メッセージ

> [!NOTE]
>
> * この機能には、カタログバージョン **4.5.0** 以上が必要です
> * イベントトリガー型の複数のセルフハンドルのアプリ内メッセージはサポートされていません。

[*getSelfHandledInApps()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/get-self-handled-in-app.html) を使用して、複数のセルフハンドルキャンペーンを取得します。MoEngage SDK は、キャンペーン利用可能時のコールバックメソッド [*onCampaignsAvailable()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-self-handled-campaigns-available-listener/on-campaigns-available.html) で、最大 5 つのキャンペーン (キャンペーン作成時に設定されたキャンペーンの優先度順) を返します\*\*。\*\*

```kotlin Kotlin wrap theme={null}
MoEInAppHelper.getInstance().getSelfHandledInApps(context, listener)
```

```java Java theme={null}
MoEInAppHelper.getInstance().getSelfHandledInApps(context, listener);
```

*listener* は [*SelfHandledCampaignsAvailableListener*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-self-handled-campaigns-available-listener/index.html) のインスタンスです[。](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-self-handled-available-listener/index.html)

このメソッドは、Fragment の *onResume()* または Activity の *onStart()* で呼び出す必要があります。\
上記のメソッドは非同期であり、ペイロードをすぐには返しません。ペイロードが利用可能になると、リスナーの [*onCampaignsAvailable() コールバック*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-self-handled-campaigns-available-listener/on-campaigns-available.html)がペイロードとともに呼び出されます。

### 複数のセルフハンドルのアプリ内メッセージの統計情報のトラッキング

*onCampaignsAvailable()* コールバックメソッドは、[*SelfHandledCampaignData*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.model/-self-handled-campaign-data/index.html) オブジェクトのリストを含む [*SelfHandledCampaignsData*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.model/-self-handled-campaigns-data/index.html) を返します。各 *SelfHandledCampaignData* オブジェクトの統計情報は、以下の API を使用して個別にトラッキングする必要があります。

### コンテキストに応じた複数のセルフハンドルのアプリ内メッセージの取得

コンテキストに応じた複数のセルフハンドルのアプリ内メッセージを取得するには、\*[getSelfHandledInApps()](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/get-self-handled-in-app.html)\* を呼び出す前に、[*setInAppContext()*](https://www.moengage.com/docs/developer-guide/android-sdk/in-app-messages/in-app-nativ#set-context) を使用してアプリ内メッセージのコンテキストを設定します。これにより、コンテキストありとコンテキストなしのアプリ内メッセージのリスト (キャンペーン作成時に設定されたキャンペーンの優先度順) が返されます。

### キャンペーンの選択ロジック

* **デフォルトの上限**: デフォルトでは、5 つのキャンペーンのみが取得されます。
* **優先度に基づく選択**: キャンペーンは、優先度と最終更新日時に基づいて配信されます。まず優先度を確認し、優先度が競合する場合は最終更新日時を確認します。
* **除外基準**: キャンペーンは、フリークエンシーキャップ、適格性の基準、キャンペーンのステータス、優先度の上限などの特定のルールに基づいてのみ除外されます。

**シナリオ例:** 優先度、公開日時、コンテキストがそれぞれ異なる 6 つのキャンペーンがある場合:

* コンテキスト 1: キャンペーン 1 (P0, T2)、キャンペーン 2 (P1, T3)、キャンペーン 3 (P2, T6)
* コンテキスト 2: キャンペーン 4 (P0, T1)、キャンペーン 5 (P1, T5)
* コンテキスト 3: キャンペーン 6 (P0, T4)

以下のキャンペーンがこの順序で配信されます: \[キャンペーン 4、キャンペーン 1、キャンペーン 6、キャンペーン 2、キャンペーン 5]

**選択アルゴリズム:**

1. ユーザーの適格性とターゲティング基準でキャンペーンをフィルタリングする
2. キャンペーンの優先度 (P0、P1、P2 など) で並べ替える
3. 優先度が同じキャンペーンは、最新の更新タイムスタンプで並べ替える
4. 上位 5 つのキャンペーンを返す

#### **複数のセルフハンドルキャンペーンにおけるキャンペーン構成のベストプラクティス**

1 つのページで複数のコンテキストにわたって最適なパフォーマンスを得るには、以下のようにキャンペーンを構成します。

* コンテキスト 1 (ホームページ): キャンペーン A (P0)、キャンペーン B (P1)
* コンテキスト 2 (商品): キャンペーン C (P0)、キャンペーン D (P1)
* コンテキスト 3 (チェックアウト): キャンペーン E (P0)

これにより、5 キャンペーンの上限に達することなく、各コンテキストに関連するキャンペーンを確保できます。

また、このメソッドはコンテキストベースかどうかに関係なくすべてのセルフハンドルキャンペーンを取得するため、取得したいキャンペーンの優先度を適切に設定してください。

## セルフハンドルのアプリ内メッセージの統計情報のトラッキング

アプリ内メッセージの表示、クリック、閉じる操作はアプリケーションが制御するため、これらが発生するたびにアプリケーションは MoEngage SDK に通知する必要があります。SDK に通知するには、以下のメソッドを呼び出します。セルフハンドルのアプリ内メッセージのコールバックでアプリケーションに提供されるデータオブジェクト [*SelfHandledCampaignData*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.model/-self-handled-campaign-data/index.html) を、以下の API のパラメーターとして渡す必要があります。

```kotlin Kotlin wrap theme={null}
// call whenever in-app is shown
MoEInAppHelper.getInstance().selfHandledShown(context, data)
// call whenever in-app is clicked
MoEInAppHelper.getInstance().selfHandledClicked(context, data)
// call whenever in-app is dismissed
MoEInAppHelper.getInstance().selfHandledDismissed(context, data)
```

```java Java theme={null}
// call whenever in-app is shown
MoEInAppHelper.getInstance().selfHandledShown(context, data);
// call whenever in-app is clicked
MoEInAppHelper.getInstance().selfHandledClicked(context, data);
// call whenever in-app is dismissed
MoEInAppHelper.getInstance().selfHandledDismissed(context, data);
```

詳細については、[API ドキュメント](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/index.html#-59857046%2FFunctions%2F434681417)を参照してください。

# アプリ内メッセージのコールバック

## ライフサイクルコールバック

アプリ内キャンペーンが表示または閉じられるたびにコールバックを受け取るには、[*InAppLifeCycleListener*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-in-app-life-cycle-listener/index.html) を実装し、[*MoEInAppHelper.getInstance().addInAppLifeCycleListener()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/add-in-app-life-cycle-listener.html) を使用してコールバックを登録します。

## クリックコールバック

ユーザーのナビゲーションやカスタムアクションを処理するために、SDK は、ナビゲーションアクションまたはカスタムアクションが設定されたアプリ内ウィジェットがクリックされるたびにコールバックを提供します。コールバックを受け取るには、[*OnClickActionListener*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.listeners/-on-click-action-listener/index.html) インターフェースを実装し、[*MoEInAppHelper.getInstance().setClickActionListener()*](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp/-mo-e-in-app-helper/set-click-action-listener.html) を使用してコールバックを登録します。

# 画面でのアプリ内メッセージのブロック

さらに、[InAppConfig](https://moengage.github.io/android-api-reference/inapp/com.moengage.inapp.config/index.html) オブジェクトを使用して、特定の画面でアプリ内メッセージをブロックしたり、ステータスバーの表示を制御したりでき、そのオブジェクトを [MoEngage.Builder](https://moengage.github.io/android-api-reference/core/com.moengage.core/-mo-engage/-builder/index.html) オブジェクトを使用して SDK に渡します。[configureInApps()](https://moengage.github.io/android-api-reference/core/com.moengage.core/-mo-engage/-builder/configure-in-apps.html) API を使用して、構成を SDK に渡します。

```kotlin Kotlin wrap theme={null}
// List of activity classes on which in-app should not be shown
val inAppOptOut = mutableListOf<String>()
inAppOptOut.add(SplashActivity::class.java.name)
val moengage = MoEngage.Builder(
        application = application,
        appId = "YOUR_WORKSPACE_ID",
        dataCenter = DataCenter.DATA_CENTER_X
    )
    .configureInApps(InAppConfig(inAppOptOut, true))
    .build()
MoEngage.initialiseDefaultInstance(moengage)
```

```java Java theme={null}
ArrayList<String> inAppOptOut = new ArrayList<>();
inAppOptOut.add(SplashActivity.class.getName());
MoEngage.Builder builder = new MoEngage.Builder(application, "YOUR_WORKSPACE_ID", DataCenter.DATA_CENTER_X)
    .configureInApps(new InAppConfig(inAppOptOut, true));
MoEngage.initialiseDefaultInstance(builder.build());
```

# アプリ内メッセージのテスト

アプリ内メッセージの作成方法とテスト方法の詳細については、こちらの[リンク](https://www.moengage.com/docs/user-guide/campaigns-and-channels/in-app-message/create/test-your-in-app-campaign)を参照してください。

# 埋め込み Nudge の実装 (非推奨)

> [!NOTE]
>
> InApp バージョン **7.0.0** 以降、埋め込み Nudge はサポートされなくなりました。

Nudge は、Activity 内の任意の場所に配置できる、邪魔にならないメッセージです。

![最新の Nudge 画像](https://mintcdn.com/moengage/3fwD92u70iGpcH9W/images/LatestNudgeimage.png?fit=max\&auto=format\&n=3fwD92u70iGpcH9W\&q=85\&s=da26440f954fb9e04b85c5d746b0531d)

Activity/Fragment のレイアウトファイルに以下のコードを追加します。

```XML XML wrap theme={null}
<com.moengage.widgets.NudgeView
    android:id="@+id/nudge"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</com.moengage.widgets.NudgeView>
```

## Activity での使用

Activity の **onCreate()** で Nudge ビューのインスタンスを取得し、**onStart()** で Nudge ビューを初期化します。

## Fragment での使用

Fragment の **onCreateView()** で Nudge ビューのインスタンスを取得し、**onResume()** で Nudge ビューを初期化します。

以下のコードを使用して ***NudgeView*** のインスタンスを取得し、初期化します。

```kotlin Kotlin wrap theme={null}
// get instance of the view
val nudge = findViewById(R.id.nudge)
// initialize
nudge.initialiseNudgeView(activity)
```

```java Java theme={null}
// get instance of the view
NudgeView nv = (NudgeView)findViewById(R.id.nudge);
// initialize
nv.initialiseNudgeView(getActivity());
```

# よくある質問

> **Android の HTML アプリ内メッセージで \<input type='file'> やカメラ/ギャラリーからのアップロードが機能しないのはなぜですか?**
>
> * In-App SDK バージョン 9.6.0 以上の場合は、[WebView のカスタマイズ](https://www.moengage.com/docs/developer-guide/android-sdk/in-app-messages/in-app-nativ#webview-customization)を参照してください。
> * In-App SDK バージョン 9.6.0 未満を使用している場合は、以下の手順を実行します。
>   * Android のデフォルトの WebView はファイル入力をサポートしていません。この機能を有効にするには、HTML からカスタムアクションをトリガーし、*OnClickActionListener* を使用してネイティブで処理します。\
>     リスナー内で、ネイティブのファイルピッカーまたはカメラのロジックを起動します。アプリが CAMERA や READ\_EXTERNAL\_STORAGE などの必要なランタイム権限をリクエストしていることを確認してください。
>
> ![HTMLGUYS](https://mintcdn.com/moengage/b13dNrqwcDhjET-m/images/HTMLGUYS.png?fit=max\&auto=format\&n=b13dNrqwcDhjET-m\&q=85\&s=7e2cd251fc0581dbc2fe8255b79c3b99)
>
> 例:
>
> ```kotlin Kotlin wrap theme={null}
> val listener = OnClickActionListener { clickData ->
>   if (clickData.action.actionType == ActionType.CUSTOM_ACTION &&
>   (clickData.action as CustomAction).keyValuePairs["action"] == "uploadPhoto")
>   {
>   openImageChooser() // Your native camera/gallery function
>   true // Indicates the action was handled
>   } else {
>   false
>   }
>   }
> ```
>
> * iOS では、ファイル入力はデフォルトで機能します。ただし、クロスプラットフォームで一貫した実装にするため、同じカスタムアクションのアプローチを使用することを推奨します。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.