SDK 迁移指南 - Flutter SDK (v4)

您可以查看更新 Airbridge Flutter SDK 过程中需要注意的内容。建议查看当前版本至目标更新版本之间的所有更新详情。

从 v3.x 更新至 v4.0

如果您将 Airbridge Flutter SDK 更新至 v4.0,请查看以下内容。

SDK 安装及初始化

airbridge.json 的位置已更改。请将 assets/airbridge.json 文件移动至 Flutter Project 文件夹顶部的 airbridge.json 文件中。

airbridge.json 的键名已更改。请参考下方映射进行修改。

airbridge.json (v3)

airbridge.json (v4)

trackingAuthorizeTimeoutSeconds

autoDetermineTrackingAuthorizationTimeoutInSecond

facebookDeferredAppLinkEnabled

trackMetaDeferredAppLinkEnabled

sessionTimeoutSeconds

sessionTimeoutInSecond

metaInstallReferrer

metaInstallReferrerAppID

trackAirbridgeLinkOnly

trackAirbridgeDeeplinkOnlyEnabled

userInfoHashEnabled

hashUserInformationEnabled

sdkSignatureSecretID

sdkSignatureID

sdkSignatureSecret

sdkSignatureSecret

iOS 的 AirbridgeFlutter.init 函数已被 AirbridgeFlutter.initializeSDK 函数替代。请修改 ios/YOUR_PROJECT_NAME/AppDelegate.swift 文件。

12345678910111213141516171819
- override func application(
-     _ application: UIApplication,
-     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
-     AirbridgeFlutter.init(
-         appName: "YOUR_APP_NAME",
-         appToken: "YOUR_APP_SDK_TOKEN",
-         withLaunchOptions: launchOptions
-     )
- }
+ override func application(
+     _ application: UIApplication,
+     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+     AirbridgeFlutter.initializeSDK(
+         name: "YOUR_APP_NAME",
+         token: "YOUR_APP_SDK_TOKEN",
+     )
+ }

Android 的 AirbridgeFlutter.init 函数已被 AirbridgeFlutter.initializeSDK 函数替代。请修改 android/app/src/main/java/.../MainApplication.kt 文件。

1234567891011121314
- import co.ab180.airbridge.flutter.AirbridgeFlutter
- ...
- override fun onCreate() {
-     super.onCreate()
-     AirbridgeFlutter.init(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
-     ...
- }
+ import co.ab180.airbridge.flutter.AirbridgeFlutter
+ ...
+ override fun onCreate() {
+     super.onCreate()
+     AirbridgeFlutter.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
+     ...
+ }

深度链接

Airbridge.setDeeplinkListener 函数已被 Airbridge.setOnDeeplinkReceived 函数替代。

12345678910
- import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
- ...
- Airbridge.setDeeplinkListener((url) => {
-     // show proper content
- })
+ import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
+ ...
+ Airbridge.setOnDeeplinkReceived((url) => {
+     // show proper content
+ })

iOS 的 AirbridgeFlutter.deeplink.handleURLSchemeDeeplinkAirbridgeFlutter.deeplink.handleUserActivity 函数已被 AirbridgeFlutter.trackDeeplink 函数替代。

123456789101112131415161718192021222324252627282930
- 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
- }
+ override func application(
+     _ application: UIApplication,
+     continue userActivity: NSUserActivity,
+     restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
+ ) -> Bool {
+     AirbridgeFlutter.trackDeeplink(userActivity: userActivity)
+     
+     return true
+ }
+ 
+ override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
+     AirbridgeFlutter.trackDeeplink(url: url)
+     
+     return true
+ }

Android 的 AirbridgeFlutter.processDeeplinkData 函数已被 AirbridgeFlutter.trackDeeplink 函数替代。

123456789101112
- import co.ab180.airbridge.flutter.AirbridgeFlutter
- ...
- override fun onResume() {
-   super.onResume()
-   AirbridgeFlutter.processDeeplinkData(intent)
- }
+ import co.ab180.airbridge.flutter.AirbridgeFlutter
+ ...
+ override fun onResume() {
+   super.onResume()
+   AirbridgeFlutter.trackDeeplink(intent)
+ }

应用内事件及用户信息

注意

请使用 AirbridgeAttribute.VALUE 代替原 AirbridgeAttributes.TOTAL_VALUE 进行赋值。

从 Flutter SDK v4 起,AirbridgeAttributes.TOTAL_VALUE 覆盖 value 赋值的逻辑已被删除。

Airbridge.event.trackEvent 函数已被 Airbridge.trackEvent 函数替代。

请参考下方示例代码,将 Airbridge.event.trackEvent 函数修改为 Airbridge.trackEvent 函数。

1234567891011121314151617181920212223242526272829303132
- import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
- ...
- Airbridge.event.trackEvent(
-     'event',
-     AirbridgeEventOption(
-         action: '...',
-         label: '...',
-         value: 100,
-         semanticAttributes: {
-             AirbridgeAttributes.QUERY: '...',
-         },
-         customAttributes: {
-             'key1': '...',
-             'key2': '...',
-             'key3': '...',
-         },
-     ));
+ import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
+ ...
+ Airbridge.trackEvent(
+     category: 'event',
+     semanticAttributes: {
+         AirbridgeAttribute.ACTION: '...',
+         AirbridgeAttribute.LABEL: '...',
+         AirbridgeAttribute.VALUE: 100,
+         AirbridgeAttribute.QUERY: '...',
+     },
+     customAttributes: {
+             'key1': '...',
+             'key2': '...',
+             'key3': '...',
+     });

