AppsFlyer
入门指引
AppsFlyer 支持 AppsFlyer SDK 提供的以下 deep linking 功能:
-
Deep linking:目标应用已经安装时会发生 deep linking。已配置的 deep link 将用户发送到特定的应用内位置或完成特定的应用内活动。
-
Deferred deep linking:在目标应用程序未安装时发生 deferred deep linking。 已配置的 deep link 将用户发送到特定应用商店中目标应用的下载页面。当用户安装并打开应用程序时,deferred deep linking 将用户发送到应用程序内的目标位置或实'现目标应用内活动。
AppsFlyer OneLink 是 AppsFlyer 特有的跨平台归因链接,支持用户从不同平台(例如邮件,社媒平台,网页,QR码等)跳转到目标应用,并回传用户 ID。业务需确认回传的 ID 是 OpenID 或 device ID,并根据所得的用户 ID 用于最后数据分析时归因受邀用户的相关渠道。
步骤1:在 AppsFlyer 控制台上创建一个应用
根据 AppsFlyer 文档 添加应用程序 来创建您的应用程序。
步骤2:配置 OneLink
如果是 OneLink 管理的新手,请根据新客户使用指引配置 OneLink 模板。更多信息,请参见 OneLink 模板
-
在右上角,点击菜单图标后选择添加 OneLink 模板,并记录模板 ID。
-
在 OneLink 设置页面,输入模板名称,子域名,并选择之前创建的应用程序。
记录输入的子域名。
-
对于 Android 应用程序,在 When app is installed 部分,点击 Use App Links to launch the app 添加 keystore 的 SHA-256。更多信息,请参见 Android initial setup。

