SDK 마이그레이션 가이드 - 플러터 SDK

에어브릿지 플러터 SDK의 업데이트에 필요한 사항을 확인할 수 있습니다. 현재 버전 이후부터 업데이트 이후 버전까지의 사항을 모두 확인하는 것을 권장합니다.

v3.x에서 v4.0으로 업데이트

에어브릿지 플러터 SDK를 v4.0으로 업데이트하면 확인해 주세요.

옵션

함수 (Flutter)

상수 (Flutter)

함수 (iOS)

함수 (Android)

SDK 설치 및 초기화

airbridge.json 의 위치가 변경되었습니다. assets/airbridge.json 파일을 플러터 프로젝트 폴더 최상단의 airbridge.json 파일로 위치를 이동해주세요.

airbridge.json 의 키값이 변경되었습니다. 아래와 같이 키값을 변경해 주세요.

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",
+     )
+ }

안드로이드의 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.handleURLSchemeDeeplink , AirbridgeFlutter.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
+ }

안드로이드의 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)
+ }

커스텀 도메인 설정하기

v2.x 에서 사용 되던 커스텀 도메인 주소 플랫폼 별로 설정하던 방식이 변경되었습니다.

에어브릿지 SDK 초기화시 airbridge.json 의 trackingLinkCustomDomains에 커스텀 도메인 링크를 추가 할 수 있습니다

123
{
    "trackingLinkCustomDomains": ["YOUR_APP_CUSTOM_DOMAIN"]
}

인앱 이벤트 및 유저 정보

주의하세요

기존 AirbridgeAttributes.TOTAL_VALUE 대신 AirbridgeAttribute.VALUE 에 값을 입력해 주세요.

AirbridgeAttributes.TOTAL_VALUE 를 사용하고 value 를 정의하면 AirbridgeAttributes.TOTAL_VALUEvalue 를 덮어 쓰는 로직은 Flutter SDK v4부터 삭제되었습니다.

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 함수의 두 번째 파라미터에 해당하는 action , label , value , semanticAttributes 값은 Airbridge.trackEvent 함수의 두 번째 파라미터에 포함되어야 합니다.

Airbridge.event.trackEvent 함수의 두 번째 파라미터에 해당하는 customAttributes 값은 Airbridge.trackEvent 함수의 세 번째 파라미터에 포함되어야 합니다.

Airbridge.state.setUser , Airbridge.state.updateUser 함수가 Airbridge.setUser 관련 함수로 대체되었습니다. 유저 정보를 한번에 설정하는 setUser , updateUser 함수는 지원하지 않습니다.

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.click , Airbridge.placement.impression 함수가 Airbridge.click , Airbridge.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.createWebInterfaceScript , Airbridge.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 업데이트

플러터 SDK 각 버전의 주요 변경사항을 참고해 주세요.

v3.5.0 - 딥링크

딥링크 콜백에서 제공하는 딥링크 URL이 에어브릿지 대시보드에 입력된 내용을 2번 디코딩하는 문제가 해결됐습니다. 3.4.2에서 3.4.7 버전과 2023년 9월 4일 이후에 생성된 에어브릿지 앱이 대상입니다.

v3.4.2 - 딥링크

2023년 9월 4일 이후에 생성된 에어브릿지 앱에는 딥링크 콜백에서 제공하는 딥링크 URL에 airbridge_referrer가 추가되지 않습니다.

ios app을 업데이트하면 마지막으로 계산된 SKAdNetwork Conversion Value 로 확정됩니다. 추가적인 계산은 진행하지 않습니다.

  • 3.4.2 미만 버전에서는 SKAdNetwork Conversion Value 를 최대 24시간 동안만 계산합니다.

  • 새롭게 앱을 설치하는 유저는 해당하지 않습니다.

deeplink.page 가 deprecated 되었습니다. 3.4.2 부터는 abr.ge 로 딥링크 도메인을 사용해 코드를 작성하는 것을 권장합니다.

  • deeplink.page 는 하위 호환을 위해 계속 지원 및 동작할 예정입니다.

v3.4.1 - kotlin

kotlin plugin version 을 1.5.21 로 업데이트 하였습니다.

v3.4.0 - 개인정보보호 설정

trackingAuthorizeTimeout 의 기본값이 30초로 변경됩니다.