adiscope_flutter_plugin 3.7.0 adiscope_flutter_plugin: ^3.7.0 copied to clipboard
We provide a plugin so that you can integrate adiscope while developing with Flutter.
Adiscope Flutter Plugin #
- Android Target API Level : 31+
- Android Minimum API Level : 15
- Admob, Pangle 사용 시 : 16
- Chartboost, Unityads, Vungle, Max 사용 시 : 21
- iOS Minimum Version : 12.0
- Xcode Minimum Version : Xcode 15.1
Contents #
Add the Adiscope package to Your Project
Adiscope Overview
- Import
- AdiscopeFlutterPlugin 생성
- Initialize
- 사용자 정보 설정
- Offerwall
- RewardedVideo
- Interstitial
- RewardedInterstitial
- Etc
웹사이트 필수 등록
Privacy Manifest 정책 적용
iOS 16+ Offerwall 세로 모드 전환 적용 방법(가로모드 전용일 경우)
Adiscope Error Information
etc
Add the Adiscope package to Your Project #
1. Installation #
A. Latest version Installation
flutter pub add adiscope_flutter_plugin
- 프로젝트의 IDE루트 경로에서 터미널을 열고 위과 같이 실행하여 플러그인을 설치
B. Specific version Installation
flutter pub add adiscope_flutter_plugin:3.6.0
- 프로젝트의 IDE루트 경로에서 터미널을 열고 위과 같이 특정 버전을 추가로 실행하여 플러그인을 설치
2. Setup Android #
A. Setup AndroidManifest
<application>
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="${adiscope_admob_id}"/>
<meta-data android:name="adiscope_media_id" android:value="${adiscope_media_id}"/>
<meta-data android:name="adiscope_media_secret" android:value="${adiscope_media_secret}"/>
</application>
- Android 프로젝트의
AndroidManifest.xml
파일에 다음과 같은 설정 - meta-data 복사해서 변경 없이 추가 (아래 Module Gradle의 변수 값을 참조 함)
B. Setup Gradle
가. Setup Project Gradle
allprojects {
repositories {
maven { url 'https://repository.adiscope.com/repository/adiscope/' }
maven { url "https://s3.amazonaws.com/smaato-sdk-releases/" } // max 연동 시 추가
maven { url "https://verve.jfrog.io/artifactory/verve-gradle-release" } // max 연동 시 추가
maven { url "https://artifact.bytedance.com/repository/pangle" } // max 혹은 pangle 연동 시 추가
maven { url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea" } // max 혹은 mobvista 연동 시 추가
maven { url 'https://cboost.jfrog.io/artifactory/chartboost-ads/' } // chartboost 연동 시 추가
}
}
- Adiscope SDK는 Maven Central에 배포
- 프로젝트 파일 내에 {projectroot}/android/build.gradle 파일에
maven
추가 - max를 연동 시 4개를 추가하고, chartboost를 연동 시 1개를 추가
나. Setup Module Gradle
android {
defaultConfig {
manifestPlaceholders = [
adiscope_media_id : "media id 기입 필요",
adiscope_media_secret: "media secret 기입 필요",
adiscope_sub_domain : "sub domain 기입 필요", // 옵션값 (오퍼월 상세페이지 이동 기능, 필요시 담당자 전달 예정)
adiscope_admob_id : "admob_app_id 기입 필요" // Admob 사용 시 필요
]
}
}
dependencies {
implementation 'com.nps.adiscope:adiscopeCore:3.7.0'
implementation 'com.nps.adiscope:adiscopeAndroid:1.2.1'
implementation 'com.nps.adiscope:adapter.chartboost:9.3.1.0' // chartboost
implementation 'com.nps.adiscope:adapter.unityads:4.6.1.0' // unityads
implementation 'com.nps.adiscope:adapter.max:12.1.0.4' // max
implementation 'com.nps.adiscope:adapter.applovin:12.1.0.1' // applovin
implementation 'com.nps.adiscope:adapter.admob:22.3.0.3' // admob (use play-services-ads:22.3.0 dependency)
implementation 'com.nps.adiscope:adapter.fan:6.13.7.1' // fan
implementation 'com.nps.adiscope:adapter.mobvista:16.5.91.1' // mobvista (use androidx)
implementation "com.nps.adiscope:adapter.pangle:5.6.0.3.0" // pangle
implementation 'com.nps.adiscope:adapter.vungle:7.1.0.0' // vungle (use androidx)
}
- 애디스콥 측에 media_id 와 media_secret, sub_domain 문의!
- adiscope_media_id: 매체 아이디
- adiscope_media_secret: 매체 시크릿키
- adiscope_sub_domain: '무료충전소 상세 화면 이동 기능'에 사용하는 값으로, 해당 기능 적용 시 애디스콥과 협의 필요
- adiscope_admob_id: admob을 접속 하기 위한 키
- 프로젝트 파일 내에 {projectroot}/android/app/build.gradle 파일에
manifestPlaceholders
,implementation
추가 - Third Party 네트워크사들을 확인 후 필요한 네트워크사들만 추가
- 특정 버전의 adapter들 버전을 확인 방법
Releases
에서Source Code
파일 다운로드 후README.md
파일 확인
3. Setup iOS #
A. Setup Podfile
target 'Runner' do
use_frameworks!
use_modular_headers!
pod 'AdiscopeMediaAdManager', '3.6.0' // admanager
pod 'AdiscopeMediaAdMob', '3.7.0' // admob
pod 'AdiscopeMediaAppLovin', '3.6.1' // applovin
pod 'AdiscopeMediaChartBoost', '3.6.0' // chartboost
pod 'AdiscopeMediaFAN', '3.6.0' // fan
pod 'AdiscopeMediaMax', '3.6.1' // max
pod 'AdiscopeMediaMobVista', '3.6.0' // mobvista
pod 'AdiscopeMediaPangle', '3.6.0' // pangle
pod 'AdiscopeMediaUnityAds', '3.6.0' // unityads
pod 'AdiscopeMediaVungle', '3.6.0' // vungle
end
- 프로젝트 파일 내에 {projectroot}/ios/Podfile 파일에
pod
추가 - Third Party 네트워크사들을 확인 후 필요한 네트워크사들만 추가
- 특정 버전의 adapter들 버전을 확인 방법
Releases
에서Source Code
파일 다운로드 후README.md
파일 확인
B. Setup Plist
- 프로젝트 파일 내에 {projectroot}/ios/Runner/Info.plist 파일에 추가
가. AdiscopeMediaId, AdiscopeMediaSecret 추가
<key>AdiscopeMediaId</key>
<string>{media id 기입 필요}</string>
<key>AdiscopeMediaSecret</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 사용 시 추가
<key>GADIsAdManagerApp</key>
<true/>
<key>GADApplicationIdentifier</key>
<string>{admob_app_id 기입 필요}</string>
- "GADIsAdManagerApp" 설정 및 "GADApplicationIdentifier"의 Key 설정
마. Max, AppLovin 사용 시 추가
<key>AppLovinSdkKey</key>
<string>{applovin_app_id 기입 필요}</string>
- AppLovinSdkKey의 Key 설정
Adiscope Overview #
1. Import #
import 'package:adiscope_flutter_plugin/adiscope_flutter_plugin.dart';
2. AdiscopeFlutterPlugin 생성 #
final _adiscopeFlutterPlugin = AdiscopeFlutterPlugin();
3. Initialize #
A. Code에서 Media 없이 Initialize 방법
Future<void> initialize() async {
bool result = await _adiscopeFlutterPlugin.initialize() ?? false;
if (result) {
// Initialize Call Back
} else {
// Initialize Fail
}
}
- Android는 AndroidManifest 파일과 Module Gradle 파일 세팅 필요
- iOS는 Plist 파일 세팅 필요
- App 실행 시 1회 설정 권장
- Adiscope에서는 Google Play 가족 정책을 준수해야 함 (Android 전용 - Adiscope 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 _adiscopeFlutterPlugin.initialize(mediaId, mediaSecret, callbackTag, childYN) ?? false;
if (result) {
// Initialize Call Back
} else {
// Initialize Fail
}
}
- App 실행 시 1회 설정 권장
- Adiscope에서는 Google Play 가족 정책을 준수해야 함 (Android 전용 - Adiscope 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 _adiscopeFlutterPlugin.setUserId(userId) ?? false;
}
Offerwall
,RewardedVideo
,RewardedInterstitial
를 사용하기 위해 ${\color{red}필수}$ 설정- 64자까지 설정 가능
5. Offerwall #
A. Show
Future<void> showOfferwall() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.showOfferwall(unitId) ?? false;
}
Show
가 실행되면 (return값이 True일 경우)onOfferwallAdOpened
와onOfferwallAdFailedToShow
중 하나가 항상 호출되고,onOfferwallAdOpened
가 호출되었다면 이후onOfferwallAdClosed
가 항상 호출
B. Callbacks
AdiscopeListener.setupOfferwallListener(
onOfferwallAdOpened: (unitId) {
},
onOfferwallAdClosed: (unitId) {
},
onOfferwallAdFailedToShow: (unitId, errorDescription, errorXB3TraceID) {
}
);
- Show 성공 시
onOfferwallAdOpened
,onOfferwallAdClosed
callback이 순차적으로 호출
6. RewardedVideo #
A. Load
Future<void> rewardedVideoLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.rewardedVideoLoad(unitId) ?? false;
}
- 해당 유닛에 속한 ad 네크워크들의 광고를 load
onRewardedVideoAdLoaded
callback이 호출되면 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를 여러 번 호출할 수 없음
B. IsLoaded
Future<void> rewardedVideoIsLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.rewardedVideoIsLoad(unitId) ?? false;
if (result) {
// show ad here
} else {
// do something else
}
}
- 광고가 load 되었는지 상태를 확인
C. Show
Future<void> rewardedVideoShow() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.rewardedVideoIsLoad(unitId) ?? false;
if (result) {
bool resultShow = await _adiscopeFlutterPlugin.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를 준비
D. Callback Reward
AdiscopeListener.setupRewardedVideoListener(
onRewardedVideoAdLoaded: (unitId) {
},
onRewardedVideoAdFailedToLoad: (unitId, errorDescription, errorXB3TraceID) {
},
onRewardedVideoAdOpened: (unitId) {
},
onRewardedVideoAdClosed: (unitId) {
},
onRewarded: (unitId, currencyUnit, amount) {
// unitId - 해당 rewarded video ad의 unitId (rewardedVideoShow 시 입력한 값)
// currencyUnit - 보상 type
// amount - 보상의 양
},
onRewardedVideoAdFailedToShow: (unitId, errorDescription, errorXB3TraceID) {
}
);
- 보상이 주어져야 할 경우
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를 통해 전달받은 정보를 기준으로 처리하고,
Load
성공 시onRewardedVideoAdLoaded
, 실패 시onRewardedVideoAdFailedToLoad
가 호출Show
성공 시onRewardedVideoAdOpened
,onRewardedVideoAdClosed
가 순차적으로 호출되고, 실패시onRewardedVideoAdFailedToShow
가 호출
7. Interstitial #
A. Load
Future<void> interstitialLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.interstitialLoad(unitId) ?? false;
}
- 해당 유닛에 속한 ad 네크워크들의 광고를 load
onInterstitialAdLoaded
callback이 호출되면 load가 완료- Load 동작 수행 중에 Load를 여러 번 호출할 수 없음
B. IsLoaded
Future<void> interstitialIsLoad() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.interstitialIsLoad(unitId) ?? false;
if (result) {
// show ad here
} else {
// do something else
}
}
- 광고가 load 되었는지 상태를 확인
C. Show
Future<void> interstitialShow() async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.interstitialIsLoad(unitId) ?? false;
if (result) {
bool resultShow = await _adiscopeFlutterPlugin.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를 준비
D. Callback
AdiscopeListener.setupInterstitialListener(
onInterstitialAdLoaded: (unitId) {
},
onInterstitialAdFailedToLoad: (unitId, errorDescription, errorXB3TraceID) {
},
onInterstitialAdOpened: (unitId) {
},
onInterstitialAdClosed: (unitId) {
},
onInterstitialAdFailedToShow: (unitId, errorDescription, errorXB3TraceID) {
}
);
Load
성공 시onInterstitialAdLoaded
, 실패 시onInterstitialAdFailedToLoad
가 호출Show
성공 시onInterstitialAdOpened
,onInterstitialAdClosed
가 순차적으로 호출되고, 실패시onInterstitialAdFailedToShow
가 호출
8. RewardedInterstitial #
A. PreLoadAll
Future<void> preLoadAllRewardedInterstitial() async {
bool result = await _adiscopeFlutterPlugin.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 _adiscopeFlutterPlugin.preLoadRewardedInterstitial(unitIds) ?? false;
}
- Initialize Call Back 후 1회 설정 권장
- 입력된 유닛들을 Load 진행
C. Show
Future<void> showRewardedInterstitial(String unitId) async {
var unitId = ""; // 관리자를 통해 발급
bool result = await _adiscopeFlutterPlugin.showRewardedInterstitial(unitId) ?? false;
}
- 해당 유닛이 Load되어 있으면 안내 팝업을 보여 준 뒤 해당 광고를 사용자에게 보여줌
- showRewardedInterstitial method는 중복하여 호출 할 수 없음
showRewardedInterstitial
가 실행되면 (return값이 True일 경우)onRewardedInterstitialAdSkip
와onRewardedInterstitialAdOpened
와onRewardedInterstitialAdFailedToShow
중 하나가 항상 호출되고,onRewardedInterstitialAdOpened
가 호출되었다면 이후onRewardedInterstitialAdClosed
가 항상 호출onRewardedInterstitialAdClosed
와onRewardedInterstitialAdFailedToShow
가 호출 되면 내부에서 해당 유닛을 자동 Load 시킴
D. Callbacks
AdiscopeListener.setupRewardedInterstitialListener(
onRewardedInterstitialAdSkip: (unitId) {
},
onRewardedInterstitialAdOpened: (unitId) {
},
onRewardedInterstitialAdClosed: (unitId) {
},
onRewardedInterstitialRewarded: (unitId, currencyUnit, amount) {
// unitId - 해당 rewarded video ad의 unitId (ShowRewardedInterstitial 시 입력한 값)
// currencyUnit - 보상 type
// amount - 보상의 양
},
onRewardedInterstitialAdFailedToShow: (unitId, errorDescription, errorXB3TraceID) {
}
);
- 보상이 주어져야 할 경우
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를 통해 전달받은 정보를 기준으로 처리하고,
showRewardedInterstitial
Skip 시onRewardedInterstitialAdSkip
, 성공 시onRewardedInterstitialAdOpened
,onRewardedInterstitialAdClosed
가 순차적으로 호출되고, 실패시onRewardedInterstitialAdFailedToShow
가 호출
9. Etc #
A. Adiscope SDK Version
Future<void> getSDKVersion() async {
String result = await _adiscopeFlutterPlugin.getSDKVersion() ?? "";
}
- Android와 iOS의 Core SDK Version 확인
B. Adiscope Network Versions
Future<void> getNetworkVersions() async {
String result = await _adiscopeFlutterPlugin.getNetworkVersions() ?? "";
}
- Android와 iOS의 Third Party SDK Versions 확인
C. Volume
Future<void> setVolumeOff() async {
bool isOff = true; // Ad Sound Off
bool isOff = false; // Ad Sound On (Default)
await _adiscopeFlutterPlugin.setVolumeOff(isOff);
if (isOff) {
pushLog("Ad Sound Off");
} else {
pushLog("Ad Sound On");
}
}
Admob
,AppLovin
,Mintegral
,Verve
만 적용 가능
웹사이트 필수 등록 (Android 전용) #
- 관리자에게 전달받은
app-ads.txt
를 웹사이트에 등록
Privacy Manifest 정책 적용 (iOS 전용) #
- 2024년 5월 1일부터 출시/업데이트 되는 앱에 대해 3rd Party Framework의 개인정보 추가