react-native-appsflyer
Version:
React Native Appsflyer plugin
380 lines (284 loc) • 10.2 kB
Markdown
This guide explains how to implement AppsFlyer's push notification feature with deep linking in your React Native application.
## Overview
AppsFlyer's push notification feature enables you to:
- Measure push notification campaigns
- Handle deep links from push notifications
- Measure conversion attribution from push campaigns
**There are 2 methods of implementing push notification integration:**
1. **OneLink Method** - Uses OneLink URLs in the push payload
2. **JSON Method** - Uses plain JSON structure in the push payload
Choose the method based on how your marketing team structures the push notifications.
## Prerequisites
- AppsFlyer React Native SDK installed and configured
- A push notification provider (Firebase, OneSignal, etc.)
- Basic AppsFlyer SDK implementation (init, start, attribution, deep linking)
## Method 1: OneLink Method
This method uses OneLink URLs embedded in the push notification payload.
### Required Parameters
The OneLink must contain at least these 3 parameters:
- `pid` - Media source identifier
- `is_retargeting=true` - Indicates this is a re-engagement
- `c` - Campaign name
### Push Payload Structure
```json
{
"data": {
"message": "push message",
"af_push_link": "https://yourapp.onelink.me/ABC123/campaign?pid=push_campaign&is_retargeting=true&c=holiday_sale"
}
}
```
Or with nested structure:
```json
{
"data": {
"message": "push message",
"appsflyer": {
"testing": {
"link": "https://yourapp.onelink.me/ABC123/campaign?pid=push_campaign&is_retargeting=true&c=holiday_sale"
}
}
}
}
```
### Implementation Steps
### 1. Set Up Listeners and Push Configuration
**Important:** Set up all listeners and push configuration BEFORE initializing the SDK:
```jsx
import appsFlyer from 'react-native-appsflyer';
// 1. Handle conversions and attribution (BEFORE init)
appsFlyer.onInstallConversionData((data) => {
console.log('Install conversion data:', data);
});
// 2. Handle deep links (BEFORE init)
appsFlyer.onDeepLink((data) => {
console.log('Deep link data:', data);
});
// 3. Configure push notification deep link path (BEFORE init)
// For simple structure: ["af_push_link"]
// For nested structure: ["data", "appsflyer", "testing", "link"]
appsFlyer.addPushNotificationDeepLinkPath(
['af_push_link'], // Adjust based on your payload structure
(success) => {
console.log('Push notification path added successfully:', success);
},
(error) => {
console.error('Error adding push notification path:', error);
}
);
```
**Parameters for `addPushNotificationDeepLinkPath`:**
- `path`: Array of keys used to resolve the OneLink from push notification payload
- `successCallback`: Called when the path is successfully added
- `errorCallback`: Called if there's an error adding the path
### 2. Initialize and Start AppsFlyer SDK
After setting up all listeners and configurations, initialize and start the SDK:
```jsx
// Initialize AppsFlyer (AFTER setting up listeners)
appsFlyer.initSdk({
devKey: 'YOUR_DEV_KEY',
isDebug: true,
appId: 'YOUR_APP_ID', // iOS only
});
// Start AppsFlyer (AFTER init)
appsFlyer.startSdk();
```
**Parameters:**
- `path`: Array of keys used to resolve the deep link from push notification payload
- `successCallback`: Called when the path is successfully added
- `errorCallback`: Called if there's an error adding the path
### 3. Handle Push Notification Data
In your push notification provider callback (where you receive the notification payload), send the data to AppsFlyer:
```jsx
// Example with Firebase messaging
import messaging from '@react-native-firebase/messaging';
// Background/Quit state messages
messaging().setBackgroundMessageHandler(async (remoteMessage) => {
console.log('Background message:', remoteMessage);
// Send push payload to AppsFlyer
appsFlyer.sendPushNotificationData(
remoteMessage.data, // The push notification payload
(error) => {
console.error('Error sending push data to AppsFlyer:', error);
}
);
});
// Foreground messages
messaging().onMessage(async (remoteMessage) => {
console.log('Foreground message:', remoteMessage);
// Send push payload to AppsFlyer
appsFlyer.sendPushNotificationData(
remoteMessage.data,
(error) => {
console.error('Error sending push data to AppsFlyer:', error);
}
);
});
// Handle notification opened from background/quit state
messaging().onNotificationOpenedApp((remoteMessage) => {
console.log('Notification opened:', remoteMessage);
// Send push payload to AppsFlyer
appsFlyer.sendPushNotificationData(
remoteMessage.data,
(error) => {
console.error('Error sending push data to AppsFlyer:', error);
}
);
})
```
## Method 2: JSON Method
This method uses a plain JSON structure in the push notification payload.
### Required Parameters
The `af` object must contain at least these 3 parameters:
- `pid` - Media source identifier
- `is_retargeting: "true"` - Indicates this is a re-engagement (must be string "true")
- `c` - Campaign name
### Push Payload Structure
The `af` object **must** be at the top level of the `data` object:
```json
{
"data": {
"message": "push message",
"af": {
"pid": "push_campaign",
"is_retargeting": "true",
"c": "holiday_sale"
}
}
}
```
**❌ Invalid Structure (nested af object):**
```json
{
"data": {
"message": "push message",
"appsflyer_data": {
"af": {
"pid": "push_campaign",
"is_retargeting": "true",
"c": "holiday_sale"
}
}
}
}
```
### Implementation Steps
For the JSON Legacy Method, you only need steps 1, 2, and 3 from the OneLink method above, but **skip the `addPushNotificationDeepLinkPath` call**:
```jsx
// 1. Set up listeners (BEFORE init)
appsFlyer.onInstallConversionData((data) => {
console.log('Install conversion data:', data);
});
appsFlyer.onDeepLink((data) => {
console.log('Deep link data:', data);
});
// 2. Initialize and start SDK
appsFlyer.initSdk({
devKey: 'YOUR_DEV_KEY',
isDebug: true,
appId: 'YOUR_APP_ID',
});
appsFlyer.startSdk();
// 3. Handle push data the same way
// The SDK will automatically detect the 'af' object in the payload
```
## Complete Integration Examples
```jsx
import React, { useEffect } from 'react';
import appsFlyer from 'react-native-appsflyer';
import messaging from '@react-native-firebase/messaging';
const AppsflyerPushIntegration = () => {
useEffect(() => {
// 1. Set up attribution and deep link handlers (BEFORE init)
appsFlyer.onInstallConversionData((data) => {
console.log('Conversion data:', data);
});
appsFlyer.onDeepLink((data) => {
console.log('Deep link:', data);
});
// 2. Configure push notification deep link path (BEFORE init)
appsFlyer.addPushNotificationDeepLinkPath(
['af_push_link'], // Adjust based on your payload structure
(success) => console.log('Push path configured'),
(error) => console.error('Push path error:', error)
);
// 3. Initialize AppsFlyer SDK (AFTER listeners and config)
appsFlyer.initSdk({
devKey: 'YOUR_DEV_KEY',
isDebug: true,
appId: 'YOUR_APP_ID',
});
// 4. Start AppsFlyer (AFTER init)
appsFlyer.startSdk();
// 5. Set up push notification handlers
const handlePushData = (payload) => {
appsFlyer.sendPushNotificationData(
payload,
(error) => console.error('Push data error:', error)
);
};
// Background messages
messaging().setBackgroundMessageHandler(async (message) => {
handlePushData(message.data);
});
// Foreground messages
const unsubscribe = messaging().onMessage(async (message) => {
handlePushData(message.data);
});
// Notification opened from background
messaging().onNotificationOpenedApp((message) => {
handlePushData(message.data);
});
}, []);
return null; // This is just a setup component
};
export default AppsflyerPushIntegration;
```
## Important Notes
### Payload Processing
- **OneLink Method**: SDK processes the OneLink URL and extracts deep link data
- **JSON Method**: SDK automatically appends `isPush: "true"` parameter to indicate the deep link came from push
## Debugging & Testing
### Expected Debug Logs
**OneLink Method:**
```
UniversalLink/Deeplink found: https://yourapp.onelink.me/...
```
**JSON Legacy Method:**
```
Push Notification received af payload = {"c":"campaign_name", "is_retargeting":"true", "pid":"media_source"}
```
### Session Payload Examples
**OneLink Method** - Look for:
```json
{
"af_deeplink": "https://yourapp.onelink.me/...",
"meta": {
"payloadKey": [["af_push_link"]]
}
}
```
**JSON Legacy Method** - Look for:
```json
{
"af_deeplink": "{\"c\":\"campaign_name\",\"is_retargeting\":\"true\",\"pid\":\"media_source\",\"isPush\":\"true\"}"
}
```
## Troubleshooting
### Common Issues
**OneLink Method:**
- **Deep links not working**: Verify the key path in `addPushNotificationDeepLinkPath` matches your payload structure
- **OneLink not detected**: Ensure the OneLink contains required parameters (pid, is_retargeting=true, c)
- **Payload not processed**: Check that `addPushNotificationDeepLinkPath` is called before `initSdk`
**JSON Method:**
- **Re-engagement not recorded**: Verify the `af` object is at the top level of `data`, not nested
- **Missing parameters**: Ensure `pid`, `is_retargeting: "true"`, and `c` are all present
- **Wrong data types**: `is_retargeting` must be string "true", not boolean
**General Issues:**
- **Android crashes**: Verify app activity is available when calling `sendPushNotificationData`
- **Listeners not firing**: Ensure all listeners are set up before calling `initSdk` and `startSdk`
- **Duplicate processing**: SDK prevents duplicate processing of the same payload in the same cold launch
## Resources
- [AppsFlyer Push Notification Campaigns](https://support.appsflyer.com/hc/en-us/articles/207034486)
- [React Native SDK Documentation](https://dev.appsflyer.com/hc/docs/react-native-plugin)
- [Deep Link Integration Guide](https://dev.appsflyer.com/hc/docs/react-native-plugin#deep-linking)