中国安卓应用市场归因方案指南

AppsFlyer不仅可以对没有GAID / Google Play服务的Android设备进行归因,还可以通过归因数据,帮助广告主检测设备制造商造成的应用商店劫持现象。 

在中国,应用所有者均面临着一些挑战:

  • Google Play服务(GPS)在大多数Android设备上无效,这意味着设备没有GAID。
  • Google市场外商店(下文统称“国内第三方应用商店”)的使用为设备制造商进行商店劫持创造了机会。
  • 服务器响应缓慢
  • 需要同时管理并查看来自Google Play商店和国内第三方应用商店的归因数据。

使用AppsFlyer,可以通过以下方式克服这些挑战: 

  • 实施基于设备IMEI的归因,作为GAID的替代方案。
  • 在APK内设定国内第三方应用商店唯一标识符(AF_STORE),以识别Android商店劫持现象。
  • 配置为中国市场专门制定的归因链接(即点击监测链接)。

SDK集成和App添加方案

请按照下述方法操作,集成AppsFlyer SDK并准备APK。 

在应用程序中集成SDK

使用IMEI代替GAID

通常,中国市场的Android设备上没有Google Play服务 。这意味着设备没有GAID。因此,AppsFlyer使用设备IMEI作为用户唯一标识符进行归因记录。

请注意:除非另有配置,否则AppsFlyer SDK会阻止访问收集IMEI。因为在海外市场,如果设备上存在Google Play服务,是不需要收集IMEI的。而在中国市场,设备上通常没有Google Play服务,需要收集IMEI。

在应用中集成AppsFlyer SDK时,需要向AppsFlyer上报IMEI。(注意:一旦强制向AppsFlyer上报IMEI,即使在设备上存在Google Play服务,但客户端依然会持续上报IMEI) 关于安卓Q限制获取IMEI的问题,请联系您的客户经理了解应对方案

启用IMEI访问

  1. 需要AppsFlyer Android SDK 4.8.18或更高版本
  2. 选择以下方法之一。这些方法取决于您应用中使用的Android API级别。

Android API级别22或以下版本

请使用以下代码示例集成SDK。


 public class AFApplication extends Application {
    private static final String AF_DEV_KEY = "";
    private static AFApplication instance;
    @Override
    public void onCreate() {
      //If you want to show debug log.
     AppsFlyerLib.getInstance().setDebugLog(true);
 //Use the two APIs below let AppsFlyer SDK collect IMEI & android id no matter the 
      //Google Play Service is exist or not.
 AppsFlyerLib.getInstance().setCollectIMEI(true);
 AppsFlyerLib.getInstance().setCollectAndroidID(true);  
 final AppsFlyerConversionListener conversionDataListener = new AppsFlyerConversionListener() {
          @Override
          public void onInstallConversionDataLoaded(Map<string, string=""> map) {} 
    	  @Override
          public void onInstallConversionFailure(String error) {}    
    	  @Override
          public void onAppOpenAttribution(Map<string, string=""> map) {}
          @Override
          public void onAttributionFailure(String s) {}
  	};
      AppsFlyerLib.getInstance().init(AF_DEV_KEY,conversionDataListener);
      AppsFlyerLib.getInstance().startTracking(context,AF_DEV_KEY);
  }
    @Override
    protected void attachBaseContext(Context base) {
        instance = this;
        super.attachBaseContext(base);
    }
    public static synchronized AFApplication getAppInstance() {
        return instance;
    }
}

Android API级别23或更高版本

请使用以下代码示例集成SDK。

注意: Android级别23或更高版本需要用户确认权限来访问收集IMEI。这有可能会导致在激活StartTracking API之后才开始收集IMEI。

            
Public class AFApplication extends Application {
   private static final String AF_DEV_KEY = "";
   private static AFApplication instance;
   @Override
   public void onCreate() {
      //If you want to show debug log.
   AppsFlyerLib.getInstance().setDebugLog(true);
 //Or use the two APIs below let AppsFlyer SDK collect IMEI & android id
      //no matter if the Google Play Service exists or not.
 AppsFlyerLib.getInstance().setCollectIMEI(true);
 AppsFlyerLib.getInstance().setCollectAndroidID(true);
   //Configure the min time between two sessions, the recommendation is 2 seconds。
      AppsFlyerLib.getInstance().setMinTimeBetweenSessions(2);
 final AppsFlyerConversionListener conversionDataListener = new 
AppsFlyerConversionListener() {
       @Override
       public void onInstallConversionDataLoaded(Map<string, string=""> map) {}
       @Override
       public void onInstallConversionFailure(String error) {}
       @Override
       public void onAppOpenAttribution(Map<string, string=""> map) {}
       @Override
       public void onAttributionFailure(String s) {}
     }
     AppsFlyerLib.getInstance().init(AF_DEV_KEY,conversionDataListener);
     AppsFlyerLib.getInstance().startTracking(context,AF_DEV_KEY);
   }  
   @Override
     protected void attachBaseContext(Context base) {
        instance = this;
        super.attachBaseContext(base);
    }
  public static synchronized AFApplication getAppInstance() {
        return instance;
    }
}

