tagworks_sdk_flutter 1.1.3
tagworks_sdk_flutter: ^1.1.3 copied to clipboard
Official Flutter SDK for TagWorks, providing deep linking, event tracking, and user engagement features for Android and iOS.
example/lib/main.dart
import 'dart:developer';
import 'package:app_links/app_links.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:tagworks_sdk_v1_flutter/tagworks_sdk_v1_flutter.dart';
import 'package:webview_flutter/webview_flutter.dart';
// late final GoRouter router;
final DeepLinkHandler deepLinkHandler = DeepLinkHandler();
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
deepLinkHandler.start();
runApp(const MyApp());
}
class DeepLinkHandler {
final _appLinks = AppLinks();
StreamSubscription<Uri>? _sub;
StreamSubscription? _deeplinkSub;
String initialLocation = '/';
void start() {
// 앱 실행 중 들어오는 링크 처리
_sub = _appLinks.uriLinkStream.listen((uri) async {
print('deeplink : ${uri}');
if (defaultTargetPlatform == TargetPlatform.android) {
await _handle(uri);
}
});
// cold start (앱이 완전히 꺼진 상태에서 링크로 실행될 때)
_appLinks.getInitialLink().then((uri) async {
print('deeplink1 : ${uri}');
if (defaultTargetPlatform == TargetPlatform.android) {
if (uri != null) {
await _handle(uri);
} else {
final deferred = await TagWorksDeeplinkPlugin.handleDeferredDeeplink();
if (deferred.isTagWorksDeeplink && deferred.deeplinkURL != null) {
initialLocation = deferred.deeplinkURL!;
print('deeplink deferred : ${initialLocation}');
}
}
}
}).catchError((_) {});
// 딥링크 처리 후 TagWorks로부터 랜딩페이지 파라미터 전달
// iOS에서 랜딩페이지 이동 처리.
_deeplinkSub = TagWorksDeeplinkEvents.stream.listen((event) {
debugPrint("HomePage에서만 딥링크 처리: $event");
});
}
Future<void> _handle(Uri uri) async {
try {
final result = await TagWorksDeeplinkPlugin.handleDeeplinkWithUri(uri.toString());
if (result.isTagWorksDeeplink && result.deeplinkURL != null) {
print('deeplink final: ${result.deeplinkURL}');
}
} catch (e) {
// 예외 발생 시 처리
print('딥링크 처리 중 오류 발생: $e');
}
}
void dispose() {
_sub?.cancel();
_deeplinkSub?.cancel();
}
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _platformVersion = 'Unknown';
String? bannerUrl;
late final WebViewController _controller;
String _messageFromWeb = "";
// StreamSubscription? _sub;
// String? _latestLink;
@override
void initState() {
super.initState();
// 웹뷰 테스트
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
// ..runJavaScript("""
// window.__TAGWORKS_SDK_READY = true;
// """)
..addJavaScriptChannel(
"TagWorksFT_JSInterfaces",
onMessageReceived: (JavaScriptMessage message) {
setState(() {
_messageFromWeb = message.message;
});
print("웹뷰 인터페이스 받은 메시지: ${_messageFromWeb}");
TagWorksPlugin.webInterfaceDidReceive(_messageFromWeb);
},
)
..setNavigationDelegate(
NavigationDelegate(
onPageFinished: (String url) async {
debugPrint("✅ 페이지 로딩 완료: $url");
await _controller.runJavaScript("""
window.__TAGWORKS_SDK_READY = true;
console.log('TAGWORKS SDK Ready');
""");
},
),
)
// ..loadRequest(Uri.parse("https://dxlab.obzen.com/html/bnk/BNK_Main.html"));
// ..loadRequest(Uri.parse("http://192.168.20.53/g5/shop/"));
..loadRequest(Uri.parse("http://192.168.24.185/rshop"));
}
// Flutter로 메시지 보내기
// TagWorksJSInterface.postMessage("Hello from WebView!");
@override
void dispose() {
// _sub?.cancel();
deepLinkHandler.dispose();
super.dispose();
}
// Platform messages are asynchronous, so we initialize in an async method.
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(children: [
Expanded(
child: ElevatedButton(
onPressed: () async {
try {
// await TagWorksPlugin.initializeTagWorks(
// siteId: "165,b1VTZzuL",
// baseUrl: "https://dxlab.obzen.com/tagworks/obzen",
// isUseIntervals: false,
// dispatchInterval: 5,
// sessionTimeOut: 5,
// isManualDispatch: false,
// // "dispatchRetryCount": 3,
// appVersion: "1.5",
// appName: "testapp",
// isUseDynamicParameter: true,
// deeplinkServerUrl: "https://dxlab.obzen.com/ozsmlinkg"
// );
//print('초기화$result');
await TagWorksPlugin.setLogLevel(3);
await TagWorksPlugin.setOptOut(false);
await TagWorksPlugin.setUserId('ny2060');
final visitorId = await TagWorksPlugin.getVisitorId();
print('visitorId : ${visitorId}');
// final siteId = await TagWorksPlugin().getSiteId();
// print('siteId:${siteId}');
if (await TagWorksPlugin.isInitialize() == false) {
// 초기화가 정상적으로 이루어지지 않은 상태
// 예외 처리 코드 추가
print('isInitialize : false');
}
// await TagWorksPlugin.setCommonDimensionWithString(3, '설정정보01');
// await TagWorksPlugin.setCommonDimensionWithString(4, '설정정보02');
// await TagWorksPlugin.setCommonDimensionWithDouble(1, 00.9);
// await TagWorksPlugin.setCommonDimensionWithDouble(11, 3.8888);
await TagWorksPlugin.setDynamicCommonDimensionWithString("사용자행동01", '설정정보01');
await TagWorksPlugin.setDynamicCommonDimensionWithDouble("사용자행동02", 10000.0);
await TagWorksPlugin.setDynamicCommonDimensionWithString("사용자행동03", '설정정보02');
await TagWorksPlugin.setDynamicCommonDimensionWithDouble("사용자행동04", 20000.0);
// final dimensionStrValue = await TagWorksPlugin.getCommonDimensionWithString(3);
// final dimensionNumValue = await TagWorksPlugin.getCommonDimensionWithDouble(11);
// final dim01 = await TagWorksPlugin.getCommonDimensionWithString(3);
// print('공용 General : $dim01');
//
// final dim02 = await TagWorksPlugin.getCommonDimensionWithDouble(11);
// print('공용 Fact : $dim02');
final commonDimensions = await TagWorksPlugin.getCommonDimensions();
print('공용 디멘젼 : $commonDimensions');
final dynamicCommonDimensions = await TagWorksPlugin.getDynamicCommonDimensions();
print('공용 동적 디멘젼 : $dynamicCommonDimensions');
final commonDimensionsOfArray = await TagWorksPlugin.getCommonDimensionsOfArrayIndex();
print('공용 dimensionsOfArray : ${commonDimensionsOfArray}');
final dynamicCommonDimensionsOfArray = await TagWorksPlugin.getDynamicCommonDimensionsOfArrayIndex();
print('공용 동적 dimensionsOfArray : ${dynamicCommonDimensionsOfArray}');
final dim03 = await TagWorksPlugin.getDynamicCommonDimension("사용자행동01");
print('공용 동적 General : $dim03');
await TagWorksPlugin.removeCommonDimensionInGeneralType(3);
await TagWorksPlugin.removeCommonDimensionInFactType(1);
await TagWorksPlugin.removeCommonDimensionWithArrayIndex(1);
print('공통 디멘젼 : ${await TagWorksPlugin.getCommonDimensions()}');
// await TagWorksPlugin.removeAllCommonDimension();
// print('공통:${await TagWorksPlugin.getCommonDimensions()}');
await TagWorksPlugin.setCommonDimensionWithString(4, '통장');
await TagWorksPlugin.setCommonDimensionWithDouble(1, 3333.9);
await TagWorksPlugin.setCommonDimensionWithDouble(11, 99.00);
await TagWorksPlugin.sendReferrerEventWithOpenUrlString("https://www.naver.com");
/**
* dataBundle
*/
await DataBundlePlugin.initialize();
// print(DataBundlePlugin.EVENT_TAG_NAME);
await DataBundlePlugin.putString(DataBundlePlugin.EVENT_TAG_NAME, StandardEvent.PAGE_VIEW);
await DataBundlePlugin.putString(DataBundlePlugin.EVENT_TAG_PARAM_PAGE_PATH, '/페이지경로');
await DataBundlePlugin.putString(DataBundlePlugin.EVENT_TAG_PARAM_TITLE, '페이지타이틀');
await DataBundlePlugin.putString(DataBundlePlugin.EVENT_TAG_PARAM_KEYWORD, '검색어');
await DataBundlePlugin.putString(DataBundlePlugin.EVENT_TAG_PARAM_CUSTOM_PATH, '/커스텀경로');
await DataBundlePlugin.putDimensionWithString(1, "계좌신청");
await DataBundlePlugin.putDimensionWithDouble(2, 0.999);
await DataBundlePlugin.putDynamicDimensionWithString("사용자행동11", "계좌조회");
await DataBundlePlugin.putDynamicDimensionWithDouble("사용자행동22", 998877);
final dimensions = await DataBundlePlugin.getDimensions();
print('개별 : $dimensions ');
final dynamicDimensions = await DataBundlePlugin.getDynamicDimensions();
print('개별 동적 : $dynamicDimensions ');
final arrayDimensions = await DataBundlePlugin.getDimensionsOfArrayIndex();
print('개별 arrayIndex : $arrayDimensions ');
final arrayDynamicDimensions = await DataBundlePlugin.getDynamicDimensionsOfArrayIndex();
print('개별 동적 arrayIndex : $arrayDynamicDimensions ');
final dataBundle = await DataBundlePlugin.getDataBundle();
print('getDataBundle: $dataBundle ');
await DataBundlePlugin.initDataBundle(dataBundle);
final dataBundle2 = await DataBundlePlugin.getDataBundle();
print('getDataBundle2: $dataBundle2 ');
/**
* logEvent
*/
await TagWorksPlugin.logEvent(TagWorksPlugin.EVENT_TYPE_PAGE, dataBundle);
await TagWorksPlugin.logEvent(TagWorksPlugin.EVENT_TYPE_USER_EVENT, dataBundle);
await TagWorksPlugin.saveErrorReport("errorType", "errorMessage");
} catch (e) {
print('Failed to initialize TagWorks: $e');
}
},
child: Text('Initialize TagWorks'),
)),
const SizedBox(height: 16),
// === 새로 추가한 onCMS Popup 버튼 ===
Expanded(
child: ElevatedButton(
onPressed: () async {
try {
await TagWorksPopupPlugin.onCMSPopup(
onCmsUrl: 'https://dxlab.obzen.com/oncms',
rcmdAreaCd: 'POPUP_TEST_AREA',
custId: '',
);
print('onCMS Popup 호출 성공');
} catch (e) {
print('onCMS Popup 호출 실패: $e');
}
},
child: const Text('Show CMS Popup'),
)),
Expanded(
child: ElevatedButton(
onPressed: () async {
// JavaScript 실행
await _controller.runJavaScript("""
if (window.__TAGWORKS_SDK_READY) {
window.TagWorksFT_JSInterfaces.postMessage("ABV");
}
""");
},
child: const Text('JSInterface Test'),
)),
]),
const SizedBox(height: 24),
Text('CMS Banner', style: TextStyle(fontWeight: FontWeight.bold)),
SizedBox(
height: 200, // ★ 꼭 사이즈를 주세요(없으면 0으로 안 보임)
width: double.infinity,
child: OnCmsBannerWidget(
onCmsUrl: 'https://dxlab.obzen.com/oncms',
rcmdAreaCd: 'BANNER_OBZ_AREA',
custId: '', // 필요 없으면 null
//defaultImage: 'ic_banner_placeholder', // drawable에 넣어둔 이름
defaultImage: 'default_image',
),
),
// webview 테스트
const SizedBox(height: 4),
// WebView
const Text('WebView', style: TextStyle(fontWeight: FontWeight.bold)),
SizedBox(
height: 500, // 웹뷰 화면 높이 지정
child: WebViewWidget(controller: _controller),
),
],
),
),
),
);
}
}