---
title: "アプリでアトリビューションデータを受け取る"
description: "Adaptyがインストールをキャンペーンに紐付けた後、アプリ内でキャンペーンのアトリビューションデータにアクセスします。"
---

Adaptyがインストールをキャンペーンに紐付けると、`onInstallationDetailsSuccess` コールバックを通じてアプリにアトリビューションデータが返されます。このデータを使って、インストールを促したチャネルやキャンペーンに基づいてユーザー体験をパーソナライズできます。

アトリビューションデータは、`payload` フィールド内にネストされた `attribution` オブジェクトとして返されます。以下のフィールドが含まれます：
| フィールド | 説明 |
|---|---|
| `channel` | 獲得チャネル（例: `facebook`、`tiktok`、`google`、`organic`） |
| `campaign_id` | キャンペーン識別子 |
| `campaign_name` | キャンペーン名 |
| `adset_id` | 広告セット / 広告グループの識別子 |
| `adset_name` | 広告セット / 広告グループ名 |
| `ad_id` | 広告 / クリエイティブの識別子 |
| `ad_name` | 広告 / クリエイティブ名 |

すべてのフィールドは任意です。オーガニックインストールの場合や、アトリビューションを特定できなかった場合、`payload` フィールドに `attribution` オブジェクトは含まれません。

アプリでアトリビューションデータを読み取るには：
<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="Swift" default>

```swift showLineNumbers
Adapty.delegate = self

nonisolated func onInstallationDetailsSuccess(_ details: AdaptyInstallationDetails) {
    guard
        let payloadDict = details.payload?.dictionary,
        let attribution = payloadDict["attribution"] as? [String: Any]
    else { return }

    let channel = attribution["channel"] as? String
    let campaignName = attribution["campaign_name"] as? String
    let adName = attribution["ad_name"] as? String

    print("Channel: \(channel ?? "organic")")
}
```
</TabItem>

<TabItem value="android" label="Kotlin">
```kotlin showLineNumbers
Adapty.setOnInstallationDetailsListener(object : OnInstallationDetailsListener {
    override fun onInstallationDetailsSuccess(details: AdaptyInstallationDetails) {
        val payloadStr = details.payload ?: return
        runCatching {
            val payload = JSONObject(payloadStr)
            val attribution = payload.optJSONObject("attribution") ?: return

            val channel = attribution.optString("channel")
            val campaignName = attribution.optString("campaign_name")
            val adName = attribution.optString("ad_name")

            println("Channel: $channel")
        }.onFailure(Throwable::printStackTrace)
    }
})
```

</TabItem>

<TabItem value="rn" label="React Native">
```typescript showLineNumbers
adapty.addEventListener('onInstallationDetailsSuccess', details => {
    try {
        if (!details.payload) return;
        const payload = JSON.parse(details.payload);
        const attribution = payload.attribution;
        if (!attribution) return;

        const channel = attribution.channel;
        const campaignName = attribution.campaign_name;
        const adName = attribution.ad_name;

        console.log('Channel:', channel ?? 'organic');
    } catch (error) {
        console.error('Error parsing payload:', error);
    }
});
```

</TabItem>
<TabItem value="flutter" label="Flutter">
```dart showLineNumbers
Adapty().onUpdateInstallationDetailsSuccessStream.listen((details) {
  final payloadStr = details.payload;
  if (payloadStr == null) return;

  final payload = json.decode(payloadStr) as Map<String, dynamic>;
  final attribution = payload['attribution'] as Map<String, dynamic>?;
  if (attribution == null) return;

  final channel = attribution['channel'] as String?;
  final campaignName = attribution['campaign_name'] as String?;
  final adName = attribution['ad_name'] as String?;

  print('Channel: ${channel ?? 'organic'}');
});
```

</TabItem>

</Tabs>