-
复制并保存 AppsFlyer 后台生成的
intent-filter代码。
-
保存 OneLink 模板。
步骤3:配置 Player Network SDK
iOS
- Unity
- Unreal Engine
-
在
INTLConfig.ini的[AppsFlyer]节点下添加以下代码,并将{OneLink_Template_ID}替换为 步骤2 记录的模板 ID。APPSFLYER_APP_INVITE_ONELINK_ID_IOS = {OneLink_Template_ID} -
在
Assets\INTLSDK\Editor\XUPorter\XCodePostProcess.cs中,将从步骤2中得到的子域名 (例如appslinks:subdomain.onelink.me) 添加到该行。
capManager.AddAssociatedDomains(new string[] { "appslinks:subdomain.onelink.me"});
Android
-
在
INTLConfig.ini的[AppsFlyer]节点下添加以下代码,并将{OneLink_Template_ID}替换为 步骤2 记录的模板 ID。APPSFLYER_APP_INVITE_ONELINK_ID_ANDROID = {OneLink_Template_ID} -
若
INTLConfig.ini中的[Android LifeCycle]不包含 AppsFlyer,则添加 AppsFlyer。LIFECYCLE = WeChat,QQ,Twitter,Adjust,Facebook,Google,Line,VK,Garena,Discord,Dmm,Update,Firebase,WhatsApp,Permission,GooglePGS,AppsFlyer -
在
AndroidManifest.xml的游戏主 Activity 节点下添加在 步骤2 中保存的 Androidintent-filter代码。
此代码用于打开游戏,请根据实际情况替换{Subdomain}和{OneLink_Template_ID}。<activity>
android:name="com.intlgame.unity.MainActivity"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="{Subdomain}.onelink.me"
android:pathPrefix="/{OneLink_Template_ID}"
android:scheme="https" />
</intent-filter>
</activity>
更多信息,请参见 OneLink 链接与用户体验。
步骤4:调用 OneLink 接口
- 设置生成 OneLink 的回调。
- Unity
- Unreal Engine
INTLAPI.AddExtendResultObserver(OnExtendEvent);//设置回调
INTLExtend.Invoke("AppsFlyer", "generateInviteLinkUrl", paramsJsonString);// paramsJsonString是需要传送给OneLink的信息
public void OnExtendEvent(INTLExtendResult extendResult)
{
if ("generateInviteLinkUrl".Equals(extendResult.ExtendMethodName))//生成 OneLink 的方法
{
if (extendResult.RetCode == 0)//OneLink 生成成功
{
string inviteUrl = extendResult.RetMsg;//生成的 OneLink,可以分享给其他玩家
//TODO:share link to other players
}
else//OneLink 生成失败
{
//TODO: handle OneLink Failed result
}
}
}
- 回调类继承
IINTLPluginObserver类 - 回调类根据需要实现
IINTLPluginObserver类的方法
FINTLExtendEvent extendEvent;
extendEvent.AddUObject(this, &UFriendWindow::OnExtendResult_Implementation);
UINTLSDKAPI::ExtendInvoke(EINTLLoginChannel::kChannelAppsFlyer,TEXT("generateInviteLinkUrl"), paramsJsonString);// paramsJsonString是需要传送给OneLink的信息
void UFriendWindow::OnExtendResult_Implementation(FINTLExtendResult ret) {
if (ret.ExtendMethodName.Equals(TEXT("generateInviteLinkUrl")))
{
if (ret.RetCode == 0)//OneLink生成成功
{
FString inviteURL = ret.RetMsg;//生成的OneLink,可以分享给其他玩家
//TODO:share link to other players
}
}
}
- 设置被分享链接的用户点击生成的 OneLink 后的结果回调。
- Unity
- Unreal Engine
生成 OneLink 和点击 OneLink 共用一个回调,通过回调中的 INTLExtendResult 的参数区分。
INTLAPI.AddExtendResultObserver(OnExtendEvent);//设置回调
public void OnExtendEvent(INTLExtendResult extendResult)
{
if ("OnOneLinkResult".Equals(extendResult.ExtendMethodName))//OneLink 点击回调
{
if (extendResult.RetCode == 0)//OneLink 点击回调成功
{
string jsonParameter = extendResult.ExtraJson;//点击 OneLink 后 AF 返回的参数
//TODO:Handle OneLink Parameter
}
else//OneLink 点击回调失败
{
//TODO: handle OneLink Failed result
}
}
}
FINTLExtendEvent extendEvent;
extendEvent.AddUObject(this, &UFriendWindow::OnExtendResult_Implementation);
void UFriendWindow::OnExtendResult_Implementation(FINTLExtendResult ret) {
if (ret.ExtendMethodName.Equals(TEXT("OnOneLinkResult")))//OneLink点击回调
{
if (ret.RetCode == 0)// OneLink 点击回调成功
{
FString jsonParameter = ret.ExtraJson;// 点击 OneLink 后AF返回的参数
//TODO:Handle OneLink Parameter
}
else// OneLink 点击回调失败
{
//TODO: handle OneLink Failed result
}
}
}
- 参考以下代码生成 OneLink,并根据实际情况替换代码中的参数。
- Unity
- Unreal Engine
StringBuilder sb = new StringBuilder();
sb.Append("{");
sb.Append("\"deep_link_value\":\"abc\"").Append(","); //<TARGET_VIEW>
sb.Append("\"deep_link_sub1\":\"1234\"").Append(",");//<PROMO_CODE>
sb.Append("\"deep_link_sub2\":\"1234\"").Append(",");//<REFERRER_ID(openid)>
sb.Append("\"channel\":\"mobile_share\"").Append(",");//Channel
sb.Append("\"campaign\":\"summer_sale\"");//Campaign
//其他参数,可选
sb.Append("\"deep_link_sub3\":\"1234\"").Append(",");
sb.Append("\"deep_link_sub4\":\"1234\"").Append(",");
sb.Append("\"deep_link_sub5\":\"1234\"").Append(",");
sb.Append("\"deep_link_sub6\":\"1234\"").Append(",");
sb.Append("\"deep_link_sub7\":\"1234\"").Append(",");
sb.Append("\"deep_link_sub8\":\"1234\"").Append(",");
sb.Append("\"af_sub4\":\"12324\"").Append(",");
sb.Append("\"af_sub5\":\"dfasdf\"").Append(",");
sb.Append("}");
String paramsJsonString = sb.ToString();
INTLExtend.Invoke("AppsFlyer", "generateInviteLinkUrl", paramsJsonString);
FString ParamsJsonString = TEXT("");
const TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&ParamsJsonString);
JsonWriter->WriteObjectStart();
JsonWriter->WriteValue(TEXT("deep_link_value"),TEXT("abc"));
JsonWriter->WriteValue(TEXT("deep_link_sub1"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("deep_link_sub2"),TEXT("1234"));
JsonWriter->WriteValue(TEXT(""),TEXT("1234"));
JsonWriter->WriteValue(TEXT(""),TEXT("1234"));
JsonWriter->WriteValue(TEXT("deep_link_sub3"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("deep_link_sub4"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("deep_link_sub5"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("deep_link_sub6"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("deep_link_sub7"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("deep_link_sub8"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("af_sub4"),TEXT("1234"));
JsonWriter->WriteValue(TEXT("af_sub5"),TEXT("dfasdf"));
JsonWriter->WriteObjectEnd();
JsonWriter->Close();
UINTLSDKAPI::ExtendInvoke(EINTLLoginChannel::kChannelAppsFlyer,TEXT("generateInviteLinkUrl"),
集成测试
-
进入 AppsFlyer 控制台。
-
在左侧边栏中,单击 SDK Integration Tests。
-
选择要测试的应用程序,点击 Run test。

-
在 Run non-organic install test 页面,选择测试设备并选择 Other。
-
扫描二维码并安装应用。

若要再次测试激活,请删除该应用程序并重新启动测试。
参考文档
AppsFlyer 深度链接和 OneLink:Deep linking
| iOS | Android |
|---|---|
| 初始设置 | 初始设置 |
| 统一 deep linking | 统一 deep linking |
| 旧版本 API | 旧版本 API |
| 使用 iOS 私人中继的延迟 deep link | 使用 Android 私人中继的延迟 deep link |
| 用户邀请属性 | 用户邀请属性 |