웹앱 연동
웹앱에 대해서는 문서를 참고해주세요.
InAppWebView를 통해 자사 웹사이트를 랜더링하는 경우, 다음 같은 설정을 통해 웹사이트에 포함된 핵클 JavaScript SDK를 웹사이트 코드 변경없이 핵클 Flutter SDK 기능과 동일하게 사용할 수 있습니다.
이 경우 모든 핵클 이벤트는 Futter SDK를 통해 수집됩니다.
import 'dart:collection';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:hackle/hackle.dart';
InAppWebView(
initialSettings: InAppWebViewSettings(
javaScriptEnabled: true,
),
initialUserScripts: UnmodifiableListView<UserScript>([
UserScript(
source: HackleApp.getWebBridgeScript(),
injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START,
forMainFrameOnly: true
)]),
onWebViewCreated: (controller) {
controller.loadUrl(urlRequest: URLRequest(url: WebUri('YOUR_WEB_URL')));
},
onJsPrompt: (controller, jsPromptRequest) async {
if(HackleApp.isInvocableCommandInWebView(jsPromptRequest.message)) {
var result = await HackleApp.handleWebInterfaceCommand(jsPromptRequest.message);
return JsPromptResponse(action: JsPromptResponseAction.CONFIRM, handledByClient: true, value: result);
} else {
return JsPromptResponse(handledByClient: false);
}
},
);
해당 기능을 사용하기 위해서는 JavaScript 웹페이지에서 동일한 App SDK 키를 사용해야 합니다.
핵클 Flutter 웹뷰 설정은 안드로이드
Javascript Userscript등을 이용하여 핵클 JavaScript SDK와 상호작용하게 됩니다.
initialUserScripts의 경우 안드로이드 환경에서 웹페이지 로드 전에 호출됨에 보장되지 않아 반드시onWebViewCreated에서 반환된controller에서 페이지를 로드해주세요.
웹사이트에서
beforeunload,unload시점에 이벤트를 발행하고, 웹뷰를 닫는 행위를 할 시 이벤트가 정상적으로 발생하지 않거나, os popup이 뜨는 등 이상동작이 발생할 수 있습니다.해당 생명주기에서 이벤트를 발생시키기 위해서는 Flutter InAppWebView의 KeepAlive 기능을 사용하여 웹뷰 객체가 플러터 위젯 트리에서 삭제되도 네이티브 단에 유지되게 하면 이벤트가 정상적으로 발행됩니다.
웹뷰에서 발생하는 자동 수집 이벤트 연동
웹뷰 내 웹사이트에서 발생하는 $page_view는 비활성화 상태입니다.
웹뷰 브릿지를 설정할 때 HackleWebViewConfig를 설정하여 자동 수집 이벤트를 활성화할 수 있습니다.
import 'dart:collection';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:hackle/hackle.dart';
var webViewConfig = HackleWebViewConfig
.builder()
.automaticScreenTracking(true)
.build()
InAppWebView(
initialSettings: InAppWebViewSettings(
javaScriptEnabled: true,
),
initialUserScripts: UnmodifiableListView<UserScript>([
UserScript(
source: HackleApp.getWebBridgeScript(webViewConfig: webViewConfig),
injectionTime: UserScriptInjectionTime.AT_DOCUMENT_START,
forMainFrameOnly: true
)]),
onWebViewCreated: (controller) {
controller.loadUrl(urlRequest: URLRequest(url: WebUri('YOUR_WEB_URL')));
},
onJsPrompt: (controller, jsPromptRequest) async {
if(HackleApp.isInvocableCommandInWebView(jsPromptRequest.message)) {
var result = await HackleApp.handleWebInterfaceCommand(jsPromptRequest.message);
return JsPromptResponse(action: JsPromptResponseAction.CONFIRM, handledByClient: true, value: result);
} else {
return JsPromptResponse(handledByClient: false);
}
},
);
설정 옵션
| 설정 | 기능 | 기본값 | 지원 버전 |
|---|---|---|---|
| automaticScreenTracking | 웹사이트에서 발생해는 $page_view 수집 여부 | false | 2.26.0 + |
Updated 5 days ago
