revup_flutter_plugin 1.2.0
revup_flutter_plugin: ^1.2.0 copied to clipboard
We provide a plugin so that you can integrate revup while developing with Flutter.
Revup Flutter Plugin #
- Flutter Minimum Version : 3.44 (Dart 3.12) — 1.2.0 부터. 그보다 낮은 Flutter 에서는 pub 이 1.1.0 을 고른다
- Android Target API Level : 31+
- Android Minimum API Level : 24
- iOS Minimum Version : 15.0
- Xcode Minimum Version : Xcode 16.0
Networks Version
| Ad Network | Android Version | iOS Version |
|---|---|---|
| AdMob | 23.5.0 | 12.2.0 |
| Amazon | 9.10.4 | 5.1.0 |
| AppLovin | 13.0.1 | 13.1.0 |
| BidMachine | 3.0.1 | 3.2.1 |
| Chartboost | 9.8.2 | 9.8.1 |
| DT Exchange | 8.3.5 | 8.3.5 |
| InMobi | 10.7.8 | 10.8.2 |
| Ironsource | 8.7.0 | 없음 |
| Liftoff(Vungle) | 7.4.2 | 7.4.4 |
| Meta(Fan) | 6.18.0 | 6.17.1 |
| Mintegral(Mobvista) | 16.9.41 | 7.7.7 |
| Moloco | 3.6.1 | 3.7.2 |
| Ogury | 5.8.0 | 5.0.2 |
| Pangle | 6.5.0.4 | 6.5.0.9 |
| Smaato | 22.7.1 | 없음 |
| Unity Ads | 4.13.2 | 4.14.0 |
| Verve | 3.3.0 | 없음 |
| Yandex | 7.9.0 | 없음 |
Contents #
Add the Revup package to Your Project
Revup Overview
- Import
- RevupFlutterPlugin 생성
- Initialize
- 사용자 정보 설정
- Lucky Event
- RewardedVideo
- Interstitial
- RewardedInterstitial
- Etc
웹사이트 필수 등록
Revup Server 연동하기
Privacy Manifest 정책 적용
Revup Error Information
Adiscope에서 마이그레이션하기
etc
Add the Revup package to Your Project #
1. Installation #
A. Latest version Installation
flutter pub add revup_flutter_plugin
- 프로젝트의 IDE루트 경로에서 터미널을 열고 위과 같이 실행하여 플러그인을 설치
B. Specific version Installation
flutter pub add revup_flutter_plugin:1.2.0
- 프로젝트의 IDE루트 경로에서 터미널을 열고 위과 같이 특정 버전을 추가로 실행하여 플러그인을 설치
2. Setup Android #
A. Setup AndroidManifest
<application>
<meta-data android:name="adiscope_media_id" android:value="${adiscope_media_id}"/>
<meta-data android:name="adiscope_media_secret" android:value="${adiscope_media_secret}"/>
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="${revup_admob_id}"/>
</application>
- Android 프로젝트의
AndroidManifest.xml파일에 다음과 같은 설정 - meta-data 복사해서 변경 없이 추가 (아래 B - 나의 Module Gradle의 변수 값을 참조 함)
B. Setup Gradle
가. Setup Project Gradle
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://repository.tnkad.net/repository/public/" } // [필수] Revup
}
}
- Revup SDK는 Maven Central이 아니라 자체 Maven 저장소에 배포됩니다. 저장소 추가는 필수입니다.
- 이 저장소 하나로 충분합니다. 미러링·그룹 설정이 되어 있어 네트워크 어댑터가 쓰는 SDK (applovin · bytedance · chartboost · bidmachine · ogury · mintegral · ironsource · pubmatic · verve 등)도 이 경로로 함께 받습니다. 예전 안내대로 네트워크별 저장소를 나열해 두었다면 지워도 됩니다
- 프로젝트 파일 내에 {projectroot}/android/build.gradle 파일에
maven추가
최근 Flutter 템플릿처럼 android/build.gradle.kts (Kotlin DSL) 를 쓰는 프로젝트는 문법이 다르다.
위 Groovy 예시를 그대로 붙이면 빌드 스크립트 오류가 난다.
allprojects {
repositories {
google()
mavenCentral()
maven { url = uri("https://repository.tnkad.net/repository/public/") } // [필수] Revup
}
}
나. Setup Module Gradle
android {
defaultConfig {
manifestPlaceholders = [
adiscope_media_id : "media id 기입 필요",
adiscope_media_secret: "media secret 기입 필요",
adiscope_sub_domain : "sub domain 기입 필요", // 옵션값 (오퍼월 상세페이지 이동 기능, 필요시 담당자 전달 예정)
revup_admob_id : "admob_app_id 기입 필요" // Admob 사용 시 필요
]
}
}
dependencies {
// BOM 으로 연동하면 어댑터 버전을 개별로 명시할 필요가 없다
implementation platform('com.tnkfactory.revup:revup-bom:1.0.9')
implementation 'com.tnkfactory.revup:revupCore'
implementation 'com.tnkfactory.revup:revupAndroid'
implementation 'com.tnkfactory.revup:revupLuckyEvent' // 복권(Lucky Event) 사용 시
implementation 'com.tnkfactory.revup:adapter.chartboost' // chartboost
implementation 'com.tnkfactory.revup:adapter.max' // max
implementation 'com.tnkfactory.revup:adapter.admob' // admob
implementation 'com.tnkfactory.revup:adapter.pangle' // pangle
implementation 'com.tnkfactory.revup:adapter.vungle' // vungle
implementation 'com.tnkfactory.revup:adapter.tnkpub' // tnkpub
}
android/app/build.gradle.kts (Kotlin DSL) 에서는 이렇게 쓴다.
android {
defaultConfig {
manifestPlaceholders += mapOf(
"adiscope_media_id" to "media id 기입 필요",
"adiscope_media_secret" to "media secret 기입 필요",
"adiscope_sub_domain" to "sub domain 기입 필요", // 옵션값
"revup_admob_id" to "admob_app_id 기입 필요", // Admob 사용 시 필요
)
}
}
dependencies {
implementation(platform("com.tnkfactory.revup:revup-bom:1.0.9"))
implementation("com.tnkfactory.revup:revupCore")
implementation("com.tnkfactory.revup:revupAndroid")
implementation("com.tnkfactory.revup:revupLuckyEvent") // 복권(Lucky Event) 사용 시
implementation("com.tnkfactory.revup:adapter.chartboost") // chartboost
implementation("com.tnkfactory.revup:adapter.max") // max
implementation("com.tnkfactory.revup:adapter.admob") // admob
implementation("com.tnkfactory.revup:adapter.pangle") // pangle
implementation("com.tnkfactory.revup:adapter.vungle") // vungle
implementation("com.tnkfactory.revup:adapter.tnkpub") // tnkpub
}
- 애디스콥 측에 media_id 와 media_secret, sub_domain 문의!
- adiscope_media_id: 매체 아이디
- adiscope_media_secret: 매체 시크릿키
- adiscope_sub_domain: 옵션값 (오퍼월 상세페이지 이동 기능, 필요시 담당자 전달 예정)
- revup_admob_id: admob을 접속 하기 위한 키
- 프로젝트 파일 내에 {projectroot}/android/app/build.gradle 파일에
manifestPlaceholders,implementation추가 - Third Party 네트워크사들을 확인 후 필요한 네트워크사들만 추가
- 특정 버전의 adapter들 버전을 확인 방법
Releases에서Source Code파일 다운로드 후README.md파일 확인
- Adapter Version이 상이할 경우 Initialize시 Log를 통해 확인 가능
3. Setup iOS #
A. Setup Podfile
platform :ios, '15.0' # iOS 최소 지원 15.0 (Xcode 27 대응)
target 'Runner' do
# REVUP.xcframework 는 정적 라이브러리이므로 static linkage 가 필요하다
use_frameworks! :linkage => :static
use_modular_headers!
# REVUP 은 단일 pod + subspec 구조다. 필요한 subspec 만 골라 추가한다.
# (umbrella 인 pod 'REVUP' 를 쓰면 default_subspecs 로 모든 광고 네트워크가 딸려온다)
pod 'REVUP/Core', '1.1.11'
pod 'REVUP/LuckyEvent', '1.1.11'
pod 'REVUP/AdManager', '1.1.11'
pod 'REVUP/AdMob', '1.1.11'
pod 'REVUP/ChartBoost', '1.1.11'
pod 'REVUP/Pangle', '1.1.11'
pod 'REVUP/Vungle', '1.1.11'
pod 'REVUP/TnkPub', '1.1.11'
pod 'REVUP/Max', '1.1.11'
pod 'REVUP/MaxMediaAdManager', '1.1.11'
pod 'REVUP/MaxMediaAdMob', '1.1.11'
pod 'REVUP/MaxMediaBidMachine', '1.1.11'
pod 'REVUP/MaxMediaBigo', '1.1.11'
pod 'REVUP/MaxMediaChartBoost', '1.1.11'
pod 'REVUP/MaxMediaDTExchange', '1.1.11'
pod 'REVUP/MaxMediaFan', '1.1.11'
pod 'REVUP/MaxMediaInMobi', '1.1.11'
pod 'REVUP/MaxMediaIronSource', '1.1.11'
pod 'REVUP/MaxMediaLine', '1.1.11'
pod 'REVUP/MaxMediaMobVista', '1.1.11'
pod 'REVUP/MaxMediaMoloco', '1.1.11'
pod 'REVUP/MaxMediaOgury', '1.1.11'
pod 'REVUP/MaxMediaPangle', '1.1.11'
pod 'REVUP/MaxMediaPubMatic', '1.1.11'
pod 'REVUP/MaxMediaUnityAds', '1.1.11'
pod 'REVUP/MaxMediaVungle', '1.1.11'
end
post_install do |installer|
# Apple Silicon 시뮬레이터 대응 — 아래 "Apple Silicon 시뮬레이터에서 빌드가 안 될 때" 참고
support = File.join(installer.sandbox.root, 'Target Support Files')
bigo_key = /\AEXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64/
Dir.glob(File.join(support, 'BigoADS*', '*.xcconfig')).each do |path|
content = File.read(path)
cleaned = content.lines.reject { |l| l =~ bigo_key }.join
File.write(path, cleaned) if cleaned != content
end
installer.pods_project.targets.select { |t| t.name.start_with?('BigoADS') }.each do |target|
target.build_configurations.each do |config|
config.build_settings.delete_if { |key, _| key =~ bigo_key }
end
end
Dir.glob(File.join(support, 'IronSourceAdQualitySDK*', '*.xcconfig')).each do |path|
content = File.read(path)
cleaned = content.gsub(/^(EXCLUDED_ARCHS\[sdk=iphonesimulator\*\] = .*?)\barm64e\b ?/) { $1 }
File.write(path, cleaned) if cleaned != content
end
# Xcode 27 대응 — Pods 타겟의 deployment target 을 15.0 이상으로 맞춘다
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
# Xcode 27 은 15.0 미만 deployment target 을 지원하지 않는다
current = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']
if current.nil? || current.to_f < 15.0
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
end
end
- 프로젝트 파일 내에 {projectroot}/ios/Podfile 파일에
pod추가 - Third Party 네트워크사들을 확인 후 필요한 네트워크사들만 추가
- Adapter Version이 상이할 경우 Initialize시 Xcode Log를 통해 확인 가능
Apple Silicon 시뮬레이터에서 빌드가 안 될 때
Unable to find a destination … iOS Simulator platform doesn't match Runner.app's supported platforms
로 시뮬레이터 빌드가 실패하면 앱에서 arm64 가 빠진 것이다. iOS 26+ 시뮬레이터는 arm64 로만 돈다.
- Flutter 는 Pods 빌드 설정에
EXCLUDED_ARCHS … arm64문자열이 보이면 "arm64 미지원"으로 판정해 앱에서도 arm64 를 뺀다 REVUP/MaxMediaBigo가 가져오는 BigoADS 의 옛 설정(Xcode 12 + Intel Mac 전용)과, IronSourceAdQualitySDK 의arm64e(Flutter 3.47 미만에서만) 가 이 판정에 잘못 걸린다- 위
post_install의 앞부분이 그 설정만 걷어낸다. 실기기 빌드에는 영향이 없다 - 적용 후에도 이전 빌드가 남긴 설정 때문에 한 번 더 실패하면, 아래로 Xcode 설정을 다시 만든 뒤 실행한다
flutter build ios --config-only --simulator
B. Setup Plist
- 프로젝트 파일 내에 {projectroot}/ios/Runner/Info.plist 파일에 추가
가. REVUPMediaId, REVUPMediaSecret 추가
<key>REVUPMediaId</key>
<string>{media id 기입 필요}</string>
<key>REVUPMediaSecret</key>
<string>{media secret 기입 필요}</string>
나. App Tracking Permission 추가
<key>NSUserTrackingUsageDescription</key>
<string></string>
- ex : Some ad content may require access to the user tracking.
다. SKAdNetwork 추가 (Download)
<dict>
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string></string>
</dict>
</array>
</dict>
- SKAdNetwork Download File 내용 추가 (Download)
라. Admob, Max의 Admob 사용 시 추가
<key>GADIsAdManagerApp</key>
<true/>
<key>GADApplicationIdentifier</key>
<string>{admob_app_id 기입 필요}</string>
- "GADIsAdManagerApp" 설정 및 "GADApplicationIdentifier"의 Key 설정
Revup Overview #
1. Import #
import 'package:revup_flutter_plugin/revup_flutter_plugin.dart';
- Revup을 사용하기 위해서 추가
2. RevupFlutterPlugin 생성 #
final _revupFlutterPlugin = RevupFlutterPlugin();
- Revup을 사용하기 위해서 추가
3. Initialize #
A. Code에서 Media 없이 Initialize 방법
Future<void> initialize() async {
bool result = await _revupFlutterPlugin.initialize() ?? false;
if (result) {
// Initialize Call Back
} else {
// Initialize Fail
}
}
- Android는 AndroidManifest 파일과 Module Gradle 파일 세팅 필요
- iOS는 Plist 파일 세팅 필요
- App 실행 시 1회 설정 권장
- Revup에서는 Google Play 가족 정책을 준수해야 함 (Android 전용 - Revup Google Play 가족 정책 확인)
- ${정책\ {\color{red}미준수시}}\ 광고에\ 제한이\ 생김$ (광고 물량 축소 및 오퍼월 진입 불가)
- ${정책\ {\color{red}미준수시}}\ 광고에\ 제한이\ 생김$ (광고 물량 축소 및 오퍼월 진입 불가)
B. Code에서 직접 Media 넣어서 Initialize 방법
Future<void> initialize() async {
var mediaId = ""; // 관리자를 통해 발급
var mediaSecret = ""; // 관리자를 통해 발급
var callbackTag = ""; // 관리자를 통해 발급, 기본 ""
var childYN = ""; // 어린이 여부를 설정 해주는 값(Google GMA에 세팅)
bool result = await _revupFlutterPlugin.initialize(mediaId, mediaSecret, callbackTag, childYN) ?? false;
if (result) {
// Initialize Call Back
} else {
// Initialize Fail
}
}
- App 실행 시 1회 설정 권장
- Revup에서는 Google Play 가족 정책을 준수해야 함 (Android 전용 - Revup Google Play 가족 정책 확인)
- ${정책\ {\color{red}미준수시}}\ 광고에\ 제한이\ 생김$ (광고 물량 축소 및 오퍼월 진입 불가)
- ${정책\ {\color{red}미준수시}}\ 광고에\ 제한이\ 생김$ (광고 물량 축소 및 오퍼월 진입 불가)
4. 사용자 정보 설정 #
Future<void> setUserId() async {
var userId = ""; // set unique user id to identify the user in reward information
bool result = await _revupFlutterPlugin.setUserId(userId) ?? false;
}
RewardedVideo,RewardedInterstitial를 사용하기 위해 ${\color{red}필수}$ 설정- 64자까지 설정 가능
5. Lucky Event #
복권 등 서드파티 이벤트 웹 페이지를 노출합니다. 이벤트 아이디와 키값은 매체 영업팀을 통해 발급받습니다.
Android 는 revupLuckyEvent 모듈, iOS 는 REVUP/LuckyEvent subspec 이 연동되어 있어야 합니다.
A. Settings
Future<void> setLuckyEventAppId() async {
var eventId = ""; // 이벤트 식별 키값 (관리자를 통해 발급)
var pubId = ""; // 이벤트 매체 식별 키값 (관리자를 통해 발급)
bool result = await _revupFlutterPlugin.setLuckyEventAppId(eventId, pubId) ?? false;
}
- 사용자 정보 설정(setUserId) 완료 후 호출
B. Theme
Future<void> setLuckyEventTheme() async {
// light : 단말 설정과 무관하게 항상 라이트
// dark : 단말 설정과 무관하게 항상 다크
// system: 단말의 다크모드 설정을 따름 (기본값)
bool result = await _revupFlutterPlugin
.setLuckyEventTheme(RevupLuckyEventTheme.system) ?? false;
}
- 적용 범위는 SDK 가 그리는 ${\color{red}네이티브\ 영역}$ 입니다 — 화면 배경, 상태바·내비게이션바 아이콘 대비, SDK 안내 팝업
- 이벤트 웹 페이지 자체는 웹에서 정한 대로 표시됩니다
- Show 호출 전 에 설정해야 하며, 이미 떠 있는 화면에는 반영되지 않음
- 기본값이
system이므로, 별도 설정이 없으면 다크모드 단말에서 화면이 다크로 표시됨 - Android
1.0.9/ iOS1.1.9이상 필요
C. Show
Future<void> showLuckyEvent() async {
bool result = await _revupFlutterPlugin.showLuckyEvent() ?? false;
}
D. 부가 옵션
// 이벤트 URL 뒤에 붙일 해시마크 (#page-1 등)
await _revupFlutterPlugin.setLuckyEventHashMark("page-1");
// 이벤트 URL 에 추가할 커스텀 쿼리 파라미터
await _revupFlutterPlugin.setLuckyEventExtraParam("key", "value");
// 이벤트 base URL 변경 (테스트 서버 연동 등, 협의 후 사용)
await _revupFlutterPlugin.setLuckyEventBaseUrl("https://...");
// [iOS 전용] 웹뷰에 safe area 적용
await _revupFlutterPlugin.setLuckyEventUseSafeAreaWebView(true);
// [iOS 전용] 웹뷰 edge swipe 제스처로 뒤로가기
await _revupFlutterPlugin.setLuckyEventEdgeGesture(true);
- iOS 전용 옵션은 Android 에서 호출해도 동작하지 않고
false를 반환합니다
E. Callback
RevupListener.setupLuckyEventListener(
luckyEventWebViewNavigated: (url) {
// 이벤트 웹뷰에서 발생한 scheme URL 수신
},
);
- 이벤트 웹뷰에서 발생하는 Scheme URL 을 전달받아 매체가 직접 처리할 때 사용
6. RewardedVideo #
A. Load
Future<void> rewardedVideoLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _revupFlutterPlugin.rewardedVideoLoad(unitId) ?? false;
}
- 해당 유닛에 속한 ad 네크워크들의 광고를 Load
onRewardedVideoAdLoadedcallback이 호출되면 Load가 완료Load가 실행되면onRewardedVideoAdLoaded와onRewardedVideoAdFailedToLoad중 하나의 callback은 항상 호출- Rewarded Video Ad의
Load와Show는 pair로 호출 - Load를 한 후 Show를 하고, 광고를 Show한 후에는 다시 Load를 하여 다음 번 Show를 준비
- Load & Show 후 다시 Load를 하려 할 때 Load 는 Show 이후 언제든 호출가능
- 광고가 Show되는 동안 다음 광고를 Load를 할 수도 있지만 이는 사용하는 mediation ad network company의 종류에 따라 달라질 수 있으므로 항상 보장되는 동작은 아님
- Show의 callback 인
onRewardedVideoAdClosed에서 다시 Load를 하는 것을 권장- Abusing 방지를 위해 Rewarded Video Ad를 연속으로 보여주는 것을 제한하여 한번 광고를 보고 나면 일정 시간이 지난 후에 다시 Show를 할 수 있도로록 Admin page에서 서비스 설정 가능
- Load 동작 수행 중에 Load를 여러 번 호출할 수 없음
- (Optional) Load의 시간이 필요해 ProgressBar 노출 추천
B. IsLoaded
Future<void> rewardedVideoIsLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _revupFlutterPlugin.rewardedVideoIsLoad(unitId) ?? false;
if (result) {
// show ad here
} else {
// do something else
}
}
- 광고가 Load 되었는지 상태를 확인
C. Show
Future<void> rewardedVideoShow() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _revupFlutterPlugin.rewardedVideoIsLoad(unitId) ?? false;
if (result) {
bool resultShow = await _revupFlutterPlugin.rewardedVideoShow() ?? false;
if (resultShow) {
// Success
} else {
// This Show request is duplicated
}
} else {
// ad is not loaded
}
}
- 마지막으로 Load된 광고를 사용자에게 보여줌
- Show 호출 후에는 다시 Load를 호출 할 수 있음
- Show method는 중복하여 호출 할 수 없음
Show가 실행되면 (return값이 True일 경우)onRewardedVideoAdOpened와onRewardedVideoAdFailedToShow중 하나가 항상 호출되고,onRewardedVideoAdOpened가 호출되었다면 이후onRewardedVideoAdClosed가 항상 호출- Rewarded Video Ad의
Load와Show는 pair로 호출- Load를 한 후 Show를 하고, 광고를 Show한 후에는 다시 Load를 하여 다음번 Show를 준비
- Load를 한 후 Show를 하고, 광고를 Show한 후에는 다시 Load를 하여 다음번 Show를 준비
D. Callback Reward
RevupListener.setupRewardedVideoListener(
onRewarded: (unitId, currencyUnit, amount) {
// unitId - 해당 rewarded video ad의 unitId (rewardedVideoShow 시 입력한 값)
// currencyUnit - 보상 type
// amount - 보상의 양
},
);
- Initialize를 실행 해야 Callbacks 호출
- 보상이 주어져야 할 경우
onRewarded가 호출되며 그 parameter로 관련 정보가 전달 - 이 보상 정보를 바탕으로 게임 내에서 보상을 지급
onRewarded는 보통onRewardedVideoAdOpened와onRewardedVideoAdClosed사이에 호출되는 경우가 많으나 광고 System의 상황에 따라 달라 질 수 있음onRewarded가 호출되지 않는 경우도 존재할 수 있음(Reward 설정을 Server-to-server로 하였다면, Video 시청 후에는OnRewarded가 호출되지 않음)- Reward 정보는 abusing 방지를 위해서 Server-to-server 방식으로 전달 받는 것을 권장
- Server-to-server 방식을 선택하더라도 보상이 전달 될 시에는
onRewarded가 호출- 이때는 Server를 통해 전달받은 정보를 기준으로 처리하고,
onRewarded를 통해 전달받은 정보는 검증용으로 사용하거나 무시하도록 함
- 이때는 Server를 통해 전달받은 정보를 기준으로 처리하고,
D. Callback Others
RevupListener.setupRewardedVideoListener(
onRewardedVideoAdLoaded: (unitId) {
},
onRewardedVideoAdFailedToLoad: (unitId, errorDescription, errorXB3TraceID) {
},
onRewardedVideoAdOpened: (unitId) {
},
onRewardedVideoAdClosed: (unitId) {
},
onRewardedVideoAdFailedToShow: (unitId, errorDescription, errorXB3TraceID) {
}
);
- Initialize를 실행 해야 Callbacks 호출
Load성공 시onRewardedVideoAdLoaded, 실패 시onRewardedVideoAdFailedToLoad가 호출Show성공 시onRewardedVideoAdOpened,onRewardedVideoAdClosed가 순차적으로 호출되고, 실패시onRewardedVideoAdFailedToShow가 호출onRewardedVideoAdFailedToLoad,onRewardedVideoAdFailedToShow시 RevupError 참고
7. Interstitial #
A. Load
Future<void> interstitialLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _revupFlutterPlugin.interstitialLoad(unitId) ?? false;
}
- 해당 유닛에 속한 ad 네크워크들의 광고를 Load
onInterstitialAdLoadedcallback이 호출되면 Load가 완료- Interstitial의
Load와Show는 pair로 호출 - Load를 한 후 Show를 하고, 광고를 Show한 후에는 다시 Load를 하여 다음 번 Show를 준비
- 광고가 Show되는 동안 다음 광고를 load를 할 수도 있지만 이는 사용하는 mediation ad network company의 종류에 따라 달라질 수 있으므로 항상 보장되는 동작은 아님
- Load 동작 수행 중에 Load를 여러 번 호출할 수 없음
- (Optional) Load의 시간이 필요해 ProgressBar 노출 추천
B. IsLoaded
Future<void> interstitialIsLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _revupFlutterPlugin.interstitialIsLoad(unitId) ?? false;
if (result) {
// show ad here
} else {
// do something else
}
}
- 광고가 Load 되었는지 상태를 확인
C. Show
Future<void> interstitialShow() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _revupFlutterPlugin.interstitialIsLoad(unitId) ?? false;
if (result) {
bool resultShow = await _revupFlutterPlugin.interstitialShow() ?? false;
if (interstitialAd.Show()) {
// Success
} else {
// This Show request is duplicated
}
} else {
// ad is not loaded
}
}
- 마지막으로 Load된 광고를 사용자에게 보여줌
- Show 호출 후에는 다시 Load를 호출 할 수 있음
- Show method는 중복하여 호출 할 수 없음
Show가 실행되면 (return값이 True일 경우)onInterstitialAdLoaded와onInterstitialAdFailedToLoad중 하나가 항상 호출되고,onInterstitialAdOpened가 호출되었다면 이후onInterstitialAdClosed가 항상 호출- Rewarded Video Ad의
Load와Show는 pair로 호출- Load를 한 후 Show를 하고, 광고를 Show한 후에는 다시 Load를 하여 다음번 Show를 준비
- Load를 한 후 Show를 하고, 광고를 Show한 후에는 다시 Load를 하여 다음번 Show를 준비
D. Callback
RevupListener.setupInterstitialListener(
onInterstitialAdLoaded: (unitId) {
},
onInterstitialAdFailedToLoad: (unitId, errorDescription, errorXB3TraceID) {
},
onInterstitialAdOpened: (unitId) {
},
onInterstitialAdClosed: (unitId) {
},
onInterstitialAdFailedToShow: (unitId, errorDescription, errorXB3TraceID) {
}
);
- Initialize를 실행 해야 Callbacks 호출
Load성공 시onInterstitialAdLoaded, 실패 시onInterstitialAdFailedToLoad가 호출Show성공 시onInterstitialAdOpened,onInterstitialAdClosed가 순차적으로 호출되고, 실패 시onInterstitialAdFailedToShow가 호출onInterstitialAdFailedToLoad,onInterstitialAdFailedToShow시 RevupError 참고
8. RewardedInterstitial #
A. PreLoadAll
Future<void> preLoadAllRewardedInterstitial() async {
bool result = await _revupFlutterPlugin.preLoadAllRewardedInterstitial() ?? false;
}
- Initialize Call Back 후 1회 설정 권장
- 관리자가 설정된 활성화된 모든 유닛들을 Load 진행
B. Unit 지정 PreLoad
Future<void> preLoadRewardedInterstitial() async {
var unitIds = List<String>.empty(growable : true);
unitIds.add(unitId1);
unitIds.add(unitId2);
bool result = await _revupFlutterPlugin.preLoadRewardedInterstitial(unitIds) ?? false;
}
- Initialize Call Back 후 1회 설정 권장
- 입력된 유닛들을 Load 진행
C. Show
Future<void> showRewardedInterstitial(String unitId) async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _revupFlutterPlugin.showRewardedInterstitial(unitId) ?? false;
}
- 해당 유닛이 Load되어 있으면 안내 팝업을 보여 준 뒤 해당 광고를 사용자에게 보여줌
- showRewardedInterstitial method는 중복하여 호출 할 수 없음
showRewardedInterstitial가 실행되면 (return값이 True일 경우)onRewardedInterstitialAdSkip와onRewardedInterstitialAdOpened와onRewardedInterstitialAdFailedToShow중 하나가 항상 호출되고,onRewardedInterstitialAdOpened가 호출되었다면 이후onRewardedInterstitialAdClosed가 항상 호출onRewardedInterstitialAdClosed와onRewardedInterstitialAdFailedToShow가 호출 되면 내부에서 해당 유닛을 자동 Load 시킴
D. Callbacks Reward
RevupListener.setupRewardedInterstitialListener(
onRewardedInterstitialRewarded: (unitId, currencyUnit, amount) {
// unitId - 해당 rewarded video ad의 unitId (ShowRewardedInterstitial 시 입력한 값)
// currencyUnit - 보상 type
// amount - 보상의 양
},
);
- Initialize를 실행 해야 Callbacks 호출
- 보상이 주어져야 할 경우
onRewardedInterstitialRewarded가 호출되며 그 parameter로 관련 정보가 전달 - 이 보상 정보를 바탕으로 게임 내에서 보상을 지급
onRewardedInterstitialRewarded는 보통onRewardedInterstitialAdOpened와onRewardedInterstitialAdClosed사이에 호출되는 경우가 많으나 광고 System의 상황에 따라 달라 질 수 있음onRewardedInterstitialRewarded가 호출되지 않는 경우도 존재할 수 있음(Reward 설정을 Server-to-server로 하였다면, Video 시청 후에는OnRewarded가 호출되지 않음)- Reward 정보는 abusing 방지를 위해서 Server-to-server 방식으로 전달 받는 것을 권장
- Server-to-server 방식을 선택하더라도 보상이 전달 될 시에는
onRewardedInterstitialRewarded가 호출- 이때는 Server를 통해 전달받은 정보를 기준으로 처리하고,
onRewardedInterstitialRewarded를 통해 전달받은 정보는 검증용으로 사용하거나 무시하도록 함
- 이때는 Server를 통해 전달받은 정보를 기준으로 처리하고,
D. Callbacks Others
RevupListener.setupRewardedInterstitialListener(
onRewardedInterstitialAdSkip: (unitId) {
},
onRewardedInterstitialAdOpened: (unitId) {
},
onRewardedInterstitialAdClosed: (unitId) {
},
onRewardedInterstitialAdFailedToShow: (unitId, errorDescription, errorXB3TraceID) {
}
);
- Initialize를 실행 해야 Callbacks 호출
- Show 성공 후 Skip 시
onRewardedInterstitialAdSkip가 호출 - Show 성공 후 영상 시청 시
onRewardedInterstitialAdOpened,onRewardedInterstitialAdClosed가 순차적으로 호출되고, 실패 시onRewardedInterstitialAdFailedToShow가 호출 onRewardedInterstitialAdFailedToShow시 RevupError 참고
9. Etc #
A. Revup SDK Version
Future<void> getSDKVersion() async {
String result = await _revupFlutterPlugin.getSDKVersion() ?? "";
}
- Android와 iOS의 Core SDK Version 확인
B. Revup Network Versions
Future<void> getNetworkVersions() async {
String result = await _revupFlutterPlugin.getNetworkVersions() ?? "";
}
- Android와 iOS의 Third Party SDK Versions 확인
C. Set Rewarded Check Param
Future<void> setRewardedCheckParam(String param) async {
await _revupFlutterPlugin.setRewardedCheckParam(param);
}
- Rewarded callback 시 parameters을 추가
- 해당 정보는 Rewarded 지급 등에 있어 구분하는데 사용 할 수 있음
- 내부 설정 후 사용 가능 ( 담당자에게 요청 부탁 )
- param은 Base64 Encoded(UTF8)를 처리 후 1000자내로 설정
D. Volume
Future<void> setVolumeOff() async {
bool isOff = true; // Ad Sound Off
bool isOff = false; // Ad Sound On (Default)
await _revupFlutterPlugin.setVolumeOff(isOff);
if (isOff) {
pushLog("Ad Sound Off");
} else {
pushLog("Ad Sound On");
}
}
Admob,AppLovin,Mintegral,Verve만 적용 가능
웹사이트 필수 등록 (Android 전용) #
- 관리자에게 전달받은
app-ads.txt를 웹사이트에 등록
Revup Server 연동하기 #
Privacy Manifest 정책 적용 (iOS 전용) #
- 2024년 5월 1일부터 출시/업데이트 되는 앱에 대해 3rd Party Framework의 개인정보 추가