请在 pubspec.yaml
文件的 dependencies
块中添加以下行:
dependencies:
# Get the latest version from https://pub.dev/packages/airbridge_flutter_sdk/versions
airbridge_flutter_sdk: HERE_LATEST_VERSION
请在该 Project 的最上层文件位置打开 Terminal
,然后执行以下命令。
Airbridge Flutter SDK 仅在 Flutter 1.20.0 及以上、Dart 2.12.0 及以上版本中运行。
flutter pub get
请在 pubspec.yaml
文件的 flutter/assets
块中添加以下行:
flutter:
assets:
- assets/airbridge.json
请在该 Project 的 ios
模块中的 AppDelegate
类文件中添加以下代码:
import airbridge_flutter_sdk
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
AirbridgeFlutter.initSDK(appName: "YOUR_APP_NAME", appToken: "YOUR_APP_TOKEN", withLaunchOptions: launchOptions)
}
#import <airbridge_flutter_sdk/AirbridgeFlutter.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[AirbridgeFlutter initSDKWithAppName:@"YOUR_APP_NAME" appToken:@"YOUR_APP_TOKEN" withLaunchOptions:launchOptions];
}
YOUR_APP_NAME
和 YOUR_APP_SDK_TOKEN
可在 Airbridge 面板的 [设置]>[Token] 获取。
如果该 Project 的 android
模块中尚未定义 Application
类,请创建一个 Application
类。
请在 Application
类中如下添加 AirbridgeFlutter.init
代码:
import co.ab180.airbridge.flutter.AirbridgeFlutter;
import io.flutter.app.FlutterApplication;
public class MainApplication extends FlutterApplication {
@Override
public void onCreate() {
super.onCreate();
AirbridgeFlutter.init(this, "YOUR_APP_NAME", "YOUR_APP_TOKEN");
}
}
import co.ab180.airbridge.flutter.AirbridgeFlutter
import io.flutter.app.FlutterApplication
class MainApplication: FlutterApplication() {
override fun onCreate() {
super.onCreate()
AirbridgeFlutter.init(this, "YOUR_APP_NAME", "YOUR_APP_TOKEN")
}
}
YOUR_APP_NAME
和 YOUR_APP_SDK_TOKEN
可在 Airbridge 面板的 [设置]>[Token] 获取。
请在该 Project 的 android
模块的 AndroidManifest.xml
文件中注册之前创建的 Application
类。
<application
android:name=".MainApplication"
...>
...
</application>
请在 Project 文件夹中创建 airbridge.json
文件。
请以 JSON 格式进行设置。
{
"sessionTimeoutSeconds": 300,
"autoStartTrackingEnabled": true,
"userInfoHashEnabled": true,
"trackAirbridgeLinkOnly": false,
"facebookDeferredAppLinkEnabled": false,
"locationCollectionEnabled": false,
"trackingAuthorizeTimeoutSeconds": 30,
"sdkSignatureSecretID": "YOUR_SDK_SIGNATURE_SECRET_ID",
"sdkSignatureSecret": "YOUR_SDK_SIGNATURE_SECRET",
"logLevel": "warning"
}
注意
trackingAuthorizeTimeoutSeconds
的默认值为 30 秒。在实际应用时,请根据 App 的用户体验(UX)和 ATT 弹窗设置来调整该值。有关更多信息,请参阅本指南的 “Tracking Authorize Timeout 设置(仅限 iOS)” 部分。
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
sessionTimeoutSeconds | Number | 300 | 即使用户重新启用 App,如果是在设定的会话期间内,也会被视为同一会话,不会重新发送 App 启用事件。 |
autoStartTrackingEnabled | Boolean | true | 如果设置为 |
userInfoHashEnabled | Boolean | true | 如果设置为 |
trackAirbridgeLinkOnly | Boolean | false | 如果设置为 |
facebookDeferredAppLinkEnabled | Boolean | false | 当设置为 |
metaInstallReferrer | String | null | (仅限 Android)设置 Meta Install Referrer 收集功能。 此功能从 |
locationCollectionEnabled | Boolean | false | (仅限 Android)如果设置为 使用此功能需要在 |
trackingAuthorizeTimeoutSeconds | Number | 30 | (仅限 iOS)如果设置 |
sdkSignatureSecretID | String | null | 启用 SDK 伪造(SDK Spoofing)防止功能。必须同时应用已发放的 Secret 和 Secret ID。 |
sdkSignatureSecret | String | null | 启用 SDK 伪造(SDK Spoofing)防止功能。必须同时应用已发放的 Secret 和 Secret ID。 |
logLevel | String | warning | 设置 Airbridge log 输出级别。
|
从 SDK 发生的事件可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看。实时记录最多可能会有 5 分钟的延迟。
请参阅以下指南在 Airbridge 面板进行深度链接设置:
请在 Xcode 中打开该 Project 的 ios
模块中的 *.xcodeproj
或 *.xcworkspace
文件。
请前往 [Info]。
请在 [URL Types] 部分的 URL Schemes 输入在 Airbridge 面板注册的 iOS URI Scheme。
请在 Xcode 中打开该 Project 的 ios
模块中的 *.xcodeproj
或 *.xcworkspace
文件。
请前往 [Signing & Capabilities]。
请在 [Associated Domains] 部分的 Domains 添加以下信息:
applinks:YOUR_APP_NAME.airbridge.io
applinks:YOUR_APP_NAME.deeplink.page
请打开该 Project 的 ios
模块中的 AppDelegate
文件。
请添加以下函数:
override func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
AirbridgeFlutter.deeplink.handle(userActivity)
return true
}
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
AirbridgeFlutter.deeplink.handleURLSchemeDeeplink(url)
return true
}
- (BOOL)application:(UIApplication*)application
continueUserActivity:(NSUserActivity*)userActivity
restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
{
[AirbridgeFlutter.deeplink handleUserActivity:userActivity];
return YES;
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
{
[AirbridgeFlutter.deeplink handleURLSchemeDeeplink:url];
return YES;
}
请按照以下步骤设置 Intent Filter
:
请打开该 Project 的 android
模块中的 AndroidManifest.xml
文件。
请在 MainActivity
中如下添加 Intent Filter
:
<activity ...>
...
<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="http" android:host="YOUR_APP_NAME.deeplink.page" />
<data android:scheme="https" android:host="YOUR_APP_NAME.deeplink.page" />
</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="http" android:host="YOUR_APP_NAME.airbridge.io" />
<data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
</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_APP_URI_SCHEME" />
</intent-filter>
...
</activity>
请打开该 Project 的 android
模块的 MainActivity
文件。
请在 MainActivity
中如下添加 onResume
和 onNewIntent
:
@Override
protected void onResume() {
super.onResume()
AirbridgeFlutter.processDeeplink(intent)
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent)
setIntent(intent)
}
override fun onResume() {
super.onResume()
AirbridgeFlutter.processDeeplink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
}
为收集用户点击的深度链接数据,请如下注册消息回调:
Airbridge.deeplink.setDeeplinkListener((deeplink) {
// airbridge deeplink = SCHEME://...
print('$deeplink');
});
在 main
函数中调用时,需要首先调用 WidgetsFlutterBinding.ensureInitialized();
。
完成 Airbridge Flutter SDK 深度链接设置后,可以通过下方链接检查是否能正确跳转到相应的 App 页面:
YOUR_APP_URI_SCHEME://
深度链接设置正确无误时,您可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看如下记录。
Airbridge 收集以下用户标识符信息,以监测跨 Web 和 App 的用户贡献:
User Email : 用户邮箱
User Phone : 用户电话号码
User ID : 用户唯一 ID (可识别用户并且在 Web 端和 App 端一致的 ID)
User Alias : 可以代表用户的其他 ID (例:忠诚计划专用 ID、集团子公司统一 ID)
用户邮箱和电话号码将自动进行 SHA256 哈希处理后发送到服务器。
您可通过以下方法在 Airbridge Flutter SDK 设置用户标识符信息:
Airbridge.state.setUser(
User(
id: 'tester',
email: 'tester@ab180.co',
phone: '+82 10 0000-0000',
alias: {
'alias_key': 'alias_value',
},
)
);
User Alias 最多可设置 10 个。
User Alias 的 key 是 string
类型,最多为 128 个字符。
User Alias 的 key 必须符合正则表达式 ^[a-z_][a-z0-9_]*$
User Alias 的 value 是 string
类型,最多为 1024 个字符。
设置用户标识符信息后,所有事件将包含标识符信息进行发送。
注意
已设置的用户标识信息可能会因用户事件自动消失或更改。
您可以通过以下方法更改已设置的用户信息的特定字段:
Airbridge.state.updateUser(
User(
id: 'sam1234',
)
);
您可以为提高 MTA(Multi-touch attribution, 多触点归因)分析的准确性、内部数据分析以及与第三方解决方案的集成等目的设置附加用户属性。
Airbridge.state.setUser(
User(
attributes: {
'attr_key': 'attr_value',
},
)
);
User Attribute 最多可设置 100 个。
User Attribute 的 key 是 string
类型,最多为 128 个字符。
User Attribute 的 key 必须符合正则表达式 ^[a-z_][a-z0-9_]*$
User Attribute 的 value 类型可以为 integer
、float
、long
、boolean
或 string
,且如果是 string
,则最多为 1024 个字符。
注意
已设置的用户属性信息可能会因用户事件自动消失或更改。
Airbridge Flutter SDK 中设置的用户信息可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看:
您可在 SDK 中设置设备标识符,使以后收集的所有事件包含设备标识符。设置后,无论 App 是否关闭,设备标识符将保留,除非手动删除。
Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE");
Airbridge.removeDeviceAlias("DELETE_THIS_KEY");
Airbridge.clearDeviceAlias();
方法 | 说明 |
---|---|
setDeviceAlias(key: String, value: String) | 将键值对添加到设备标识符中。 |
removeDeviceAlias(key: String) | 删除相应于 key 的设备标识符。如果没有相应的设备标识符,则不执行任何操作。 |
clearDeviceAlias() | 删除所有设备标识符。 |
当发生重要的用户行为时,您可以将该应用内事件发送至 Airbridge 分析。
虽然事件参数是可选的,但建议添加更多参数,以便提供更准确的统计数据。
event option
可以使用 action
、label
、value
、semanticAttributes
、customAttributes
。
category : 事件名称 (string) 必填
option : 事件参数
action : 事件属性 1 (string)
label : 事件属性 2 (string)
value : 事件属性 3 (num)
semanticAttributes : 标准事件属性 (Map<String, dynamic>)
customAttributes : 自定义事件属性 (Map<String, dynamic>)
static void trackEvent(String category, [ AirbridgeEventOption? option ]) {
event.trackEvent(category, option);
}
您可使用 SDK 发送用户事件。用户事件支持 action
、label
、value
、semanticAttributes
、customAttributes
。
发送注册事件时,请使用 setUser
输入用户标识符信息,然后发送 AirbridgeCategory.SIGN_UP
事件。
Airbridge.state.setUser(User(
id: 'tester',
email: 'tester@ab180.co',
phone: '+82 10 0000-0000',
));
Airbridge.trackEvent(AirbridgeCategory.SIGN_UP);
发送登录事件时,如果用户标识符信息尚未输入,请使用 setUser
输入用户标识符信息,然后发送 AirbridgeCategory.SIGN_IN
事件。
Airbridge.state.setUser(User(
ID: 'test',
email: 'test@ab180.co',
phone: '000-0000-0000',
));
Airbridge.trackEvent(AirbridgeCategory.SIGN_IN);
发送退出登录事件时,请发送 AirbridgeCategory.SIGN_OUT
事件,然后重置用户标识符信息。
Airbridge.trackEvent(AirbridgeCategory.SIGN_OUT);
Airbridge.state.setUser(User());
您可使用 SDK 发送电商事件。电商事件支持 action
、label
、value
、semanticAttributes
、customAttributes
。
在电商事件中,您可使用 semanticAttributes
发送产品信息。除了预定义的 key 外,还可以使用自定义 key。
Airbridge.trackEvent(AirbridgeCategory.HOME_VIEW);
Airbridge.event.trackEvent(
AirbridgeCategory.SEARCH_RESULT_VIEW,
AirbridgeEventOption(
semanticAttributes: {
AirbridgeAttributes.QUERY: 'product',
AirbridgeAttributes.PRODUCTS: [{
AirbridgeProduct.PRODUCT_ID: 'coke_zero',
AirbridgeProduct.NAME: 'product A',
AirbridgeProduct.PRICE: 1.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 1,
AirbridgeProduct.QUANTITY: 1,
}, {
AirbridgeProduct.PRODUCT_ID: 'burger_cheese_double',
AirbridgeProduct.NAME: 'product B',
AirbridgeProduct.PRICE: 3.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 2,
AirbridgeProduct.QUANTITY: 1,
}
]
}
));
Airbridge.event.trackEvent(
AirbridgeCategory.PRODUCT_DETAILS_VIEW,
AirbridgeEventOption(
semanticAttributes: {
AirbridgeAttributes.PRODUCT_LIST_ID: 'ID-1234567890',
AirbridgeAttributes.PRODUCTS: [{
AirbridgeProduct.PRODUCT_ID: 'coke_zero',
AirbridgeProduct.NAME: 'Coke Zero',
AirbridgeProduct.PRICE: 1.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 1,
AirbridgeProduct.QUANTITY: 1,
}, {
AirbridgeProduct.PRODUCT_ID: 'burger_cheese_double',
AirbridgeProduct.NAME: 'Double Cheeseburger',
AirbridgeProduct.PRICE: 3.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 2,
AirbridgeProduct.QUANTITY: 1,
}
]
}
));
Airbridge.event.trackEvent(
AirbridgeCategory.PRODUCT_DETAILS_VIEW,
AirbridgeEventOption(
semanticAttributes: {
AirbridgeAttributes.PRODUCTS: [{
AirbridgeProduct.PRODUCT_ID: 'coke_zero',
AirbridgeProduct.NAME: 'Coke Zero',
AirbridgeProduct.PRICE: 1.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 1,
AirbridgeProduct.QUANTITY: 1,
},
]
}
));
Airbridge.event.trackEvent(
AirbridgeCategory.ADD_TO_CART,
AirbridgeEventOption(
value: 5.98,
semanticAttributes: {
AirbridgeAttributes.CART_ID: 'ID-1234567890',
AirbridgeAttributes.CURRENCY: 'USD',
AirbridgeAttributes.PRODUCTS: [{
AirbridgeProduct.PRODUCT_ID: 'coke_zero',
AirbridgeProduct.NAME: 'Coke Zero',
AirbridgeProduct.PRICE: 1.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 1,
AirbridgeProduct.QUANTITY: 1,
}, {
AirbridgeProduct.PRODUCT_ID: 'burger_cheese_double',
AirbridgeProduct.NAME: 'Double Cheeseburger',
AirbridgeProduct.PRICE: 3.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 2,
AirbridgeProduct.QUANTITY: 1,
}
]
}
));
Airbridge.event.trackEvent(
AirbridgeCategory.ORDER_COMPLETED,
AirbridgeEventOption(
value: 5.98,
semanticAttributes: {
AirbridgeAttributes.TRANSACTION_ID: 'transactionID-purchase',
AirbridgeAttributes.CURRENCY: 'USD',
AirbridgeAttributes.IN_APP_PURCHASED: true,
AirbridgeAttributes.PRODUCTS: [{
AirbridgeProduct.PRODUCT_ID: 'coke_zero',
AirbridgeProduct.NAME: 'Coke Zero',
AirbridgeProduct.PRICE: 1.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 1,
AirbridgeProduct.QUANTITY: 1,
}, {
AirbridgeProduct.PRODUCT_ID: 'burger_cheese_double',
AirbridgeProduct.NAME: 'Double Cheeseburger',
AirbridgeProduct.PRICE: 3.99,
AirbridgeProduct.CURRENCY: 'USD',
AirbridgeProduct.POSITION: 2,
AirbridgeProduct.QUANTITY: 1,
}
]
}
));
如需直接配置并发送 Semantic Attribute,请参阅 本指南。
Airbridge Flutter SDK 发送的事件可在 Airbridge 面板的 [原始数据]>[App 实时记录] 查看。
MIR 收集设置在 airbridge-flutter-sdk v.3.5.4
及以上版本可用。请在 airbridge.json
文件添加以下代码设置 MIR 收集。
完成设置后,需要在 Airbridge 面板输入 Install Referrer Decryption Key,以查看解密后的 MIR。有关输入 Install Referrer Decryption Key 的方法,请参阅 本指南。
{
"metaInstallReferrer": "YOUR_META_APP_ID"
}
Airbridge SDK 可以通过以下处理收取归因结果数据:
Airbridge.setAttributionListener((result) {
// do something
});
归因结果回调数据将以 map
格式传递。可以收取的数据如下:
字段 | 说明 |
---|---|
attributedChannel | 渠道 (String) |
attributedCampaign | 广告系列 (String) |
attributedAdGroup | 广告组 (String) |
attributedAdCreative | 广告素材 (String) |
attributedContent | 内容 (String) |
attributedTerm | 关键词 (String) |
attributedSubPublisher | 子渠道 (String) |
attributedSubSubPublisher1 | 二级子渠道 1 (String) |
attributedSubSubPublisher2 | 二级子渠道 2 (String) |
attributedSubSubPublisher3 | 二级子渠道 3 (String) |
此功能从 Airbridge Flutter SDK 3.5.0 版本开始支持。
如果由于隐私法等原因无法收集 ADID,您可以使用移除了 ADID 收集功能的 Restricted SDK。Airbridge Flutter SDK Restricted 从 3.4.3 版本开始支持。
请在 pubspec.yaml
文件的 dependencies
块中添加以下行:
dependencies:
airbridge_flutter_sdk_restricted : 3.4.3
请在该 Project 的最上层文件位置打开 Terminal
,然后执行以下命令:
flutter pub get
您可通过 SDK 签名防止 SDK 伪造(SDK Spoofing)。SDK 签名从 airbridge_flutter_sdk v.3.2.0
开始可用。
请以 JSON 格式将以下设置输入 Project 文件夹的 airbridge.json
文件:
{
"sdkSignatureSecretID": "YOUR_SDK_SIGNATURE_SECRET_ID",
"sdkSignatureSecret": "YOUR_SDK_SIGNATURE_SECRET"
}
为了设置 SDK 签名,需要 SDK 签名凭证。请参阅 本指南 获取 SDK 签名凭证。
您可以设置 airbridge.json 文件的 sessionTimeoutSeconds
字段,以在设定的会话期间内,即使用户重新启用 App,也可判断为同一个会话,而不重新发送 App 启用事件。
会话过期时间的单位为毫秒(Millisecond),取值范围为从 0 到 604800000(7 天)。
会话过期时间的默认值为 1000 * 60 * 5
(5 分钟)。
如果出于内部数据分析等目的需要发送未经哈希处理的用户标识符信息,可以设置 airbridge.json 文件的 userInfoHashEnabled
字段,以停止对 User Email 和 User Phone 信息的哈希处理。
注意
由于此选项将敏感个人信息提供给第三方,因此必须事先采取额外的内部安全措施。
您可以通过设置 airbridge.json 文件的 facebookDeferredAppLinkEnabled
字段,以使用 Airbridge SDK 收取 Facebook 的 Deferred App Link。
当 facebookDeferredAppLinkEnabled
设置为 YES
、且已安装 Facebook SDK 时,SDK 将收取 Facebook Deferred App Link。
该功能需要先行设置 Facebook SDK,请参阅 Facebook 文档 设置 Facebook SDK。
如果由于 App 内的多个深度链接操作,导致难以通过 Airbridge 一目了然地查看再互动(Re-engagement)绩效,您可以通过设置 airbridge.json 文件的 trackAirbridgeLinkOnly
字段,过滤并仅查看由 Airbridge 深度链接产生的绩效。
开启此功能后,仅当通过符合以下条件的深度链接打开 App 时,才会监测深度链接绩效。
通过 Airbridge 面板中注册的深度链接打开 App 时
通过 airbridge.io
深度链接打开 App 时
通过 deeplink.page
深度链接打开 App 时
当 airbridge_referrer
query 信息存在时
此功能在根据隐私法(例:GDPR、CCPA)收集和传输数据时需要征得用户同意的情况下非常有用。
您可通过设置 airbridge.json 文件的 autoStartTrackingEnabled
字段,明确地开始收集和传输数据。
如果关闭此功能,则需要明确调用以下函数才能正确进行数据收集:
Airbridge.state.startTracking();
如果使用 AppTrackingTransparency.framework 显示询问用户是否允许追踪的弹窗,即使用户选择允许,由于安装事件会在选择之前发送,因此无法在安装事件中收集 IDFA。
您可以通过在之前添加的 airbridge.json 文件中为 trackingAuthorizeTimeoutSeconds
设置 timeout
,让 SDK 在发送安装事件之前等待用户在 timeout
内完成选择。
您可以通过在 airbridge.json 文件中设置 locationCollectionEnabled
字段,收集用户的位置信息。
注意
位置信息必须以合法目的和方式收集,使用此功能请谨慎。
此功能仅在 Android 上可用,且 AndroidManifest.xml
中必须包含以下权限设置:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
为了打开 Airbridge 追踪链接,通常需要通过浏览器。但 Airbridge SDK 提供一项功能, 使追踪链接可以无需经过浏览器直接打开。
Airbridge.placement.click('https://abr.ge/~~~', 'ablog://main', 'https://airbridge.io');
Airbridge.placement.impression('https://abr.ge/~~~');
click
函数会将追踪链接的点击统计增加 1 次,并将用户跳转到预先设置的 App、Web、或后备目的地。请在追踪链接被点击时调用此函数。
click
函数中的 deeplink
和 fallback
是在无互联网连接时使用的备用链接。deeplink
参数仅支持 Custom URI Scheme 格式的深度链接。(这些都是 optional
参数。)
impression
函数会将追踪链接的展示统计增加 1 次。请在追踪链接被展示在用户界面 (UI) 时调用此函数。
使用品牌域名时,无法使用包含自定义链接短 ID 的追踪链接。
示例 1、http://deeplink.ab180.co/custom → 不可用
示例 2、http://deeplink.ab180.co/a3b1c2 → 可用
示例 3、https://abr.ge/a3b1c2 → 可用
await Airbridge.state.deviceUUID()
卸载追踪在 Airbridge Flutter SDK 3.0.2 及以上版本可用。
Airbridge Android SDK 2.6.0 及以上版本
Airbridge iOS SDK 1.28.2 及以上版本
有关卸载追踪设置,请参阅 本指南。
Airbridge.registerPushToken(token);
请将已获取的推送 Token 通过 registerPushToken
方法发送至 Airbridge。
如果传递的远程数据中 airbridge-uninstall-tracking
的值为 true
,请使 App 忽略该静默推送通知。
仅通过安装 Web SDK 无法追踪 App 安装、App 启用、深度链接调用等其他事件。您可通过以下设置在 Hybrid App 调用应用内事件:
Airbridge.createWebInterface(
webToken: 'YOUR_WEB_TOKEN',
postCommandFunction: (arg) {
return """...""";
});
您可通过 Airbridge.createWebInterface
控制 Web Interface。请参阅 Flutter Hybrid App 集成指南。
在使用 Flutter SDK 3.0.1 及以上版本进行 iOS 构建时,由于不支持 Bitcode,可能会出现如下错误:
ld: XCFrameworkIntermediates/AirBridge/AirBridge.framework/AirBridge(AirBridge-arm64-master.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)
从 Flutter SDK 3.0.1 版本起,Airbridge iOS SDK 升级至 1.28.0 版本,且 Airbridge iOS SDK 从 1.28.0 版本起停止支持 Bitcode。如遇到上述错误,请参阅 Bitcode 编译错误指南。
构建 Android 时,如果出现 Plugin project ... not found. Please update settings.gradle
错误,可以通过如下修改 android/settings.gradle
文件解决问题:
include ':app'
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, path ->
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
include ":$name"
project(":$name").projectDir = pluginDirectory
}
Flutter 问题:https://github.com/flutter/flutter/issues/16049
Airbridge Flutter SDK 是一个 swift plugin,但在 Flutter 中,如果在 100% Objective-C Project 中使用 swift plugin,就会出现此错误。您可以通过以下方法解决此问题:
请导航至 [File]>[New]>[File...] 选择 Swift File。
请创建 File.swift
文件和 Bridge Header。
此问题在 Objective-C & Swift Project 以及 100% Swift Project 中不会出现。
更新 SDK 时,请考虑以下内容:
对于 2023-09-04 或以后创建的 Airbridge App,3.4.2~3.4.7 版本中存在的深度链接回调提供的深度链接 URL 被解码 2 次的问题得到解决。
对于 2023-09-04 或以后创建的 Airbridge App,深度链接回调提供的深度链接 URL 中不再添加 airbridge_referrer
。
更新 iOS App 时,SKAN 转化值将以最后计算的值为准,不会进行额外计算。
3.4.2 以下版本计算 SKAN 转化值的时间最多为 24 小时。
对于新安装,这不会成为问题。
deeplink.page
已被弃用。从 3.4.2 版本开始,请使用 abr.ge
作为深度链接域名进行代码编写。
为了保持向后兼容性,deeplink.page
仍然受支持并可正常运行。
kotlin plugin 版本更新为 1.5.21。
trackingAuthorizeTimeout
的默认值更改为 30 秒。
原有的事件发送 API 已被删除,并被以下 API 所取代:
static void trackEvent(String category, [ AirbridgeEventOption? option ]) {
event.trackEvent(category, option);
}
有关更多信息,请参阅 Flutter 3.X.X 迁移指南。
请将 AppDelegate
中的 AirbridgeFL
类更改为 AirbridgeFlutter
类。
请将 MainApplication
和 MainActivity
中的 AirbridgeFL
类更改为 AirbridgeFlutter
类。
请将 MainActivity
中的 processDeeplinkData
函数更改为 processDeeplink
函数。
Was this page helpful?