Flutter 플러그인 연동가이드
1. 플러그인 설치 (AOS/IOS 공통 설정)
[플러그인 설치가이드 공식문서] https://pub.dev/packages/dot_sdk/install
2. Android 플러그인 설정
2.1 AuthorizationKey 설정
프로젝트의 app/res/values/strings.xml 파일에 아래 코드를 추가합니다.
CopyXML1<string-array name="dotAuthorizationKey">2 <item name="useMode">1</item>3 <item name="serviceNumber">xxxxx</item>4 <item name="expireDate">14</item>5 <item name="isDebug">false</item>6 <item name="isInstallRetention">true</item>7 <item name="isFingerPrint">true</item>8 <item name="accessToken"></item>9</string-array>
추가한 코드 중 serviceNumber
의 value를 올바른 값으로 변경해야 합니다. 와이즈트래커에 로그인하여 화면 상단의 Service 부분을 선택하면 앱 이름과 함께 올바른 Service Number 가 나타납니다. Service No. 옆의 숫자를 복사하여 serviceNumber
의 value로 입력해주세요.
2.2 Http 통신 허용 설정
프로젝트의 Target API 28 이상일 경우 Http 통신 허용 추가
CopyXML1<!-- AndroidManifest.xml -->2<application3 android:icon="@mipmap/ic_launcher"4 android:label="@string/app_name"5 android:networkSecurityConfig="@xml/network_security_config"6 android:theme="@style/AppTheme">
CopyXML1<!-- app/res/xml/network_security_config.xml -->2<?xml version="1.0" encoding="utf-8"?>3<network-security-config>4 <domain-config cleartextTrafficPermitted="true">5 <domain includeSubdomains="true">trk.analytics.wisetracker.co.kr</domain>6 </domain-config>7</network-security-config>
3. iOS 플러그인 설정
3.1 http 통신 허용 설정
- http통신을 허용하기 위해 info.plist파일에 NSAppTransportSecurity를 아래와 같이 추가합니다
CopyXML1<key>NSAppTransportSecurity</key>2<dict>3 <key>NSAllowsArbitraryLoads</key>4 <true/>5</dict>
3.2 dotAuthorizationKey값 세팅
info.plist 파일에 아래 코드를 추가해 주세요.
CopyXML1<key>dotAuthorizationKey</key>2<dict>3 <key>serviceNumber</key>4 <string>xxxxx</string>5 <key>expireDate</key>6 <string>14</string>7 <key>isDebug</key>8 <string>true</string>9 <key>isInstallRetention</key>10 <string>true</string>11 <key>isFingerPrint</key>12 <string>true</string>13 <key>accessToken</key>14 <string></string>15 <key>useMode</key>16 <string>2</string>17</dict>
추가한 코드 중 serviceNumber
의 value를 올바른 값으로 변경해야 합니다. 와이즈트래커에 로그인하여 화면 상단의 Service 부분을 선택하면 앱 이름과 함께 올바른 Service Number 가 나타납니다. Service No. 옆의 숫자를 복사하여 serviceNumber
의 value로 입력해주세요.
3.3 Pod install 이슈 발생 시
iOS 실행시 Pod install에서 이슈 발생하는 경우 ios/Podfile 내에 use_frameworks! 부분을 아래와 같이 주석처리를 해주세요.
CopyCMD1target 'Runner' do2 # use_frameworks!3 use_modular_headers!45 flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))6end
4. 초기화
최초로 실행되는 Dart 파일에 아래와 같이 초기화 API를 호출합니다. 일반적으로 initState함수에 추가해주시면 됩니다.
CopyDART1void initState() {2 super.initState();3 DOT.initialization();4 }
5. 페이지 분석
고객사 앱에서 페이지 네비게이션으로 RouteObserver Class를 사용하고 있다면 아래와 같이 사용해 주세요.
CopyDART1class Screen2 extends StatelessWidget {2 @override3 Widget build(BuildContext context) {4 //페이지 관련 정보 세팅5 var screen = {};6 screen["pi"] = "DTL";78 DOT.logScreen(screen);91011 return Scaffold(appBar: AppBar(), body: Center(child: Text('Screen 2')));12 }13}1415class Screen3 extends StatelessWidget {16 @override17 Widget build(BuildContext context) {18 //페이지 관련 정보 세팅19 var screen = {};20 screen["pi"] = "DTL";21 screen["event"] = "w_view_product";2223 DOT.logScreen(screen);2425 return Scaffold(appBar: AppBar(), body: Center(child: Text('Screen 3')));26 }27}2829class MyRouteObserver extends RouteObserver<PageRoute<dynamic>> {30 // -------------------31 // 추가32 var screenName = '';33 void _sendScreenView(PageRoute<dynamic> route) {34 var currentScreenName = route.settings.name;35 if (screenName != currentScreenName) {36 print('screenName $screenName --> $currentScreenName ');37 DOT.onStartPage();3839 this.screenName = currentScreenName;40 }41 }42 // ---------4344 @override45 void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {46 super.didPush(route, previousRoute);47 // -------------------48 // ÷추가49 if (route is PageRoute) {50 _sendScreenView(route);51 }52 // ------53 }5455 @override56 void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {57 super.didReplace(newRoute: newRoute, oldRoute: oldRoute);58 // -------------------59 // ÷추가60 if (newRoute is PageRoute) {61 _sendScreenView(newRoute);62 }63 // ------64 }6566 @override67 void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {68 super.didPop(route, previousRoute);69 // -------------------70 // ÷추가71 if (previousRoute is PageRoute && route is PageRoute) {72 _sendScreenView(previousRoute);73 }74 // -------------------75 }