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 helpful?

    Any questions or suggestions?