注意

Airbridge.event.trackEvent 函数的第二个参数中的 actionlabelvaluesemanticAttributes 值,应包含在 Airbridge.trackEvent 函数的第二个参数中。

Airbridge.event.trackEvent 函数的第二个参数中的 customAttributes 值,应包含在 Airbridge.trackEvent 函数的第三个参数中。

Airbridge.state.setUserAirbridge.state.updateUser 函数已被 Airbridge.setUser 相关函数替代。不再支持一次性设置用户信息的 setUserupdateUser 函数。

12345678910111213141516
- import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
- ...
- Airbridge.state.setUser(
-     User(
-         id: '...',
-         email: '...'
-     ));
- Airbridge.state.updateUser(
-     User(
-         phone: '...'
-     ));
+ import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
+ ...
+ Airbridge.setUserID('...')
+ Airbridge.setUserEmail('...')
+ Airbridge.setUserPhone('...')

高级设置

Airbridge.setAttributionListener 函数已被 Airbridge.setOnAttributionReceived 函数替代。

12345678910
- import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
- ...
- Airbridge.setAttributionListener((attribution) {
-     // using attribution
- });
+ import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
+ ...
+ Airbridge.setOnAttributionReceived((attribution) {
+     // using attribution
+ });

Airbridge.placement.clickAirbridge.placement.impression 函数已被 Airbridge.clickAirbridge.impression 函数替代。

12345678
- import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
- ...
- Airbridge.placement.click(url);
- Airbridge.placement.impression(url);
+ import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
+ ...
+ Airbridge.click(url);
+ Airbridge.impression(url);

Airbridge.createWebInterface 函数已被 Airbridge.createWebInterfaceScriptAirbridge.handleWebInterfaceCommand 函数替代。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
- var webInterface = Airbridge.createWebInterface(
-     webToken: 'YOUR_WEB_TOKEN',
-     postCommandFunction: (arg) {
-       return """window.flutter_inappwebview.callHandler('postMessage', $arg);"""; 
-   });
- ...
- InAppWebView(
-   initialUrlRequest: URLRequest(url: WebUri('https://...')),
-   onWebViewCreated: (controller) async {
-     controller.addJavaScriptHandler(handlerName: 'postMessage', callback: (args) {
-       webInterface.handle(args[0]);
-       return args;
-     });
-   },
-   initialUserScripts: UnmodifiableListView<UserScript>([
-     UserScript(
-       source: webInterface.script, 
-       injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START)
-   ]),
-   ...
- )
- ...
+ Future<String?> getJavascriptInterface() async {
+     return await Airbridge.createWebInterfaceScript(
+       webToken: 'YOUR_WEB_TOKEN',
+       postMessageScript: 'window.flutter_inappwebview.callHandler(payload);',
+     );
+   }
+ ...
+ FutureBuilder(
+   future: getJavascriptInterface(),
+   builder: (BuildContext context, AsyncSnapshot snapshot) {
+     return 
+       ...
+       InAppWebView(
+         initialUrlRequest: URLRequest(url: WebUri('https://...')),
+         onWebViewCreated: (controller) async {
+           controller.addJavaScriptHandler(handlerName: 'postMessage', callback: (args) {
+             Airbridge.handleWebInterfaceCommand(args[0]);
+             return args;
+           });
+         },
+         initialUserScripts: UnmodifiableListView<UserScript>([
+           UserScript(
+             source: snapshot.data ?? "", 
+             injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START)
+         ]),
+       )
+       ...
+   });
+ ...

v3.x 更新

请参考各 Flutter SDK 版本的主要变更内容。

v3.5.0 - 深度链接

修复了 v3.4.2~v3.4.7 中出现的,2023-09-04 或以后创建的 Airbridge App 在深度链接回调中提供的深度链接 URL 被解码两次的问题。

v3.4.2 - 深度链接、SKAN

  • 对于 2023-09-04 或以后创建的 Airbridge App,在深度链接回调中提供的深度链接 URL 将不再附加 airbridge_referrer

  • deeplink.page 已被弃用。从 3.4.2 版本开始,请使用 abr.ge 作为深度链接域名进行代码编写。

    • 为了保持向后兼容性,deeplink.page 仍然受支持并可正常运行。

  • 更新 iOS App 时,最后计算的 SKAN 转化值将确认为最终值,不会进行额外计算。

    • 3.4.2 以下版本计算 SKAN 转化值的时间最多为 24 小时。

    • 不适用于新安装。

v3.4.1 - kotlin

kotlin plugin version 已更新为 v1.5.21。

v3.4.0 - 隐私设置

trackingAuthorizeTimeout 的默认值更改为 30 秒。

Was this page helpful?

Have any questions or suggestions?