您可以查看更新 Airbridge Flutter SDK 过程中需要注意的内容。建议查看当前版本至目标更新版本之间的所有更新详情。
如果您将 Airbridge Flutter SDK 更新至 v4.0,请查看以下内容。
airbridge.json (v3) | airbridge.json (v4) | Change |
---|---|---|
- | sdkEnabled | New features have been added. |
logLevel | logLevel | - |
autoStartTrackingEnabled | autoStartTrackingEnabled | - |
trackingAuthorizeTimeoutSeconds | autoDetermineTrackingAuthorizationTimeoutInSecond | The name has been changed. |
facebookDeferredAppLinkEnabled | trackMetaDeferredAppLinkEnabled | The name has been changed. |
sessionTimeoutSeconds | sessionTimeoutInSecond | The name has been changed. |
metaInstallReferrer | metaInstallReferrerAppID | The name has been changed. |
trackAirbridgeLinkOnly | trackAirbridgeDeeplinkOnlyEnabled | The name has been changed. |
- | trackInSessionLifecycleEventEnabled | New features have been added. |
userInfoHashEnabled | hashUserInformationEnabled | The name has been changed. |
sdkSignatureSecretID | sdkSignatureID | The name has been changed. |
sdkSignatureSecret | sdkSignatureSecret | The name has been changed. |
- | clearEventBufferOnInitializeEnabled | New features have been added. |
- | eventBufferCountLimit | New features have been added. |
- | eventBufferSizeLimitInGibibyte | New features have been added. |
- | eventTransmitIntervalInSecond | New features have been added. |
Airbridge (v3) | Airbridge (v4) | Change |
---|---|---|
setAttributionListener | setOnAttributionReceived | The name has been changed. |
setDeeplinkListener | setOnDeeplinkReceived | The name has been changed. |
event.trackEvent | trackEvent | The name has been changed. Method of inserting attributes is changed. |
state.deviceUUID | fetchDeviceUUID | The name has been changed. DeviceUUID is now returned with callback. |
- | fetchAirbridgeGeneratedUUID | New features have been added. |
- | isUninstallTrackingNotification | New features have been added. |
placement.click | click | The name has been changed. Callback feature is added. |
placement.impression | impression | The name has been changed. Callback feature is added. |
state.setUser | - | Replaced with User related functions. |
state.updateUser | - | Replaced with User related functions. |
- | setUserID | New features have been added. |
- | clearUserID | New features have been added. |
- | setUserEmail | New features have been added. |
- | clearUserEmail | New features have been added. |
- | setUserPhone | New features have been added. |
- | clearUserPhone | New features have been added. |
- | setUserAttribute | New features have been added. |
- | removeUserAttribute | New features have been added. |
- | clearUserAttributes | New features have been added. |
- | setUserAlias | New features have been added. |
- | removeUserAlias | New features have been added. |
- | clearUserAlias | New features have been added. |
- | clearUser | New features have been added. |
setDeviceAlias | setDeviceAlias | - |
removeDeviceAlias | removeDeviceAlias | - |
clearDeviceAlias | clearDeviceAlias | - |
registerPushToken | registerPushToken | - |
- | enableSDK | New features have been added. |
- | disableSDK | New features have been added. |
- | isSDKEnabled | New features have been added. |
state.startTracking | startTracking | The name has been changed. |
- | stopTracking | New features have been added. |
- | isTrackingEnabled | New features have been added. |
createWebInterface | - | Replaced with WebInterface related functions. |
- | createWebInterfaceScript | New features have been added. |
- | handleWebInterfaceCommand | New features have been added. |
AirbridgeCategory (v3) | AirbridgeCategory (v4) | Change |
---|---|---|
SIGN_UP | SIGN_UP | - |
SIGN_IN | SIGN_IN | - |
SIGN_OUT | SIGN_OUT | - |
HOME_VIEWED | HOME_VIEWED | - |
PRODUCT_LIST_VIEWED | PRODUCT_LIST_VIEWED | - |
SEARCH_RESULTS_VIEWED | SEARCH_RESULTS_VIEWED | - |
PRODUCT_VIEWED | PRODUCT_VIEWED | - |
ADD_PAYMENT_INFO | ADD_PAYMENT_INFO | - |
ADD_TO_WISHLIST | ADD_TO_WISHLIST | - |
ADD_TO_CART | ADDED_TO_CART | - |
INITIATE_CHECKOUT | INITIATE_CHECKOUT | - |
ORDER_COMPLETED | ORDER_COMPLETED | - |
ORDER_CANCELED | ORDER_CANCELED | - |
START_TRIAL | START_TRIAL | - |
SUBSCRIBE | SUBSCRIBE | - |
UNSUBSCRIBE | UNSUBSCRIBE | - |
AD_IMPRESSION | AD_IMPRESSION | - |
AD_CLICK | AD_CLICK | - |
COMPLETE_TUTORIAL | COMPLETE_TUTORIAL | - |
ACHIEVE_LEVEL | ACHIEVE_LEVEL | - |
UNLOCK_ACHIEVEMENT | UNLOCK_ACHIEVEMENT | - |
RATE | RATE | - |
SHARE | SHARE | - |
SCHEDULE | SCHEDULE | - |
SPEND_CREDITS | SPEND_CREDITS | - |
AirbridgeAttributes (v3) | AirbridgeAttribute (v4) | Change |
---|---|---|
- | ACTION | New features have been added. |
- | LABEL | New features have been added. |
- | VALUE | New features have been added. |
TOTAL_VALUE | - | The feature has been removed. Please enter in VALUE. |
CURRENCY | CURRENCY | - |
ORIGINAL_CURRENCY | ORIGINAL_CURRENCY | - |
PRODUCTS | PRODUCTS | - |
PERIOD | PERIOD | - |
IS_RENEWAL | IS_RENEWAL | - |
RENEWAL_COUNT | RENEWAL_COUNT | - |
PRODUCT_LIST_ID | PRODUCT_LIST_ID | - |
CART_ID | CART_ID | - |
TRANSACTION_ID | TRANSACTION_ID | - |
TRANSACTION_TYPE | TRANSACTION_TYPE | - |
TRANSACTION_PAIRED_EVENT_CATEGORY | TRANSACTION_PAIRED_EVENT_CATEGORY | - |
TRANSACTION_PAIRED_EVENT_TIMESTAMP | TRANSACTION_PAIRED_EVENT_TIMESTAMP | - |
TOTAL_QUANTITY | TOTAL_QUANTITY | - |
QUERY | QUERY | - |
IN_APP_PURCHASED | IN_APP_PURCHASED | - |
CONTRIBUTION_MARGIN | CONTRIBUTION_MARGIN | - |
ORIGINAL_CONTRIBUTION_MARGIN | ORIGINAL_CONTRIBUTION_MARGIN | - |
LIST_ID | LIST_ID | - |
RATE_ID | RATE_ID | - |
RATE | RATE | - |
MAX_RATE | MAX_RATE | - |
ACHIEVEMENT_ID | ACHIEVEMENT_ID | - |
SHARED_CHANNEL | SHARED_CHANNEL | - |
DATE_TIME | DATE_TIME | - |
DESCRIPTION | DESCRIPTION | - |
IS_REVENUE | IS_REVENUE | - |
PLACE | PLACE | - |
SCHEDULE_ID | SCHEDULE_ID | - |
TYPE | TYPE | - |
LEVEL | LEVEL | - |
SCORE | SCORE | - |
AD_PARTNERS | AD_PARTNERS | - |
IS_FIRST_PER_USER | IS_FIRST_PER_USER | - |
AirbridgeProduct (v3) | AirbridgeAttribute (v4) | Change |
---|---|---|
PRODUCT_ID | PRODUCT_ID | - |
PRODUCT_NAME | PRODUCT_NAME | - |
PRODUCT_PRICE | PRODUCT_PRICE | - |
PRODUCT_QUANTITY | PRODUCT_QUANTITY | - |
PRODUCT_CURRENCY | PRODUCT_CURRENCY | - |
PRODUCT_POSITION | PRODUCT_POSITION | - |
PRODUCT_CATEGORY_ID | PRODUCT_CATEGORY_ID | - |
PRODUCT_CATEGORY_NAME | PRODUCT_CATEGORY_NAME | - |
PRODUCT_BRAND_ID | PRODUCT_BRAND_ID | - |
PRODUCT_BRAND_NAME | PRODUCT_BRAND_NAME | - |
AirbridgeFlutter (v3) | AirbridgeFlutter (v4) | Change |
---|---|---|
getInstance | initializeSDK | The name has been changed. |
deeplink.handleURLSchemeDeeplink | trackDeeplink | The name has been changed. |
deeplink.handleUserActivity | trackDeeplink | The name has been changed. |
AirbridgeFlutter (v3) | AirbridgeFlutter (v4) | Change |
---|---|---|
init | initializeSDK | The name has been changed. |
processDeeplinkData | trackDeeplink | The name has been changed. |
setLifecycleIntegration | setLifecycleIntegration | - |
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
文件。
- 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
文件。
- 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
函数替代。
- 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.handleURLSchemeDeeplink
和 AirbridgeFlutter.deeplink.handleUserActivity
函数已被 AirbridgeFlutter.trackDeeplink
函数替代。
- 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
函数替代。
- 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
函数。
- 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
函数的第二个参数中的action
、label
、value
和semanticAttributes
值,应包含在Airbridge.trackEvent
函数的第二个参数中。
Airbridge.event.trackEvent
函数的第二个参数中的customAttributes
值,应包含在Airbridge.trackEvent
函数的第三个参数中。
Airbridge.state.setUser
和 Airbridge.state.updateUser
函数已被 Airbridge.setUser 相关函数替代。不再支持一次性设置用户信息的 setUser
或 updateUser
函数。
- 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
函数替代。
- 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.click
和 Airbridge.placement.impression
函数已被 Airbridge.click
和 Airbridge.impression
函数替代。
- 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.createWebInterfaceScript
和 Airbridge.handleWebInterfaceCommand
函数替代。
- 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)
+ ]),
+ )
+ ...
+ });
+ ...
请参考各 Flutter SDK 版本的主要变更内容。
修复了 v3.4.2~v3.4.7 中出现的,2023-09-04 或以后创建的 Airbridge App 在深度链接回调中提供的深度链接 URL 被解码两次的问题。
对于 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 小时。
不适用于新安装。
kotlin plugin version 已更新为 v1.5.21。
trackingAuthorizeTimeout
的默认值更改为 30 秒。
Was this page helpful?
- 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
+ })
- 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
+ }
- 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('...')
- 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")
+ ...
+ }
- 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)
+ }
- 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
+ });
- 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': '...',
+ });
- 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);
- 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)
+ ]),
+ )
+ ...
+ });
+ ...