adiscope_flutter_plugin 0.0.4 copy "adiscope_flutter_plugin: ^0.0.4" to clipboard
adiscope_flutter_plugin: ^0.0.4 copied to clipboard

Adiscope SDK for Flutter plugin project.

Adiscope Flutter Plugin #

GitHub package.json version GitHub package.json version GitHub package.json version GitHub package.json version

  • Android Target API Level : 31+
  • Android Minimum API Level : 21
  • iOS Minimum Version : 12.0
  • Xcode Minimum Version : Xcode 15.1

Contents #

Add the Adiscope package to Your Project

Adiscope Overview

웹사이트 필수 등록

Privacy Manifest 정책 적용

iOS 16+ Offerwall 세로 모드 전환 적용 방법(가로모드 전용일 경우)

Adiscope Error Information

etc

Add the Adiscope package to Your Project #

1. Installation #

flutter pub add adiscope_flutter_plugin
  • 프로젝트의 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 복사해서 변경 없이 추가)

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 연동 시 추가
    }
}
  • TNK SDK는 Maven Central에 배포
  • 프로젝트 파일 내에 {projectroot}/android/build.gradle 파일에 maven 추가
나. 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.6.3'
    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.2'            // 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 추가

3. Setup iOS #

A. Setup Podfile

target 'Runner' do
  use_frameworks!
  use_modular_headers!
  pod 'AdiscopeMediaAdManager', '3.6.0'    // admanager
  pod 'AdiscopeMediaAdMob', '3.6.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 추가

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](#a-setup-androidmanifest) 파일과 [Module Gradle](나-setup-module-gradle) 파일 세팅 필요
  • iOS는 [Plist](#가-adiscopemediaid-adiscopemediasecret-추가) 파일 세팅 필요
  • App 실행 시 1회 설정 권장
  • Adiscope에서는 Google Play 가족 정책을 준수해야 함 (Android 전용 - Adiscope Google Play 가족 정책 확인)
    • ${정책\ {\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}미준수시}}\ 광고에\ 제한이\ 생김$ (광고 물량 축소 및 오퍼월 진입 불가)

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일 경우) onOfferwallAdOpenedonOfferwallAdFailedToShow 중 하나가 항상 호출되고, 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가 실행되면 onRewardedVideoAdLoadedonRewardedVideoAdFailedToLoad 중 하나의 callback은 항상 호출
  • Rewarded Video Ad의 LoadShow는 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일 경우) onRewardedVideoAdOpenedonRewardedVideoAdFailedToShow 중 하나가 항상 호출되고, onRewardedVideoAdOpened가 호출되었다면 이후 onRewardedVideoAdClosed가 항상 호출
  • Rewarded Video Ad의 LoadShow는 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는 보통 onRewardedVideoAdOpenedonRewardedVideoAdClosed 사이에 호출되는 경우가 많으나 광고 System의 상황에 따라 달라 질 수 있음
  • onRewarded가 호출되지 않는 경우도 존재할 수 있음(Reward 설정을 Server-to-server로 하였다면, Video 시청 후에는 OnRewarded가 호출되지 않음)
  • Reward 정보는 abusing 방지를 위해서 Server-to-server 방식으로 전달 받는 것을 권장
  • Server-to-server 방식을 선택하더라도 보상이 전달 될 시에는 onRewarded가 호출
    • 이때는 Server를 통해 전달받은 정보를 기준으로 처리하고, onRewarded를 통해 전달받은 정보는 검증용으로 사용하거나 무시하도록 함
  • 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일 경우) onInterstitialAdLoadedonInterstitialAdFailedToLoad 중 하나가 항상 호출되고, onInterstitialAdOpened가 호출되었다면 이후 onInterstitialAdClosed가 항상 호출
  • Rewarded Video Ad의 LoadShow는 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일 경우) onRewardedInterstitialAdSkiponRewardedInterstitialAdOpenedonRewardedInterstitialAdFailedToShow 중 하나가 항상 호출되고, onRewardedInterstitialAdOpened가 호출되었다면 이후 onRewardedInterstitialAdClosed가 항상 호출
  • onRewardedInterstitialAdClosedonRewardedInterstitialAdFailedToShow가 호출 되면 내부에서 해당 유닛을 자동 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는 보통 onRewardedInterstitialAdOpenedonRewardedInterstitialAdClosed 사이에 호출되는 경우가 많으나 광고 System의 상황에 따라 달라 질 수 있음
  • onRewardedInterstitialRewarded가 호출되지 않는 경우도 존재할 수 있음(Reward 설정을 Server-to-server로 하였다면, Video 시청 후에는 OnRewarded가 호출되지 않음)
  • Reward 정보는 abusing 방지를 위해서 Server-to-server 방식으로 전달 받는 것을 권장
  • Server-to-server 방식을 선택하더라도 보상이 전달 될 시에는 onRewardedInterstitialRewarded가 호출
    • 이때는 Server를 통해 전달받은 정보를 기준으로 처리하고, onRewardedInterstitialRewarded를 통해 전달받은 정보는 검증용으로 사용하거나 무시하도록 함
  • showRewardedInterstitial Skip 시 onRewardedInterstitialAdSkip, 성공 시 onRewardedInterstitialAdOpened, onRewardedInterstitialAdClosed가 순차적으로 호출되고, 실패시 onRewardedInterstitialAdFailedToShow가 호출

웹사이트 필수 등록 (Android 전용) #

  • 관리자에게 전달받은 app-ads.txt를 웹사이트에 등록

Privacy Manifest 정책 적용 (iOS 전용) #

  • 2024년 5월 1일부터 출시/업데이트 되는 앱에 대해 3rd Party Framework의 개인정보 추가

iOS 16+ Offerwall 세로 모드 전환 적용 방법(가로모드 전용일 경우) #

Adiscope Error Information #

Adiscope Sample App #

Releases #

LICENSE #

1
likes
0
points
189
downloads

Publisher

unverified uploader

Weekly Downloads

Adiscope SDK for Flutter plugin project.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on adiscope_flutter_plugin