广告监测模块为火山引擎增长分析产品增值功能项,需额外付费购买资源包,若有疑问请咨询您的客户经理。
前置条件:
注:之前的最新文档版本为6.5.0,也可以使用,6.6.2之后去掉了再营销活动才可以触发延迟唤醒的限制
这里,我们首先需要按照之前的配置的ALink链接对应配到App内部,然后做SDK初始化集成
URI Scheme技术适用于所有平台(Android和iOS)。在web中这个唯一标识就是URI(Uniform Resource Identifier),URI既可以看成是资源地址,也可以看成是资源的名称,在App中我们使用URI Scheme来像定位一个网页一样,定位一个应用甚至App中的某一个页面
获取链接
,获取之前配置的URI Scheme,如下所示:AndroidManifest.xml
中对<activity />
标签增加<intent-filter />
设置Scheme,配置示例如下:<activity android:name=".CaseActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="yourhost" android:path="/path" android:port="8088" android:scheme="${填写你的URI Scheme}" /> </intent-filter> </activity>
上边配置文件中配置了两组,第一组是作为应用的默认启动Activity配置,第二组是通过URL Scheme方式启动,其本身也是隐式启动的一种,不同在于添加了属性,定义了其接受URL Scheme协议格式为scheme://yourhost:port/path
注:上述的Activity可以按照接入方自己的实际情况来配置,一般来说,将其配置在主页的activity上,然后通过ALink回调带回来的参数进行自定义页面路由,下面会详细介绍
根据App Links的官方定义,简单来说,App Links是一种特殊的DeepLink(与URL Scheme调起App的实现方式不同),它可以让你的应用和你的网站URL进行绑定,这样当你在点击你网站链接的时候(非浏览器中)就能调起你的App,而不是出现选择界面, 也不会出现类似URL Scheme的重复问题
在浏览器中输入https://{domain}/.well-known/assetlinks.json
, 查看是否能正常下载assetlinks.json文件
其中,domain是ALink的域名,如:jd.volctracer.com
assetlinks.json文件示例如下:
[ { "relation": [ "delegate_permission/common.handle_all_urls" ], "target": { "namespace": "android_app", "package_name": "{package name}", "sha256_cert_fingerprints": [ "{your sha256_cert_fingerprints}" ] } } ]
<activity android:name=".CaseActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <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="${你的ALink域名}" android:pathPrefix="/a" android:scheme="https" /> </intent-filter> </activity>
这里也可以同时支持URL Scheme和Apps Links,也就是多host绑定
<activity android:name=".CaseActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <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="${你的ALink域名}" android:pathPrefix="/a" android:scheme="https" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="${你的URI Scheme}" /> </intent-filter> </activity>
上面,我们App的深度链接已经配置完成,这里,我们需要初始化集成ALink相关的方法,目的:
初始化时,通过实现IALinkListener来获取深度链接唤起后的ALink相关数据,代码如下:
AppLog.setALinkListener(new IALinkListener() { @Override public void onALinkData(@Nullable Map<String, String> map, @Nullable Exception e) { JSONObject obj = new JSONObject(map); Intent intent = new Intent(context, TracerActivity.class); intent.putExtra("deeplink", obj.toString()); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }); // 最后初始化结束 AppLog.init(context, config); // 初始化Applog SDK
onALinkData入参map具体数据内容参考下面的章节:onALinkData接口返回数据
在配置App Links或者URI Scheme的Activity中触发深度链接(一般在首页activity即可),示例代码如下:
//配置App Links或者URI Scheme的Activity public class CaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 触发深度链接 Uri appLinkData = getIntent().getData(); AppLog.activateALink(appLinkData); } }
在SDK初始化时,启用延迟深度链接,config.enableDeferredALink();
初始化时,通过在IALinkListener中增加onAttributionData方法来获取每一次安装用户的归因数据。通过这个方式,你可以为安装用户提供个性化的内容,或者将他们带到App内的指定activity页面
增加后的代码如下所示:
AppLog.setALinkListener(new IALinkListener() { @Override public void onALinkData(@Nullable Map<String, String> map, @Nullable Exception e) { JSONObject obj = new JSONObject(map); Intent intent = new Intent(context, TracerActivity.class); intent.putExtra("deeplink", obj.toString()); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } @Override public void onAttributionData(@Nullable Map<String, String> map, @Nullable Exception e) { JSONObject obj = new JSONObject(map); Intent intent = new Intent(context, TracerActivity.class); intent.putExtra("attribution", obj.toString()); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } });
如果需要配合H5开启剪切板,则在初始化的时候开启即可,代码:AppLog.setClipboardEnabled(true);
注:只有在app安装并第一次打开时才会读取剪切板
前置条件:
URI Scheme是一个可以让App相互之间可以跳转的协议,适用于所有平台(Android和iOS)。开发者首先注册应用的URI Scheme。当用户点击该Scheme的URI时,系统会打开相应应用并回调
OpenURL
方法。在该方法中,开发者可根据URI的参数做相应的页面路由。注意,需要避免设置的URL Scheme与别的APP以及的URI Scheme冲突。
#import <RangersAppLog/BDAutoTrackSchemeHandler.h> - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { for (UIOpenURLContext *context in URLContexts) { NSURL *URL = context.URL; if ([[BDAutoTrackSchemeHandler sharedHandler] handleURL:URL appID:@"appid" scene:scene]) { continue; } /// …… } }
import RangersAppLog func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { if(BDAutoTrackSchemeHandler.shared().handle(url, appID: "appid", scene: nil)) { return true } return false }
#import <RangersAppLog/BDAutoTrackSchemeHandler.h> - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { if ([[BDAutoTrackSchemeHandler sharedHandler] handleURL:url appID:@"appid" scene:nil]) { return YES; } // 把ALink url传给SDK if ([BDAutoTrack continueALinkActivityWithURL:url]) { return YES; } /// …… return NO; }
Universal Link(通用链接)可以允许iOS 9+的用户通过点击Universal Link无缝重定向到另一个App
在浏览器中输入https://{domain}/.well-known/apple-app-site-association
, 查看是否能正常下载assetlinks.json文件
其中,domain是ALink的域名,如:jd.volctracer.com
apple-app-site-association文件示例如下:
{ "applinks":{ "apps":[ ], "details":[ { "appID":"${Team ID}.${Bundle ID}", "paths":[ "/a/*" ] } ] } }
进入您的xcode项目中,在Capablities
中开启Associated domains
,在Domains
中填写applinks:``yourapp.volctracer.com
,yourapp
(子域)必须和【ALink模板】中【子域】填写的内容一致;
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { // 把ALink url传给SDK if ([BDAutoTrack continueALinkActivityWithURL:userActivity.webpageURL]) { return YES; } return NO; } return YES; }
上面,我们App的深度链接已经配置完成,这里,我们需要初始化集成ALink相关的方法,目的:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /* 6.x 版本 初始化开始 */ BDAutoTrackConfig*config = [BDAutoTrackConfig configWithAppID:@"appid" launchOptions:launchOptions]; //您申请APPID,如不清楚请联系专属客户成功经理 /* 5.x 版本 初始化开始 BDAutoTrackConfig*config =[BDAutoTrackConfig configWithAppID:@"appid"]; //您申请APPID,如不清楚请联系专属客户成功经理*/ config.serviceVendor = BDAutoTrackServiceVendorCN; //数据上报 config.appName = @"your appName"; // 与您申请APPID时的app_name一致 config.channel = @"App Store"; // iOS一般默认App Store config.abEnable = YES; //开启ab测试,默认为YES config.showDebugLog = NO; // 是否在控制台输出日志,仅调试使用,需要同时设置logger。release版本请设置为 NO //config.logger = ^(NSString * _Nullable log) {NSLog(@"%@",log);}; //如果 showDebugLog设置为 YES 请打开这里的注释 config.logNeedEncrypt = YES; // 是否加密日志,默认加密。release版本请设置为 YES config.autoTrackEnabled = YES; //是否开启全埋点采集用于圈选功能 [BDAutoTrack startTrackWithConfig:config]; /* 初始化结束 */ // 注册接收ALink路由信息的代理, 在这里以AppDelegate对象举例。代理对象需要实现BDAutoTrackALinkRouting协议 [BDAutoTrack setALinkRoutingDelegate:self]; return YES }
// see BDAutoTrackALinkRouting.h /// Deep link callback 根据回调返回的路由信息路由页面 /// 发生于应用已安装情况下,用户点击ALink时 /// @param routingInfo 路由信息 - (void)onALinkData:(nullable NSDictionary *)routingInfo error:(nullable NSError *)error { if (!error && routingInfo) { // 路由或打印日志 } }
onALinkData入参routingInfo具体数据内容参考下面的章节:onALinkData接口返回数据
在iOS650版本及之前默认是启用的,为了对齐Android,在iOS660版本之后需要配置开启,代码:config.enableDeferredALink = YES;
如果在iOS650及之前使用了ALink,在升级到新版本后一定要开启
在AppDelegate中通过实现onAttributionData 来获取每一次安装用户的归因数据,继而进行下一步行为,如:为安装的用户提供个性化的内容,或者将他们带到App内的指定页面
// see BDAutoTrackALinkRouting.h /// Deferred deep link callback 根据回调返回的路由信息路由页面 /// 发生于应用首启时(包括卸载重装) /// @param routingInfo 路由信息 - (void)onAttributionData:(nullable NSDictionary *)routingInfo error:(nullable NSError *)error { if (!error && routingInfo) { // 路由或打印日志 } }
onAttributionData入参routingInfo具体数据内容参考下面的章节:onAttributionData接口返回数据
如果需要配合H5开启剪切板,则实现BDAutoTrackAlinkRouting的shouldALinkSDKAccessPasteBoard方法,返回true即可开启剪切板读取(只有在App安装第一次打开的时候才会读取):
BDAutoTrackAlinkRouting @implementation AppDelegate ... - (bool)shouldALinkSDKAccessPasteBoard { return true; } @end
名称 | 必选? | 类型 | 说明 |
---|---|---|---|
name | Y | string | 链接名称,即推广活动名称 |
utm_campaign | Y | string | 推广活动ID,例如:TR_abcdefg |
utm_source | Y | string | 推广渠道ID,例如:toutiao/CH_abcdefg |
tr_shareuser | N | string | 分享用户 |
tr_admaster | N | string | 优化师 |
tr_param1 | N | string | 自定义参数1 |
tr_param2 | N | string | 自定义参数2 |
tr_param3 | N | string | 自定义参数3 |
tr_param4 | N | string | 自定义参数4 |
以下为再营销相关字段 | |||
is_retargeting | Y | boolean | 是否是再营销活动链接 |
reengagement_time | Y | int | 再互动生效时间 |
reengagement_window | Y | int | 再互动归因窗口期(秒级) |
tr_dp | N | string | URL Schema, 例如:jd:// |
deeplink_value | N | string | 用于填写深度链接的内容,主要用于给app开发者路由到具体的页面,例如:apple_fruit_page |
样例数据展示:
{ "name":"alink0001", "utm_campaign":"TR_Im9Qrbqo", "utm_source":"CH_KCViqxjI", "utm_medium":"", "utm_content":"", "utm_term":"", "tr_shareuser":"111", "tr_admaster":"222", "tr_param1":"333", "tr_param2":"444", "tr_param3":"555", "tr_param4":"666", "tr_dp":"tracer:\/\/?tr_token=Im9Qrbqo", "is_retargeting":"true", "reengagement_window": "950400", "reengagement_time": "1624952216", "deeplink_value":"product_89003" }
名称 | 必选? | 类型 | 说明 |
---|---|---|---|
name | Y | string | 链接名称,即推广活动名称 |
utm_campaign | Y | string | 推广活动ID,例如:TR_abcdefg |
utm_source | Y | string | 推广渠道ID,例如:toutiao/CH_abcdefg |
tr_shareuser | N | string | 分享用户 |
tr_admaster | N | string | 优化师 |
tr_param1 | N | string | 自定义参数1 |
tr_param2 | N | string | 自定义参数2 |
tr_param3 | N | string | 自定义参数3 |
tr_param4 | N | string | 自定义参数4 |
以下为再营销相关字段 | |||
is_retargeting | N | boolean | 是否是再营销活动链接 |
reengagement_window | N | int | 再互动归因窗口期 |
tr_dp | N | string | URL Schema, 例如:jd:// |
deeplink_value | N | string | 填写的深度链接的内容,主要用于给app开发者路由到具体的页面,例如:apple_fruit_page |
以下为合作渠道广告媒体字段 | |||
tr_site_id | N | string | 合作渠道二级渠道ID |
tr_site_name | N | string | 合作渠道二级渠道名称,如:穿山甲/抖音 |
account_id | N | string | 广告账户ID |
account_name | N | string | 广告账户名称 |
campaign_id | N | string | 广告组ID |
campaign_name | N | string | 广告组名称 |
ad_id | N | string | 广告计划ID |
ad_name | N | string | 广告计划名称 |
creative_id | N | string | 广告创意ID |
creative_name | N | string | 广告创意名称 |
以下为其他归因字段 | |||
activation_type | Y | string | 激活类型,枚举值为:promotion/organic |
tr_install_type | Y | string | 应用安装类型 |
touch_type | Y | string | 归因促达类型:click/impression |
touch_timestamp | Y | string | 归因促达时间戳,秒 |
activation_timestamp | Y | string | 激活时间戳,秒 |
is_first_launch | Y | boolean | 标识是否用户安装app后首次打开,主要给延迟链接使用 |
样例数据展示:
{ "name":"alink0001", "utm_campaign":"TR_Im9Qrbqo", "utm_source":"CH_KCViqxjI", "utm_medium":"", "utm_content":"", "utm_term":"", "tr_shareuser":"111", "tr_admaster":"222", "tr_param1":"333", "tr_param2":"444", "tr_param3":"555", "tr_param4":"666", "is_retargeting":"true", "reengagement_window":"950400", "tr_dp":"tracer://?tr_token=Im9Qrbqo", "deeplink_value":"product_89003", "tr_site_id":"", "tr_site_name":"", "account_id":"", "account_name":"", "campaign_id":"", "campaign_name":"", "ad_id":"", "ad_name":"", "creative_id":"", "creative_name":"", "tr_install_type":"reattribution", "touch_type":"click", "touch_timestamp":"1624951854", "activation_type":"promotion", "activation_timestamp": "1624952064", "is_first_launch": "true" }