跳到主要内容
版本:Next

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..mFlutter MethodChannel을 통해 Dart와 Objective-C 언어를 통신하여, Dart에서 호출된 메서드명에 따라 AppGuard 기능을 수행하는 파일입니다.
/ios/Classes/Swift/AppGuardWrapper.h, /ios/Classes/Swift/AppGuardWrapper..m, /ios/Classes/Swift/AppGuardWrapper..swiftFlutter 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에서 프로젝트를 구성하는 방법은 다음과 같습니다.

  1. AppGuard 매니저 서버에 접속하여 Download > Flutter Plugins 를 선택하여 최신 버전을 다운로드합니다.

  2. 다운로드한 AppGuard Plugin for Flutter v0.0.x.zip 파일을 압축해제하면 내부에 flutter_appguard_sdk 폴더가 있습니다.

  3. flutter_appguard_sdk 폴더를 Flutter Project/ 경로 내로 복사합니다.

信息

flutter_appguard_sdk/ 폴더 내 example/ 폴더는 plugin 테스트용 앱이므로 참고용으로만 사용하시고, 삭제 후 적용하는 것을 권장합니다.


AppGuard Config 파일 다운로드 및 설정

  1. AppGuard 매니저 서버에 접속하여 Applying Security > 다운로드 > CHAPTER 2. nProtect AppGuard CONFIG 파일 다운로드 > CONFIG FILE DOWNLOAD 를 선택하여 Config 파일을 다운로드합니다.

  2. 다운로드한 Config 파일을 압축 해제하면 appguard, appguard.crt, appguard.mf, appguard106000 4개의 파일이 생성됩니다.

  3. 이 파일들을 아래 경로로 복사합니다.

    복사 경로 : Flutter Project/flutter_appguard_sdk/ios/


AppGuard SDK 적용

  1. 다운로드한 AppGuardCore.xcframework 파일을 다음 경로로 복사합니다.

    복사 경로 : Flutter Project/flutter_appguard_sdk/ios/

  2. Flutter Project/pubspec.yaml 파일을 열고 아래와 같이 코드를 추가합니다.

    pubspec.yaml
    dependencies:
    flutter:
    sdk: flutter
    flutter_appguard_sdk: # --- 추가
    path: './flutter_appguard_sdk' # --- 추가
  3. 코드 추가 후 저장합니다.

提示

pubspec.yaml 파일에 코드를 추가하고 저장하면, Flutter Project/ios/ 내에 Podfile이 생성됩니다.


AppGuard Build를 위한 Podfile 설정

Flutter Project/ios/ 내 PodFile 파일에 아래 코드를 추가합니다.

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 파일 내 추가할 코드 설명

  1. TARGET:Runner 검색: Flutter 앱 내 빌드 설정을 위해 TARGET:Runner를 검색합니다.

    PodFile 파일 내 TARGET:Runner 검색 코드 보기
    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

    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. 모듈화되지 않은(non-modular) 헤더 파일 설정: Runner 앱 내 Xcode에서 모듈화되지 않은 헤더 파일을 프레임워크 모듈에서 사용할 수 있도록 설정합니다.

    警告

    이 항목은 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] 설정 코드 보기
    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)
    # --- 추가
    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
  3. 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] 설정 코드 보기
    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)
    # --- 추가
    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
  4. 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] 설정 코드 보기
    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

    # 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.frameworkDo Not Embed 설정으로 프로젝트에 링크되고 빌드됩니다.

信息

여기까지 적용 가이드의 [5]번 사항까지 완료하셨다면, Flutter 앱을 실행할 수 있습니다.

terminal
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 내에 추가하여 적용할 수 있습니다.

main.dart
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_appguard_sdk/flutter_appguard_sdk.dart';

사용자 식별자(AGID) 값 획득

아래 예제 코드처럼 AppGuard 보안 정책 위반 탐지 시 로그 서버로 전송된 사용자 식별자(AGID) 값을 String 형태로 획득할 수 있습니다.

main.dart
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)를 설정할 수 있습니다.

main.dart
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의 추가 기능 설정은 valueoption 매개변수를 통해 원하는 설정을 적용할 수 있습니다.

setReserved1 value 설명

setReserved1 value 설명 표
항목옵션설명
0x100000000custom macro 재시작
0x200000001proxy 사용 유무
0x300000000,1,2사용할 서버 인증의 국가 구분 값
0:KR / 1:JP / 2:CN

아래 예제 코드처럼 항목 값 및 옵션 값을 통해 setReserved1 메서드를 사용할 수 있습니다.

main.dart
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)codedesc설명
0DETECT_IOS_NOTHINGDetected Hash정책 탐지되지 않았습니다.
2DETECT_IOS_INVALID_EXECUTION_FILEDetected Hash원본 실행 파일의 변조가 탐지되었습니다.
5DETECT_IOS_INVALID_LOADED_EXECUTION_CODESInvalid Code Hash실행 중 코드 변조가 탐지되었습니다.
6DETECT_IOS_CORE_SYSTEM_LIBRARYDetected File시스템 라이브러리 변조가 탐지되었습니다.
11DETECT_IOS_DEBUGGINGDetected Debugger디버거가 탐지되었습니다.
14DETECT_IOS_REMOTE_CODE_INJECTINGDetected MODMOD 툴이 탐지되었습니다.
21DETECT_IOS_RUNNING_BAD_APPLICATIONDetected HackTool핵툴이 탐지되었습니다.
27DETECT_IOS_LOCAL_FILE_INTEGRITYDetected File변조된 파일이 탐지되었습니다.
28DETECT_IOS_MACRODetected HackTool매크로 툴이 탐지되었습니다.
30DETECT_IOS_BUNDLE_NAME_INTEGRTIYDetected File변조된 번들이름이 탐지되었습니다.
33DETECT_IOS_INSTALLED_BAD_APPLICATIONDetected HackTool핵툴이 탐지되었습니다.
34DETECT_IOS_JAILBREAK_ENVIRONMENTDetected Jailbreak탈옥 환경이 탐지되었습니다.
37DETECT_IOS_INVALID_IPA_PACKAGEDetected Modified fileIPA 파일에서 변조된 파일이 탐지되었습니다.
38DETECT_IOS_DEVELOPMENT_BUILDDevelopment Build App개발자 빌드로 실행이 탐지되었습니다.

Android와 iOS 분기 처리

AppGuard 정책 위반 탐지 값은 Android와 iOS에서 동일하지 않으므로, 각 플랫폼에 따라 분기 처리를 해야 합니다.

아래 예제 코드처럼 foundation.defaultTargetPlatform을 사용하여 Android와 iOS 플랫폼을 분기 처리할 수 있습니다.

main.dart
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 정책 위반 탐지를 확인할 수 있습니다.

main.dart
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)설명
0x0001APPGUARD_TYPE_CSAUTH_SUCESSClientId서버 인증이 성공했습니다.
0x0002APPGUARD_TYPE_CSAUTH_RETRYN/A서버 인증 작업이 진행 중입니다.
0x0003APPGUARD_TYPE_CSAUTH_FALSEN/A서버 인증 작업이 실패했습니다.

아래 예제 코드처럼 setS2AuthTryCallbackMethod 메서드를 통해 AppGuard 서버 인증 상태 결과를 확인할 수 있습니다.

main.dart
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 메서드를 사용하여 clientIdretryTimeout 매개변수를 전달해 AppGuard 서버 인증에 사용할 세션 유일 식별자를 설정할 수 있습니다.

main.dart
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]를 참고해 주시기 바랍니다.