Flutter
Flutter Plugin 기본 설명
해당 문서는 플러그인 방식을 사용하여 Flutter 개발 환경에서 기존 SDK 적용 방식보다 더 간편하게 적용하는 방법을 제공하기 위해 작성되었습니다.
iOS 요구 사항
- Xcode 15.X 이상
- AppGuard for iOS SDK v1.10.2.1 이상
- AppGuard for Flutter Plugin v0.0.1 이상
- Objective-C, Swift 호환
- Cocopods 설치
Flutter Plug-in(iOS) 구성 설명
nProtect AppGuard에서 제공하는 Flutter AppGuard SDK Plugin 압축파일 AppGuardFlutterPlugin.zip은 다음과 같은 파일들로 구성되어 있습니다.
flutter_appguard_sdk/ 하위 폴더 구성:
| 구성 폴더 및 파일명 | 설명 |
|---|---|
/lib/flutter_appguard_sdk_method_channel.dart | 네이티브 플랫폼과 통신하기 위해 메서드 채널을 활용하는 AppGuard SDK의 Flutter 플랫폼 구현 파일입니다. 네이티브 메서드 호출을 처리하는 nativeMethodCallback 메서드를 포함합니다. |
/lib/flutter_appguard_sdk_platform_interface.dart | 각 플랫폼별로 구현되어야 하는 AppGuard SDK 플랫폼 인터페이스가 정의된 파일입니다. |
/lib/flutter_appguard_sdk.dart | 플랫폼 인터페이스를 통해 AppGuard SDK와 상호작용할 수 있는 편리한 메서드를 제공하는 클래스를 정의한 파일입니다. 이 클래스를 사용하여 AppGuard SDK와 간편하게 상호작용할 수 있습니다. |
/ios/Classes/Objc/FlutterAppGuardSdkPlugin.h, /ios/Classes/Objc/FlutterAppGuardSdkPlugin..m | Flutter MethodChannel을 통해 Dart와 Objective-C 언어를 통신하여, Dart에서 호출된 메서드명에 따라 AppGuard 기능을 수행하는 파일입니다. |
/ios/Classes/Swift/AppGuardWrapper.h, /ios/Classes/Swift/AppGuardWrapper..m, /ios/Classes/Swift/AppGuardWrapper..swift | Flutter MethodChannel을 통해 Dart와 Swift 언어를 통신하여, Dart에서 호출된 메서드명에 따라 AppGuard 기능을 수행하는 파일입니다. |
flutter_appguard_sdk.dart 의 기본 설명
Get 메서드
| 메서드 | 설명 |
|---|---|
Future<String?> getAGID() | 보안 정책 위반 탐지 시 로그 서버로 전송한 사용자 식별자 값을 얻을 수 있습니다. |
Set 메서드
| 메서드 | 설명 |
|---|---|
Future<void> setUserID(String? userId) | 보안 정책 위반 탐지 시 로그 서버로 전송할 사용자 식별자(UserID)를 설정합니다. |
Future<void> setUniqueClientID(String? clientId, int retryTimeout) | 서버 인증에 사용할 세션 유일 식별자를 설정합니다. |
Future<void> setReserved1(int value, int option) | 원하는 옵션을 설정하여 Customer Macro 기능을 재시작할 수 있는 메서드입니다. |
Future<void> setS2AuthTryCallbackMethod(S2AuthCallback callback) | AppGuard 서버 인증 관련 이벤트를 수신하는 Callback 메서드입니다. 서버 인증이 진행되면 AppGuard가 해당 메서드를 호출하며, 상태 정보에 따라 설정할 수 있습니다. |
Future<void> setViolationCallbackMethod(ViolationCallback callback) | AppGuard 보안 정책 위반 탐지 관련 이벤트를 수신하는 Callback 메서드입니다. 보안 정책 위반 시 AppGuard가 해당 메서드를 호출하며, 상태 정보에 따라 설정할 수 있습니다. |
위 내용은 flutter_appguard_sdk/lib/ 폴더 내 flutter_appguard_sdk.dart 파일에서 확인할 수 있습니다.
Flutter Project 적용 사항
AppGuard for Flutter Plugin 다운로드 및 설정
AppGuard for Flutter Plugin v0.0.1 이상을 설치하고, Unity에서 프로젝트를 구성하는 방법은 다음과 같습니다.
-
AppGuard 매니저 서버에 접속하여 Download > Flutter Plugins 를 선택하여 최신 버전을 다운로드합니다.
-
다운로드한
AppGuard Plugin for Flutter v0.0.x.zip파일을 압축해제하면 내부에flutter_appguard_sdk폴더가 있습니다. -
이
flutter_appguard_sdk폴더를 Flutter Project/ 경로 내로 복사합니다.
flutter_appguard_sdk/ 폴더 내 example/ 폴더는 plugin 테스트용 앱이므로 참고용으로만 사용하시고, 삭제 후 적용하는 것을 권장합니다.
AppGuard Config 파일 다운로드 및 설정
-
AppGuard 매니저 서버에 접속하여 Applying Security > 다운로드 > CHAPTER 2. nProtect AppGuard CONFIG 파일 다운로드 > CONFIG FILE DOWNLOAD 를 선택하여 Config 파일을 다운로드합니다.
-
다운로드한 Config 파일을 압축 해제하면
appguard,appguard.crt,appguard.mf,appguard1060004개의 파일이 생성됩니다. -
이 파일들을 아래 경로로 복사합니다.
복사 경로 : Flutter Project/flutter_appguard_sdk/ios/
AppGuard SDK 적용
-
다운로드한
AppGuardCore.xcframework파일을 다음 경로로 복사합니다.복사 경로 : Flutter Project/flutter_appguard_sdk/ios/
-
Flutter Project/ 내
pubspec.yaml파일을 열고 아래와 같이 코드를 추가합니다.pubspec.yamldependencies:
flutter:
sdk: flutter
flutter_appguard_sdk: # --- 추가
path: './flutter_appguard_sdk' # --- 추가 -
코드 추가 후 저장합니다.
pubspec.yaml 파일에 코드를 추가하고 저장하면, Flutter Project/ios/ 내에 Podfile이 생성됩니다.
AppGuard Build를 위한 Podfile 설정
Flutter Project/ios/ 내 PodFile 파일에 아래 코드를 추가합니다.
PodFile 파일 내 추가할 전체 코드 보기
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
# --- 추가
# 1 : Target 'Runner' 검색
runner_target = find_runner_target(installer)
# AppGuard 설정
if runner_target
# 2 : Only Swift : Allow Non-modular Includes in Framework Modules 설정
set_non_modular_includes(runner_target)
# 3 : Other Linker Flags 설정
set_other_linker_flags(runner_target)
# 4 : AppGuard Config 파일 설정 : Copy Bundle Resources에 추가
return unless add_appguard_config_files(runner_target)
else
puts "Error: Pod project 'Runner' not found"
end
# --- 추가
end
# --- 추가
# 1 : Target 'Runner' 검색 함수
def find_runner_target(installer)
runner_target = nil
installer.aggregate_targets.each do |aggregate_target|
aggregate_target.user_project.targets.each do |target|
if target.name == 'Runner'
runner_target = target
break
end
end
break if runner_target
end
runner_target
end
# 2 : Swift 전용 : Allow Non-modular Includes in Framework Modules 설정
def set_non_modular_includes(target)
if File.exist?(File.join(target.project.path, '../Runner', 'AppDelegate.swift'))
target.build_configurations.each do |config|
config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
end
target.project.save
end
end
# 3 : Other Linker Flags 설정
def set_other_linker_flags(target)
target.build_configurations.each do |config|
flags = config.build_settings['OTHER_LDFLAGS'] || ''
flags_array = flags.is_a?(Array) ? flags : flags.split(' ')
flags_array << '$(inherited)' unless flags_array.include?('$(inherited)')
flags_array << '-ObjC' unless flags_array.include?('-ObjC')
flags_array << '-l"flutter_appguard_sdk"' unless flags_array.include?('-l"flutter_appguard_sdk"')
flags_array << '-framework' unless flags_array.include?('-framework')
flags_array << '"AppGuardCore"' unless flags_array.include?('"AppGuardCore"')
flags_array << '-lstdc++' unless flags_array.include?('-lstdc++')
flags_array << '-lz' unless flags_array.include?('-lz')
config.build_settings['OTHER_LDFLAGS'] = flags_array.join(' ')
end
target.project.save
end
# 4 : AppGuard Config 파일 설정 : Copy Bundle Resources에 추가
def add_appguard_config_files(runner_target)
appguard_files = [
"appguard",
"appguard.mf",
"appguard.crt",
"appguard106000"
]
appguard_files.each do |file|
copy_bundle_resources_file_path = File.join("../flutter_appguard_sdk/ios/", file)
target_project_file_path = File.expand_path("../flutter_appguard_sdk/ios/#{file}", __dir__)
if File.exist?(copy_bundle_resources_file_path) && File.exist?(target_project_file_path)
group = runner_target.project.main_group
target_project_file_ref = group.files.find { |ref| ref.real_path.to_s == target_project_file_path }
if target_project_file_ref
group.remove_reference(target_project_file_ref)
puts "Existing [Target:Runner] reference for #{File.basename(file)} removed"
end
copy_bundle_resources_ref = runner_target.resources_build_phase.files_references.find { |ref| ref.path == copy_bundle_resources_file_path }
if copy_bundle_resources_ref
runner_target.resources_build_phase.remove_file_reference(copy_bundle_resources_ref)
puts "Existing [Copy Bundle Resources] reference for #{File.basename(file)} removed"
end
file_ref = runner_target.project.new_file(copy_bundle_resources_file_path)
runner_target.resources_build_phase.add_file_reference(file_ref)
else
puts "Error : AppGuard Config File(#{File.basename(file)}) path not found"
return false
end
end
true
end
PodFile 파일 내 추가할 코드 설명
-
TARGET:Runner 검색: Flutter 앱 내 빌드 설정을 위해 TARGET:Runner를 검색합니다.
PodFile파일 내 TARGET:Runner 검색 코드 보기PodFilepost_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
# --- 추가
# 1 : Target 'Runner' 검색
runner_target = find_runner_target(installer)
# AppGuard 설정
if runner_target
else
puts "Error: Pod project 'Runner' not found"
end
# --- 추가
end
# 1 : Target 'Runner' 검색 함수
def find_runner_target(installer)
runner_target = nil
installer.aggregate_targets.each do |aggregate_target|
aggregate_target.user_project.targets.each do |target|
if target.name == 'Runner'
runner_target = target
break
end
end
break if runner_target
end
runner_target
end -
모듈화되지 않은(non-modular) 헤더 파일 설정: Runner 앱 내 Xcode에서 모듈화되지 않은 헤더 파일을 프레임워크 모듈에서 사용할 수 있도록 설정합니다.
caution이 항목은 Swift 플랫폼에만 해당됩니다.
Runner Project > TARGET:Runner > Build Settings > Apple Clang - Language - Modules > Allow Non-modular Includes in Framework Modules 옵션을 [YES] 로 설정합니다.
TARGET:Runner 내 [Allow Non-modular Includes in Framework Modules] 설정 코드 보기
PodFilepost_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
# 1 : Target 'Runner' 검색
runner_target = find_runner_target(installer)
# AppGuard 설정
if runner_target
# --- 추가
# 2 : Only Swift : Allow Non-modular Includes in Framework Modules 설정
set_non_modular_includes(runner_target)
# --- 추가
else
puts "Error: Pod project 'Runner' not found"
end
end
# 2.Only Swift : Allow Non-modular Includes in Framework Modules 설정
def set_non_modular_includes(target)
if File.exist?(File.join(target.project.path, '../Runner', 'AppDelegate.swift'))
target.build_configurations.each do |config|
config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
end
target.project.save
end
end -
Other Linker Flags 설정: Runner 앱 내 Other Linker Flags 옵션에
-lstdc++와-lz를 추가합니다.Runner Project > TARGET:Runner > Build Settings > Linking - General > Other Linker Flags 옵션에
-lstdc++와-lz가 추가된 것을 확인합니다.TARGET:Runner 내 [Other Linker Flags] 설정 코드 보기
PodFilepost_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
# 1 : Target 'Runner' 검색
runner_target = find_runner_target(installer)
# AppGuard 설정
if runner_target
# 2 : Only Swift : Allow Non-modular Includes in Framework Modules 설정
set_non_modular_includes(runner_target)
# --- 추가
# 3 : Other Linker Flags 설정
set_other_linker_flags(runner_target)
# --- 추가
else
puts "Error: Pod project 'Runner' not found"
end
end
# 3 : Other Linker Flags 설정 함수
def set_other_linker_flags(target)
target.build_configurations.each do |config|
flags = config.build_settings['OTHER_LDFLAGS'] || ''
flags_array = flags.is_a?(Array) ? flags : flags.split(' ')
flags_array << '$(inherited)' unless flags_array.include?('$(inherited)')
flags_array << '-lstdc++' unless flags_array.include?('-lstdc++')
flags_array << '-lz' unless flags_array.include?('-lz')
config.build_settings['OTHER_LDFLAGS'] = flags_array.join(' ')
end
target.project.save
end -
AppGuard Config 파일 설정: Runner 앱 내 Copy Bundle Resources 옵션에 Flutter Project/flutter_appguard_sdk/ios/ 경로에 있는 AppGuard 환경 파일(
appguard,appguard.mf,appguard.crt,appguard106000)을 추가합니다.Runner Project > TARGET:Runner > Build Phases > Copy Bundle Resources 에 AppGuard 환경 파일들이 추가된 것을 확인합니다.
TARGET:Runner 내 [Copy Bundle Resources] 설정 코드 보기
PodFilepost_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
# 1 : Target 'Runner' 검색
runner_target = find_runner_target(installer)
# AppGuard 설정
if runner_target
# 2 : Only Swift : Allow Non-modular Includes in Framework Modules 설정
set_non_modular_includes(runner_target)
# 3 : Other Linker Flags 설정
set_other_linker_flags(runner_target)
# --- 추가
# 4 : AppGuard Config 파일 설정 : Copy Bundle Resources에 추가
return unless add_appguard_config_files(runner_target)
# --- 추가
else
puts "Error: Pod project 'Runner' not found"
end
end
# 4 : AppGuard Config 파일 설정 함수 : Copy Bundle Resources에 추가
def add_appguard_config_files(runner_target)
appguard_files = [
"appguard",
"appguard.mf",
"appguard.crt",
"appguard106000"
]
appguard_files.each do |file|
copy_bundle_resources_file_path = File.join("../flutter_appguard_sdk/ios/", file)
target_project_file_path = File.expand_path("../flutter_appguard_sdk/ios/#{file}", __dir__)
if File.exist?(copy_bundle_resources_file_path) && File.exist?(target_project_file_path)
group = runner_target.project.main_group
target_project_file_ref = group.files.find { |ref| ref.real_path.to_s == target_project_file_path }
if target_project_file_ref
group.remove_reference(target_project_file_ref)
puts "Existing [Target:Runner] reference for #{File.basename(file)} removed"
end
copy_bundle_resources_ref = runner_target.resources_build_phase.files_references.find { |ref| ref.path == copy_bundle_resources_file_path }
if copy_bundle_resources_ref
runner_target.resources_build_phase.remove_file_reference(copy_bundle_resources_ref)
puts "Existing [Copy Bundle Resources] reference for #{File.basename(file)} removed"
end
file_ref = runner_target.project.new_file(copy_bundle_resources_file_path)
runner_target.resources_build_phase.add_file_reference(file_ref)
else
puts "Error : AppGuard Config File(#{File.basename(file)}) path not found"
return false
end
end
true
end
AppGuard Flutter Plugin은 AppGuardCore.xcframework 내 arm64 아키텍처의 AppGuardCore.framework가 Do Not Embed 설정으로 프로젝트에 링크되고 빌드됩니다.
여기까지 적용 가이드의 [5]번 사항까지 완료하셨다면, Flutter 앱을 실행할 수 있습니다.
ios $ pod install
ios $ flutter run
앱이 정상적으로 실행된다면, AppGuard SDK가 정상적으로 적용된 것입니다. 다음으로 [main.dart 내 AppGuard 메서드 적용] 단계를 진행합니다.
AppGuard SDK Privacy Manifests 적용
AppGuard SDK Privacy Manifests 적용을 위해서는 AppGuard SDK v1.10.2.1 버전 이상을 사용해야 합니다. AppGuard SDK v1.10.2.1 버전 이상은 Apple의 Privacy Manifest 요구에 맞게 빌드 및 배포되므로 별도의 병합 작업이 필요하지 않습니다.
[Apple & Creating a static framework]
Apple의 요구사항에 맞게 AppGuard for iOS SDK v1.10.2.1 버전 이상은 static framework로 제작되었으며, AppGuardCore.xcframework 명칭으로 배포됩니다.
Apple & Creating a static framework 참고 링크: Apple & Creating a static framework
AppGuard for iOS SDK v1.10.2.1 버전 이상에서는 Apple이 요구한 Privacy Manifest에서 명시한 Required reason API 항목 중 NSPrivacyAccessedAPICategoryUserDefaults 외의 다른 API는 사용하지 않습니다.
main.dart 내 AppGuard 메서드 적용
flutter_appguard_sdk 패키지 적용
아래 예제 코드처럼 flutter_appguard_sdk 패키지를 main.dart 내에 추가하여 적용할 수 있습니다.
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';
사용자 식별자(AGID) 값 획득
아래 예제 코드처럼 AppGuard 보안 정책 위반 탐지 시 로그 서버로 전송된 사용자 식별자(AGID) 값을 String 형태로 획득할 수 있습니다.
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';
// ...
class _MyAppState extends State<MyApp> {
String appguardIDResult;
final _flutterAppguardSdk = FlutterAppGuardSdk();
void initState() {
super.initState();
initPlatformState();
});
Future<void> initPlatformState() async {
print("[main.dart]initPlatformState Start");
String appguardIDResult;
try {
print("[main.dart]getAGID Start");
appguardIDResult = await _flutterAppguardSdk.getAGID() ?? "Unknown AppGuard ID";
} on PlatformException {
appguardIDResult = 'Failed';
}
if (!mounted) return;
setState(() {
_platformAppGuardID = appguardIDResult;
print("[main.dart]_platformAppGuardID = $_platformAppGuardID");
});
}
Widget build(BuildContext context) {
return MaterialApp(
//...
);
}
}
사용자 식별자(UserID) 설정
아래 예제 코드처럼 보안 정책 위반 탐지 시 로그 서버로 전송될 사용자 식별자(UserID)를 설정할 수 있습니다.
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';
// ...
class _MyAppState extends State<MyApp> {
String _platformSetUserID = "Unknown";
final _flutterAppguardSdk = FlutterAppGuardSdk();
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
print("[main.dart]initPlatformState Start");
String setUserIdResult;
try {
print("[main.dart]setUsedID Start");
String userId = "flutter_User_Test";
setUserIdResult = await _flutterAppguardSdk.setUsedID(userId) ?? "Unknown SetUserID";
} on PlatformException {
setUserIdResult = 'Failed';
}
if (!mounted) return;
setState(() {
_platformSetUserID = setUserIdResult;
print("[main.dart]_platformSetUserID = $_platformAppGuardID");
});
}
Widget build(BuildContext context) {
return MaterialApp(
//...
);
}
}
AppGuard의 추가 기능 설정
AppGuard의 추가 기능 설정은 value와 option 매개변수를 통해 원하는 설정을 적용할 수 있습니다.
setReserved1 value 설명
setReserved1 value 설명 표
| 항목 | 옵션 | 설명 |
|---|---|---|
| 0x10000000 | 0 | custom macro 재시작 |
| 0x20000000 | 1 | proxy 사용 유무 |
| 0x30000000 | 0,1,2 | 사용할 서버 인증의 국가 구분 값 0:KR / 1:JP / 2:CN |
아래 예제 코드처럼 항목 값 및 옵션 값을 통해 setReserved1 메서드를 사용할 수 있습니다.
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';
// ...
class _MyAppState extends State<MyApp> {
String _platformReserved1 = "Unknown";
final _flutterAppguardSdk = FlutterAppGuardSdk();
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
print("[main.dart]initPlatformState Start");
String reserved1Result;
try {
print("[main.dart]setReserved1 Start");
await _flutterAppguardSdk.setReserved1(0x10000000, 0);
reserved1Result = 'Success';
} on PlatformException {
reserved1Result = 'Failed';
}
if (!mounted) return;
setState(() {
_platformReserved1 = reserved1Result;
print("[main.dart]_platformReserved1 = $_platformReserved1");
});
}
Widget build(BuildContext context) {
return MaterialApp(
//...
);
}
}
AppGuard 정책 위반 탐지 결과 설정
AppGuard 정책 위반 탐지 결과에 따라 설정 및 탐지 내용을 확인할 수 있습니다.
setViolationCallback value 값 설명
setViolationCallback value 값 설명 표
| 정책 위반 탐지 값(p0) | code | desc | 설명 |
|---|---|---|---|
0 | DETECT_IOS_NOTHING | Detected Hash | 정책 탐지되지 않았습니다. |
2 | DETECT_IOS_INVALID_EXECUTION_FILE | Detected Hash | 원본 실행 파일의 변조가 탐지되었습니다. |
5 | DETECT_IOS_INVALID_LOADED_EXECUTION_CODES | Invalid Code Hash | 실행 중 코드 변조가 탐지되었습니다. |
6 | DETECT_IOS_CORE_SYSTEM_LIBRARY | Detected File | 시스템 라이브러리 변조가 탐지되었습니다. |
11 | DETECT_IOS_DEBUGGING | Detected Debugger | 디버거가 탐지되었습니다. |
14 | DETECT_IOS_REMOTE_CODE_INJECTING | Detected MOD | MOD 툴이 탐지되었습니다. |
21 | DETECT_IOS_RUNNING_BAD_APPLICATION | Detected HackTool | 핵툴이 탐지되었습니다. |
27 | DETECT_IOS_LOCAL_FILE_INTEGRITY | Detected File | 변조된 파일이 탐지되었습니다. |
28 | DETECT_IOS_MACRO | Detected HackTool | 매크로 툴이 탐지되었습니다. |
30 | DETECT_IOS_BUNDLE_NAME_INTEGRTIY | Detected File | 변조된 번들이름이 탐지되었습니다. |
33 | DETECT_IOS_INSTALLED_BAD_APPLICATION | Detected HackTool | 핵툴이 탐지되었습니다. |
34 | DETECT_IOS_JAILBREAK_ENVIRONMENT | Detected Jailbreak | 탈옥 환경이 탐지되었습니다. |
37 | DETECT_IOS_INVALID_IPA_PACKAGE | Detected Modified file | IPA 파일에서 변조된 파일이 탐지되었습니다. |
38 | DETECT_IOS_DEVELOPMENT_BUILD | Development Build App | 개발자 빌드로 실행이 탐지되었습니다. |
Android와 iOS 분기 처리
AppGuard 정책 위반 탐지 값은 Android와 iOS에서 동일하지 않으므로, 각 플랫폼에 따라 분기 처리를 해야 합니다.
아래 예제 코드처럼 foundation.defaultTargetPlatform을 사용하여 Android와 iOS 플랫폼을 분기 처리할 수 있습니다.
import 'package:flutter/foundation.dart' as foundation;
if (foundation.defaultTargetPlatform == foundation.TargetPlatform.android) {
// Android ViolationCallBack Log Add.
} else if (foundation.defaultTargetPlatform == foundation.TargetPlatform.iOS) {
// iOS ViolationCallBack Log Add.
}
아래 예제 코드처럼 setViolationCallback 메서드를 통해 AppGuard 정책 위반 탐지를 확인할 수 있습니다.
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';
import 'package:flutter/foundation.dart' as foundation;
// ...
class _MyAppState extends State<MyApp> {
final _flutterAppguardSdk = FlutterAppGuardSdk();
void initState() {
super.initState();
initPlatformState();
// ※주의※ 실제 서비스 릴리즈 시 샘플에 포함된 "print("-Debug Message-")" 코드를 반드시 제거해 주시기 바랍니다.
_flutterAppguardSdk.setViolationCallback((p0) {
if (foundation.defaultTargetPlatform == foundation.TargetPlatform.android) {
// Android ViolationCallBack Log Add.
ViolationCallBackResult_Android(p0);
} else if (foundation.defaultTargetPlatform == foundation.TargetPlatform.iOS) {
// iOS ViolationCallBack Log Add.
ViolationCallBackResult_iOS(p0);
}
});
void ViolationCallBackResult_Android(int violationValue) {
// Android ViolationCallBack Log Add.
}
// ※주의※ 실제 서비스 릴리즈 시 샘플에 포함된 "print("-Debug Message-")" 코드를 반드시 제거해 주시기 바랍니다.
void ViolationCallBackResult_iOS(int violationValue) {
switch(violationValue) {
case 0:
print("[main.dart] Violation Result : DETECT_IOS_NOTHING($violationValue)");
break;
case 2:
print("[main.dart] Violation Result : DETECT_IOS_INVALID_EXECUTION_FILE($violationValue)");
break;
// ...
case 38:
print("[main.dart] Violation Result : DETECT_IOS_DEVELOPMENT_BUILD($violationValue)");
break;
default:
print("[main.dart] Violation Result : ERROR: Violation Value($violationValue)");
break;
}
}
}
// ...
}
실제 서비스 릴리즈 시 샘플에 포함된 print(“-Debug Message-”) 코드를 반드시 제거해 주시기 바랍니다.
AppGuard 서버 인증 적용(선택)
이 내용은 서버 인증을 사용하는 경우에만 해당되며, 서버 인증을 사용하지 않는 경우 이 부분은 적용할 필요가 없습니다.
AppGuard 서버 인증 상태 결과에 따른 설정
AppGuard 서버 인증 상태 결과의 인자 값(code, desc)을 통해 서버 인증 결과에 따른 설정을 할 수 있습니다.
서버 인증 통지 결과 설명
서버 인증 통지 결과 설명 표
| 서버 인증 진행 상태 값(p0) | 결과 값 | 설명(p1) | 설명 |
|---|---|---|---|
| 0x0001 | APPGUARD_TYPE_CSAUTH_SUCESS | ClientId | 서버 인증이 성공했습니다. |
| 0x0002 | APPGUARD_TYPE_CSAUTH_RETRY | N/A | 서버 인증 작업이 진행 중입니다. |
| 0x0003 | APPGUARD_TYPE_CSAUTH_FALSE | N/A | 서버 인증 작업이 실패했습니다. |
아래 예제 코드처럼 setS2AuthTryCallbackMethod 메서드를 통해 AppGuard 서버 인증 상태 결과를 확인할 수 있습니다.
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';
import 'package:flutter/foundation.dart' as foundation;
// ...
class _MyAppState extends State<MyApp> {
final _flutterAppguardSdk = FlutterAppGuardSdk();
void initState() {
super.initState();
initPlatformState();
// ※주의※ 실제 서비스 릴리즈 시 샘플에 포함된 "print("-Debug Message-")" 코드를 반드시 제거해 주시기 바랍니다.
_flutterAppguardSdk.setS2AuthTryCallbackMethod((p0, p1) {
if(p0 == 0x0001) {
print("[main.dart] S2Auth Result : SUCCESS($p0), $p1");
} else if(p0 == 0x0002) {
print("[main.dart] S2Auth Result : RETRY($p0), $p1");
} else if(p0 == 0x0003) {
print("[main.dart] S2Auth Result : FALSE($p0), $p1");
}
});
}
// ...
}
실제 서비스 릴리즈 시 샘플에 포함된 print(“-Debug Message-”) 코드를 반드시 제거해 주시기 바랍니다.
서버 인증 시작
클라이언트에서 서버 인증을 시작하려면, 서버에서 수신한 해당 사용자의 세션에 대한 Unique Client ID를 아래 예제 코드처럼 설정해야 합니다.
아래 예제 코드처럼 setUniqueClientID 메서드를 사용하여 clientId와 retryTimeout 매개변수를 전달해 AppGuard 서버 인증에 사용할 세션 유일 식별자를 설정할 수 있습니다.
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';
// ...
class _MyAppState extends State<MyApp> {
String _platformUniqueClientID = "Unknown";
final _flutterAppguardSdk = FlutterAppGuardSdk();
void initState() {
super.initState();
initPlatformState();
});
Future<void> initPlatformState() async {
print("[main.dart]initPlatformState Start");
String uniqueClientIDResult;
try {
print("[main.dart]setUniqueClientID Start");
await _flutterAppguardSdk.setUniqueClientID("Formatted-Unique-Client-Id", 180);
uniqueClientIDResult = 'Success';
} on PlatformException {
uniqueClientIDResult = 'Failed';
}
if (!mounted) return;
setState(() {
_platformUniqueClientID = uniqueClientIDResult;
print("[main.dart]_platformUniqueClientID = $_platformUniqueClientID");
});
}
Widget build(BuildContext context) {
return MaterialApp(
//...
);
}
}
setUniqueClientId() 함수의 첫 번째 인자로 주어진 Formatted-Unique-Client-Id의 규칙 및 생성 방법은 [주요 API]를 참고해 주시기 바랍니다.