AppsFlyerで取得したアトリビューションデータをReproにセットする¶
警告
iOS14.5 以降、App Tracking Transparency(以降ATT)用の実装が必要です、詳細は こちら のドキュメントを参照して下さい。
また、iOS14.5 以降、ATTへの同意がない場合基本的にアトリビューションの取得が出来なくなります、詳細は こちら のドキュメントを参照して下さい。
カスタムリンクを利用した場合は引き続きアトリビューションを取得し、ユーザープロフィールやイベントプロパティにセットすることが出来ます。
以下のサンプルコードでセットしているアトリビューションのデータはサンプルであり、実際にアプリで取得可能なアトリビューションデータとは異なる場合があります。 Reproにすべてのアトリビューションデータをセットする必要はなく、サンプルコードを参考にキャンペーンや分析に利用するものをセットしてください。
ユーザープロフィールにセットする¶
AppsFlyerのアトリビューションデータを ユーザープロフィール としてセットできます。
セットしたアトリビューションデータを利用して 広告連動メッセージ のようにアトリビューションの内容に合わせてユーザー体験を最適化することが出来ます。
iOS: onConversionDataSuccess メソッドを実装し 、取得したデータをユーザープロフィールとしてセットしてください。
Android: onConversionDataSuccess メソッドを実装し 、取得したデータをユーザープロフィールとしてセットしてください。
// AppDelegate.h
#import <UIKit/UIKit.h>
#import <AppsFlyerLib/AppsFlyerLib.h>
#import <AppTrackingTransparency/ATTrackingManager.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerLibDelegate> {
...
}
@end
// AppDelegate.m
#import "AppDelegate.h"
#import <AppsFlyerLib/AppsFlyerLib.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// init AppsFlyer
NSString* appsFlyerDevKey = [properties objectForKey:@"appsFlyerDevKey"];
NSString* appleAppID = [properties objectForKey:@"appleAppID"];
[[AppsFlyerLib shared] setAppsFlyerDevKey:appsFlyerDevKey];
[[AppsFlyerLib shared] setAppleAppID:appleAppID];
[AppsFlyerLib shared].delegate = self;
[[AppsFlyerLib shared] start];
// setup Repro
[Repro setup:"YOUR_APP_TOKEN"];
}
- (void)onConversionDataSuccess:(NSDictionary*)installData {
id status = [installData objectForKey:@"af_status"];
if ([status isEqualToString:@"Non-organic"]) {
id mediaSource = [installData objectForKey:@"media_source"];
id campaign = [installData objectForKey:@"campaign"];
[Repro setStringUserProfile:mediaSource forKey:@"AppsFlyer: media_source"];
[Repro setStringUserProfile:campaign forKey:@"AppsFlyer: campaign"];
NSLog(@"This is a none organic install. Media source: %@ Campaign: %@", sourceID, campaign);
} else if ([status isEqualToString:@"Organic"]) {
NSLog(@"This is an organic install.");
}
}
- (void)onConversionDataFail:(NSError *)error {
NSLog(@"%@",error);
}
func applicationDidBecomeActive(_ application: UIApplication) {
// init AppsFlyer
AppsFlyerLib.shared().appsFlyerDevKey = "MY_DEV_KEY"
AppsFlyerLib.shared().appleAppID = "id123456789"
// load the conversion data
AppsFlyerLib.shared().delegate = self
// track launch
AppsFlyerLib.shared().start()
}
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
guard let status = installData["af_status"] as? String else {
return
}
if(status == "Non-organic") {
if let media_source = installData["media_source"] , let campaign = installData["campaign"] {
Repro.setUserProfile(stringValue: media_source, forKey: "AppsFlyer: media_source")
Repro.setUserProfile(stringValue: campaign, forKey: "AppsFlyer: campaign")
print("This is a Non-Organic install. Media source: \(media_source) Campaign: \(campaign) ")
}
} else {
print("This is an organic install.")
}
}
func onConversionDataFail(_ error: Error!) {
if let err = error{
print(err)
}
func onAppOpenAttribution(_ attributionData: [AnyHashable : Any]!) {
if let data = attributionData{
print("\(data)")
}
}
func onAppOpenAttributionFailure(_ error: Error!) {
if let err = error{
print(err)
}
}
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
String attrValue = conversionData.get(attrName);
Log.d(AppsFlyerLib.LOG_TAG, "attribute: " + attrName + " = " + attrValue);
if (attrName.equals("media_source")) {
Repro.setStringUserProfile("AppsFlyer: media_source", attrValue);
}
else if (attrName.equals("campaign")) {
Repro.setStringUserProfile("AppsFlyer: campaign", attrValue);
}
}
}
@Override
public void onConversionFail(String errorMessage) {
Log.d(AppsFlyerLib.LOG_TAG, "error getting conversion data: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData) {
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d(AppsFlyerLib.LOG_TAG, "error onAttributionFailure : " + errorMessage);
}
});
警告
- このコールバックはアプリのインストール時のみ呼ばれます。
- AppsFlyerの初期化より先に、Reproのsetupを実行してください。
イベントプロパティにセットする¶
AppsFlyerのアトリビューションデータを イベントトラッキング のカスタムイベントのプロパティとしてセットできます。
セットしたアトリビューションデータを利用して 広告連動メッセージ のようにアトリビューションの内容に合わせてユーザー体験を最適化することが出来ます。
iOS: onConversionDataSuccess メソッドを実装し 、取得したデータを イベントトラッキング のカスタムイベントのプロパティとしてセットしてください。
Android: onConversionDataSuccess メソッドを実装し 、取得したデータを イベントトラッキング のカスタムイベントのプロパティとしてセットしてください。
// AppDelegate.h
#import "AppsFlyerTracker.h"
@interface AppDelegate : UIResponder<UIApplicationDelegate, AppsFlyerTrackerDelegate> {
...
}
// AppDelegate.m
- (void)applicationDidBecomeActive:(UIApplication *)application {
// setup Repro
[Repro setup:"YOUR_APP_TOKEN"];
// init AppsFlyer
[[AppsFlyerLib shared] setAppsFlyerDevKey:@"MY_DEV_KEY"];
[[AppsFlyerLib shared] setAppleAppID:@"id123456789"];
// load the conversion data
[AppsFlyerLib shared].delegate = self;
// track launch
[[AppsFlyerLib shared] start];
}
- (void)onConversionDataSuccess:(NSDictionary*)installData {
id status = [installData objectForKey:@"af_status"];
if ([status isEqualToString:@"Non-organic"]) {
id mediaSource = [installData objectForKey:@"media_source"];
id campaign = [installData objectForKey:@"campaign"];
id adset = [installData objectForKey:@"af_adset"];
id ad = [installData objectForKey:@"af_ad"];
[Repro track:@"AppsFlyerAttribution" properties:@{
@"mediaSource": mediaSource,
@"campaign": campaign,
@"adset": adset,
@"ad": ad,
}];
NSLog(@"This is a none organic install. Media source: %@ Campaign: %@", sourceID, campaign);
} else if ([status isEqualToString:@"Organic"]) {
NSLog(@"This is an organic install.");
}
}
- (void)onConversionDataFail:(NSError *)error {
NSLog(@"%@",error);
}
func applicationDidBecomeActive(_ application: UIApplication) {
// init AppsFlyer
AppsFlyerLib.shared().appsFlyerDevKey = "MY_DEV_KEY"
AppsFlyerLib.shared().appleAppID = "id123456789"
// load the conversion data
AppsFlyerLib.shared().delegate = self
// track launch
AppsFlyerLib.shared().start()
}
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
guard let status = installData["af_status"] as? String else {
return
}
if(status == "Non-organic") {
if let mediaSource = installData["media_source"], let campaign = installData["campaign"], let adset = installData["af_adset"], let ad = installData["af_ad"] {
Repro.track(
event: "AppsFlyerAttribution",
properties: [
"mediaSource": mediaSource,
"campaign": campaign,
"adset": adset,
"ad": ad
])
}
} else {
print("This is an organic install.")
}
}
func onConversionDataFail(_ error: Error!) {
if let err = error{
print(err)
}
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, Object> conversionData) {
final Object afStatus = conversionData.get("af_status");
if (afStatus instanceof String && afStatus.equals("Non-organic")) {
Map<String, Object> map = new HashMap<String, Object>();
for (String attrName : conversionData.keySet()) {
Object attrValue = conversionData.get(attrName);
Log.d(AF_TAG, "attribute: " + attrName + " = " + attrValue);
if (attrName.equals("network")) {
map.put("network", attrValue);
}
else if (attrName.equals("campaign")) {
map.put("campaign", attrValue);
}
else if (attrName.equals("af_adset")) {
map.put("adset", attrValue);
}
else if (attrName.equals("af_ad")) {
map.put("ad", attrValue);
}
}
Repro.track("AppsFlyerAttribution", map);
}
}
@Override
public void onConversionFail(String errorMessage) {
Log.d(AppsFlyerLib.LOG_TAG, "error getting conversion data: " + errorMessage);
}
});
警告
- このコールバックはアプリのインストール時のみ呼ばれます。
- AppsFlyerの初期化より先に、Reproのsetupを実行してください。