μΉμ± μ°λ
μ§μ SDK λ²μ
Flutter SDK 2.13.0 μ΄μ λ²μ μμ μ§μνλ κΈ°λ₯μ λλ€.
JavaScript SDK 11.24.1 μ΄μ λ²μ μμ μ§μνλ κΈ°λ₯μ λλ€.
WebView
λ₯Ό ν΅ν΄ μμ¬ μΉμ¬μ΄νΈλ₯Ό λλλ§νλ κ²½μ°, λ€μ κ°μ μ€μ μ ν΅ν΄ μΉμ¬μ΄νΈμ ν¬ν¨λ ν΅ν΄ 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);
}
},
);
ν΅ν΄ Flutter μΉλ·° μ€μ μ μλλ‘μ΄λ
Javascript Userscript
λ±μ μ΄μ©νμ¬ ν΅ν΄ JavaScript SDKμ μνΈμμ©νκ² λ©λλ€.
initialUserScripts
μ κ²½μ° μλλ‘μ΄λ νκ²½μμ μΉνμ΄μ§ λ‘λ μ μ νΈμΆλ¨μ 보μ₯λμ§ μμ λ°λμonWebViewCreated
μμ λ°νλcontroller
μμ νμ΄μ§λ₯Ό λ‘λν΄μ£ΌμΈμ.
ν΄λΉ κΈ°λ₯μ μ¬μ©νκΈ° μν΄μλ JavaScript μΉνμ΄μ§μμ λμΌν App SDK ν€λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
(Optional) Webview Wrapper App μ°λ
λ§μ½ ν΅ν΄ μ΄λ²€νΈλ₯Ό Flutter SDKκ° μλ JavaScript SDKλ₯Ό ν΅ν΄ μμ§νκ³ μΆλ€λ©΄ ν΅ν΄ SDKλ₯Ό μ΄κΈ°ν ν λ HackleAppModeλ₯Ό webViewWrapper
λ‘ μ€μ νλ©΄ λ©λλ€.
import "package:hackle/hackle.dart";
import 'package:hackle_platform_interface/model/hackle_app_mode.dart';
HackleConfig config = HackleConfigBuilder()
.hackleAppMode(HackleAppMode.webViewWrappe)
.build();
await HackleApp.initialize(YOUT_APP_SDK_KEY, hackleConfig: config);
Updated 23 days ago