@global66/nativescript-appsflyer
Nativescript Library for AppsFlyer SDK
npm i --save @global66/nativescript-appsflyer

@global66/nativescript-appsflyer

Nativescript Library for AppsFlyer SDK

npm version

目录

本插件是为以下构建的

  • iOS AppsFlyerSDK v6.8.0
  • Android AppsFlyerSDK v6.8.0

安装

$ tns plugin add @global66/nativescript-appsflyer

更新位于的规范仓库

$ pod repo update

API 方法


通过添加(原生 JavaScript)调用模块

var appsFlyer = require("@global66/nativescript-appsflyer");


appsFlyer.initSdk(options, callback): void

初始化 SDK。

参数 类型 描述
options Object SDK 配置

options

name 类型 默认 描述
devKey string Appsflyer 开发密钥
appId string Apple 应用 ID(仅限 iOS)
isDebug boolean false 调试模式(可选)
onConversionDataSuccess function AppsFlyer 允许您实时访问每个新安装的用户归因数据,直接从 SDK 层级。通过这样做,您可以向用户提供个性化内容或将他们发送到应用程序中的特定活动,这可以极大地增强他们对应用程序的参与度。对于 Android;对于 iOS
onConversionDataFailure function

示例

var options = {
devKey: 'WdpTVAcYwmxsaQ4WeTspmh',
appId: "975313579",
isDebug: true,
timeToWaitForATTUserAuthorization: 60,
onConversionDataSuccess: function(_res) {
console.log(JSON.stringify(_res));
},
onConversionDataFailure: function(_res) {
console.warn("failure: " + JSON.stringify(_res));
},
};

appsFlyer.initSdk(options).then(function(result) {
viewModel.set("initSdkResponse", result.status);
}, function(err) {
viewModel.set("initSdkResponse", JSON.stringify(err));
});

##### appsFlyer.logEvent(options): Promise<any>

  • 这些应用内事件可以帮助您衡量忠实用户如何发现您的应用,并将他们归因于特定的活动/媒体来源。请花时间定义您要衡量的事件,以便您能够衡量投资回报率(ROI)和生命周期价值(LTV)。
  • logEvent 方法允许您将应用内事件发送到 AppsFlyer 分析。此方法允许您通过直接添加到应用程序代码中来动态添加事件。
参数 类型 描述
options Object 记录事件配置

options

参数 类型 描述
eventName string 自定义事件名称,在您的仪表板中显示。请参阅事件列表 这里
eventValues Object 事件详细信息(请参阅下面的示例)

示例:(原生 JavaScript)

var options = {
eventName: "af_add_to_cart",
eventValues: {
"af_content_id": "id123",
"af_currency": "USD",
"af_revenue": "2"
}
};
appsFlyer.logEvent(options).then(function(result) {
viewModel.set("logEventResponse", result);
}, function(err) {
viewModel.set("logEventResponse", JSON.stringify(err));
});


深度链接

3 种深度链接类型

由于用户可能已安装或未安装移动应用程序,因此有两种深度链接类型

  1. 延迟深度链接 - 在安装后直接为新用户或前用户提供服务个性化内容。
  2. 直接深度链接 - 直接为已安装移动应用程序的现有用户提供服务个性化内容。
  3. 统一深度链接 - 统一深度链接在应用程序打开时立即将新用户和现有用户发送到特定的应用内活动。

有关更多信息,请参阅 OneLink™ 深度链接指南

1. 延迟深度链接(获取转换数据)

在以下回调中处理延迟深度链接

var options = {
onConversionDataSuccess: function(_res) {
console.log("Get conversion data success: " + JSON.stringify(_res));
},
}

请查看AppFlyer知识库中的延迟深度链接指南 这里

2. 直接深度链接

在'onAppOpenAttribution'回调中处理直接深度链接

var options = {
devKey: 'devKey',
appId: "appId",
isDebug: true,
onAppOpenAttribution: function(_res) {
console.log("onAppOpenAttribution: " + JSON.stringify(_res));
},
onAppOpenAttributionFailure: function(_res) {
console.log("onAppOpenAttributionFailure: " + JSON.stringify(_res));
},
};

当设备上的深度链接被点击时,AppsFlyer SDK将返回链接到 onAppOpenAttribution 方法。

3. 统一深度链接

在'onDeepLinking'回调中处理统一深度链接(如果定义了'onDeepLinking'回调,则不会调用'onAppOpenAttribution')

var options = {
devKey: 'devKey',
appId: "appId",
isDebug: true,
onDeepLinking: function(_res) {
console.log("onDeepLinking: " + JSON.parse(_res))
},
};

有关此API的更多信息,请查看 OneLink指南

Android深度链接设置

URI方案

在应用程序的清单中,将以下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="your unique scheme" />
</intent-filter>

注意:在Android中,AppsFlyer SDK在onResume()期间检查活动intent对象。因此,对于可能以任何非标准启动模式配置或启动的活动,以下代码被添加到MainActivity.java中,位于android/app/src/main/java/com...

Java

@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}

Kotlin

override fun onNewIntent(intent : Intent){
super.onNewIntent(intent)
setIntent(intent)
}

App Links

在应用程序的清单中,将以下intent-filter添加到相关活动

<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:scheme="your unique scheme" />
<data android:scheme="https"
android:host="yourcompany.onelink.me"
android:pathPrefix="your path prefix" />

</intent-filter>