在应用程序首次启动时,将在MainActivity的onResume()调用后向用户发送READ_PHONE_STATE的权限请求。

app模块中的build.gradle

allprojects {
    repositories {
       ....
       maven { url 'https://jitpack.io'}
    }
}
dependencies {
    implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
}
MainActivity
public class MainActivity extends AppCompactActivity {
    @Override
    protected void onResume() {
        super.onResume();
     final RxPermissions rxPermissions = new RxPermissions(this);
         if(RxPreference.Instance().getBoolean(RxPreference.KEY_PERMISSION_DIALOG_HAS_SHOW, false){
          return;
         }
         if(rxPermissions.isGranted(Manifest.permission.READ_PHONE_STATE)) {
            return;
         }
          RxPreference.Instance().putBoolean(RxPreference.KEY_PERMISSION_DIALOG_HAS_SHOW, true);
        rxPermissions.request(Manifest.permission.READ_PHONE_STATE)
                .subscribe(granted-> {
                    if (granted) {
                        AppsFlyerLib.getInstance().setCollectIMEI(true);
                        AppsFlyerLib.getInstance().setCollectAndroidID(true);
                        //NOTE: Here the report session API is reportTrackSession() not the startTracking()
                        AppsFlyerLib.getInstance().reportTrackSession(AFApplication.getAppInstance());
                    } else {
                    }
                });
    }
}

如何在AppsFlyer面板查看归因数据

查看归因数据的三种方案:

  • (最佳实践) 单一应用: 所有国内第三方应用商店的数据在AppsFlyer的后台显示在单个应用程序下。这意味着营销人员可以在AppsFlyer的一个应用程序下查看所有中国国内第三方应用商店的归因数据。要使用该方法请参考在AppsFlyer中添加应用程序章节所述内容。
  • 单一应用(包含Google Play商店): 将来自国内第三方应用商店和Google Play商店的归因数据显示在同一个应用程序下。此方法要求Google Play商店和国内第三方应用商店的包名称相同。假设应用程序已在AppsFlyer中添加,可使用此方法。要使用该方法继续至准备APK /manifest下面的部分。
  • 跨应用 不同应用商店的归因数据在AppsFlyer后台显示在不同的应用面板下。例如,以下第三方应用商店归因数据均单独显示在不同app面板下,Google Play商店,国内第三方应用商店A,国内第三方应用商店B等。要使用此方法,请参阅跨应用

在AppsFlyer中添加应用程序

(1)使用Pending App,暨待批准或尚未发布 选项创建应用程序,在使用此方案之前可咨询您的客户经理。 (2)使用常规安卓商店外APK追踪(out of store)方式添加应用,请注意用这种方式添加,除了在面板操作,还需要客户端配置相对应的channel名称。具体步骤如下。

  1. 在AppFlyer中,单击 我的应用程序
  2. 单击 添加App
    添加应用窗口打开。
  3. 选择 安卓商店外APK追踪
  4. 填写以下字段:
    • Android包名 :示例com.appsflyer
    • Channel名称必须与manifest中配置的channel名称完全一致,大小写敏感。参考下一部分所述。最佳做法是可将此字段设置为 cn ,配置channel后,物理包名不改变,但af后台显示的包名会添加channel后缀,示例com.appsflyer-cn.
    • App URL 

注意 :App URL指APK下载地址或第三方商店产品页地址。添加app后如需修改跳转地址,可通过在链接中添加“&af_r”重定向参数修改。

准备APK /manifest

为每个国内第三方应用商店准备单独的APK /manifest,如下所示:

