- 版本:1.0.17
- GitHub:
- NPM: https://npmjs.net.cn/package/%40global66%2Fnativescript-appsflyer
- 下载
- 昨天:6
- 上周:7
- 上个月:38
@global66/nativescript-appsflyer
Nativescript Library for AppsFlyer SDK
目录
- 支持的平台
- 安装
- API 方法
- initSdk
- logEvent
- deepLink
- 设置 iOS 14 插件
- setSharingFilter
- setSharingFilterForAllPartners
本插件是为以下构建的
- 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. 延迟深度链接(获取转换数据)
在以下回调中处理延迟深度链接
var options = {
onConversionDataSuccess: function(_res) {
console.log("Get conversion data success: " + JSON.stringify(_res));
},
}
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))
},
};
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>
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方案
-
创建自定义应用程序代理
-
添加以下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;
}
};
通用链接
-
创建自定义应用程序代理
-
添加以下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)。要实现这一点,需要
-
获取您的SHA256指纹
a. 创建密钥库
b. 生成指纹
-
在您的仪表板上的AppsFlyer OneLink设置中配置OneLink子域并将链接到移动应用程序,然后将指纹添加到那里(AppsFlyer负责托管'apple-app-site-association'文件)
-
配置移动应用程序以注册批准的域名
<?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 插件
- 添加自定义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");
}
};
- 在app.ts中添加
import { CustomAppDelegate } from "./custom-app-delegate";
if (Application.ios) {
Application.ios.delegate = CustomAppDelegate;
}
-
在Xcode中的.plist文件中添加
Privacy - Tracking Usage Description
-
可选:在
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));
});