有关App Links的更多信息,请查看这里的指南。

iOS深度链接设置

URI方案

  1. 创建自定义应用程序代理

  2. 添加以下iOS方法和AppsFlyer API

@NativeClass()
export class CustomAppDelegate extends UIResponder, ATTrackingManager implements UIApplicationDelegate {
public static ObjCProtocols = [UIApplicationDelegate];

applicationOpenURLOptions(application: UIApplication, urlOptions: NSURL, options: NSDictionary<string, any>): boolean {
console.log("applicationOpenURLOptions");
AppsFlyerLib.shared().handleOpenUrlOptions(urlOptions, options);
return true;
}

// Open URI-scheme for iOS 8 and below
applicationOpenURLSourceApplicationAnnotation(application: UIApplication, url: NSURL, sourceApplication: string, annotation: any): boolean {
console.log("applicationOpenURLSourceApplicationAnnotation");
AppsFlyerLib.shared().handleOpenURLSourceApplicationWithAnnotation(url, sourceApplication, annotation);
return true;
}
};

有关URI方案的更多信息,请查看这里的指南

通用链接

  1. 创建自定义应用程序代理

  2. 添加以下iOS方法和AppsFlyer API

@NativeClass()
export class CustomAppDelegate extends UIResponder, ATTrackingManager implements UIApplicationDelegate{
public static ObjCProtocols = [UIApplicationDelegate];

// Open Universal Links
applicationContinueUserActivityRestorationHandler?(application: UIApplication, userActivity: NSUserActivity, restorationHandler: (p1: NSArray<UIUserActivityRestoring>) => void): boolean{
console.log("applicationContinueUserActivityRestorationHandler");
AppsFlyerLib.shared().continueUserActivityRestorationHandler(userActivity, restorationHandler);
return true;
}
};

有关通用链接的更多信息:本质上,通用链接方法链接iOS移动应用程序和关联网站/域名之间,例如AppsFlyer的OneLink域名(xxx.onelink.me)。要实现这一点,需要

  1. 获取您的SHA256指纹

    a. 创建密钥库

    b. 生成指纹

  2. 在您的仪表板上的AppsFlyer OneLink设置中配置OneLink子域并将链接到移动应用程序,然后将指纹添加到那里(AppsFlyer负责托管'apple-app-site-association'文件)

  3. 配置移动应用程序以注册批准的域名

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:test.onelink.me</string>
</array>
</dict>
</plist>

有关通用链接的更多信息,请查看这里的指南。


设置 iOS 14 插件

  1. 添加自定义App Delegate并在其中添加ATT同意对话框以收集IDFA
@NativeClass()
export class CustomAppDelegate extends UIResponder, ATTrackingManager implements UIApplicationDelegate{
public static ObjCProtocols = [UIApplicationDelegate];

applicationDidFinishLaunchingWithOptions(application: UIApplication, launchOptions: NSDictionary): boolean {
if (parseFloat(UIDevice.currentDevice.systemVersion) >= 14) {
console.log("iOS 14");
ATTrackingManager.requestTrackingAuthorizationWithCompletionHandler((status) => {

});
}
console.log("applicationDidFinishLaunchingWithOptions");
}

};
  1. 在app.ts中添加
import { CustomAppDelegate } from "./custom-app-delegate";

if (Application.ios) {
Application.ios.delegate = CustomAppDelegate;
}
  1. 在Xcode中的.plist文件中添加Privacy - Tracking Usage Description

  2. 可选:在options中设置timeToWaitForATTUserAuthorization属性以延迟sdk初始化数x秒,直到用户接受同意对话框

var options = {
devKey: 'WdpTVAcYwmxsaQ4WeTspmh',
appId: "975313579",
isDebug: true,
timeToWaitForATTUserAuthorization: 60
};

有关更多信息,请访问我们针对iOS 14的完整支持指南

https://support.appsflyer.com/hc/zh-cn/articles/207032066#integration-33-configuring-app-tracking-transparency-att-support


##共享过滤器(GDPR/CCPA合规 - 在以下文章中阅读更多信息 这里

在某些情况下,广告商可能希望停止与特定用户共享与广告网络/合作伙伴的用户级数据。这样做的原因包括:隐私政策,如CCPA或GDPR用户退订机制与某些合作伙伴(广告网络、第三方)的竞争AppsFlyer提供了两个API方法来停止与某些或所有合作伙伴共享数据

##### appsFlyer.setSharingFilter(partners): Promise<any>

  • setSharingFilter:由广告商使用,用于设置一些(一个或多个)网络/集成合作伙伴,以排除从获取数据。
参数 类型 描述
partners 数组 排除(一个或多个)网络/集成合作伙伴以获取数据

示例:(原生 JavaScript)

var partners = [""];

appsFlyer.setSharingFilter(partners).then(function(result) {
viewModel.set("setSharingFilterResponse", result.status);
}, function(err) {
viewModel.set("setSharingFilter Response", JSON.stringify(err));
});

##### appsFlyer.setSharingFilterForAllPartners(): Promise<any>

  • setSharingFilterForAllPartners:由广告商使用,用于排除所有网络/集成合作伙伴以获取数据。

示例:(原生 JavaScript)

appsFlyer.setSharingFilterForAllPartners().then(function(result) {
viewModel.set("setSharingFilterForAllPartners", result.status);
}, function(err) {
viewModel.set("setSharingFilterForAllPartners Response", JSON.stringify(err));
});