  1. 将以下内容添加到manifest中以识别来自中国的流量:
    < meta-data android:name="CHANNEL" android:value="cn">
    注意: 参数区分大小写。我们建议您将渠道名称设置为 cn 。若使用Pending App的方法,不需要操作此步骤。
  2. 选择以下方法之一来识别商店名称(AF_STORE):
    • Manifest方法: 将下行代码添加到AndoridManifest.xml文件中。AF_STORE值对于每个商店都必须是唯一的。
      <meta-data android:name="AF_STORE" android:value="example_store"/>
      --或者--
    • API方法: 每个国内第三方应用商店分别准备一个单独的APK。调用setOutOfStore API以设置AF_STORE值。为每个商店设置唯一AF_STORE值。(注意:如果您使用的国内第三方应用商店较多,建议使用此方法)
      AppsFlyerLib.getInstance().setOutOfStore("example_store")

上述方法中设置参数AF_STORE,以此识别国内第三方应用商店名称。此参数的值显示在AppsFlyer原始数据报告内 install_app_store 字段中。您可以通过下载Pull API,和Data Locker 获取原始数据。原始数据报告是AppsFlyer的高级功能。

 

其他注意事项

不支持归因链接的国内第三方应用商店解决方案

在中国,很多国内第三方应用商店也有自有流量,这意味着它们同样是一个广告平台。而国内部分第三方应用商店(或部分广告位),不支持使用归因链接进行归因记录。针对这种问题,请参考以下两种解决方案:

  • install_app_store字段:(推荐)在没有归因链接的情况下进行安装时,AppsFlyer会将安装归因于自然安装。通过使用 install_app_store 字段,您可以识别实际的安装源,即带来安装的国内第三方应用商店。注意:install_app_store字段值是通过上节中描述的AF_STORE参数设置的。
  • 使用“假”预装的方式 。使用Manifest中设置的预装渠道号。这种方案的缺点是,一旦含有预装的APK包泄露到市场,归因信息有可能会不准确(只要有新用户激活此APK,则用户会被归因为此渠道下的非自然安装)。使用此方法时,请确保您拥有适当的商业条款来保护您的APK。

中国国内归因链接

在准备归因链接时,请您考虑以下因素:

中国市场专门制定的归因链接

对于包含国内(中国)流量的媒体来源,请使用此处详述的域链接。这些链接是为中国市场专门制定的,可以提供卓越的用户体验。

即带有中国国旗标识的归因链接: https://app.aflink.com (aflink.com)

对于OneLink归因链接,请使用带有中国国旗标识的归因链接:https://go.onelnk.com(onelnk.com)注意:在使用onelnk.com域名之前,请联系您的AppsFlyer客户经理。

请注意,在微信中,只有 onelnk.com 被列入白名单,可以完成跳转,而 onelink.me 被阻止

使用af_r

使用 af_r 确保用户被重定向到APK下载的URL或者国内第三方应用商店,而不是重定向到Google Play商店。

注意:通常,中国国内对接的媒体渠道在默认的归因链接模板中已设置 & redirect = false 的参数。这意味着重定向跳转将由广告平台完成,而不是由AppsFlyer完成。

有关集成媒体资源的更多信息,请参考
中国的Android应用推广

识别商店劫持

在使用国内安卓的生态里,通常的情况是:用户首先从媒体渠道规定跳转的第三方应用商店或APK包直接下载安装应用程序。如果存在安装劫持的情况,设备会弹出警告窗口,建议用户直接从设备(手机)制造商的应用程序商店,安装/更新应用程序。一旦用户选择同意,用户会跳转至制造商的第三方应用商店并进行APK下载。这意味着设备制造商已经劫持了此次安装。

以下示例分别对正常转化路径和被劫持的转化路径进行说明描述:

正常转化路径

用户点击媒体渠道A的广告,然后立即下载应用或跳转到媒体渠道指定的国内第三方应用商店A下载APP。在AppsFlyer中,会记录到以下归因数据:

  • 媒体渠道 :媒体渠道A
  • Install app store :媒体渠道指定的国内第三方应用商店A

被劫持的转化路径

用户点击媒体渠道A的广告。在启动下载时,设备上会弹出一个警告窗口,提示用户从设备制造商的应用商店下载应用程序。如果用户同意,用户会跳转至制造商的第三方应用商店B下载APK。在AppsFlyer中,会记录到以下归因数据:

  • 媒体渠道 :媒体渠道A
  • Install app store :设备制造商的应用商店B

识别AppsFlyer中的劫持事件

要识别被劫持的安装,您可以对比媒体渠道和install-app-store(安装应用商店)字段。如果预期的安装应用商店与实际的安装应用商店不匹配,则表示安装劫持。

这篇文章有帮助吗?
0 人中有 0 人觉得有帮助