Introduce
BidmadPlugin is a plugin for using Bidmad, a mobile app advertisement SDK, in Flutter.
You can use the plugin to serve banner/interstitial/reward ads in your flutter mobile app.
*If only Android is supported in the current version, iOS will be supported soon.
Programming Guide
1. Android Setting
1.1 Build.gradle Setting
Add Build Gradle settings to apply Android SDK.
repositories {
...
google()
jcenter()
maven { url "http://devrepo.kakao.com:8088/nexus/content/groups/public/" } //Adfit
maven {
url "s3://repo.cauly.net/releases"
credentials(AwsCredentials) {
accessKey "AKIAWRZUK5MFKYVSUOLB"
secretKey "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"
}
} //Cauly
maven { url "https://bidmad-sdk.s3.amazonaws.com/" } //bidmad
maven { url "https://sdk.tapjoy.com/" } //Tapjoy
maven { url "https://artifact.bytedance.com/repository/pangle" } //Pangle
maven { url "https://jitpack.io" } //Adpie
}
dependencies {
...
implementation 'com.adop.sdk:bidmad-androidx:1.14.2'
}
1.2 Init Channel
Set Bidmad Channel in MainActivity to communicate with AndroidSDK.
...
import com.adop.sdk.FlutterCommon
class MainActivity: FlutterActivity() {
private var binaryMessenger: BinaryMessenger? = null
private var common : FlutterCommon? = null
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
binaryMessenger = flutterEngine.dartExecutor.binaryMessenger
common = FlutterCommon(this, flutterEngine);
common!!.initChannel(binaryMessenger)
}
}
1.3 gradle.properties Setting
Add the options below to gradle.properties
...
android.enableDexingArtifactTransform=false
2. iOS Setting
2.1 import BidmadSDK-iOS CocoaPods
Please add the following in your podfile and install.
platform :ios, "11.0"
target "Runner" do
use_frameworks!
pod "BidmadSDK/ForFlutter", "2.9.1"
2.2 Xcode Build Setting
Select "No" for Enable Bitcode under your Build Setting.
2.3 Setting SKAdNetwork
To use AdNetworks provided by BidmadSDK, you need to add SKAdNetworkIdentifier to Info.plist. Please add SKAdNetworkItems below to info.plist.
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>v9wttpbfk9.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>n38lu8286q.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4dzt52r2t5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>bvpn9ufa9b.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>2u9pt9hc89.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4468km3ulz.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>4fzdc2evr5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>7ug5zh24hu.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>8s468mfl3y.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9rd848q2bz.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>9t245vhmpl.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>av6w8kgt66.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>f38h382jlk.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>hs6bdukanm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>kbd757ywx3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ludvb6z3bs.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>m8dbw4sv7c.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>mlmmfzh3r3.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>prcb7njmu6.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>t38b2kh725.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>tl55sbb4fm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>wzmmz9fp6w.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>yclnxrl5pm.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>ydx93a7ass.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
</array>
Also, please add NSUserTrackingUsageDescription with your own description of why you would like to track user data (e.g. "App would like to access IDFA for tracking purpose") into info.plist
...
<key>NSUserTrackingUsageDescription</key>
<string>App would like to access IDFA for tracking purpose</string>
...
2.4 Init Channel
Set Bidmad Channel in the "application" method of AppDelegate file to communicate with BidmadSDK.
...
#import <BidmadSDK/BIDMADFlutterCommon.h>
...
BIDMADFlutterCommon* common = [BIDMADFlutterCommon new];
[common initChannel: [registry registrarForPlugin:@"FlutterPlugin"]]; // registry is a type of NSObject<FlutterPluginRegistry>*
3. Using Plugin
3.1 Banner AD
The following is an example of requesting a Banner ad.
3.1.1 Banner placement based on position
....//Banner init
FlutterBidmadCommon common = FlutterBidmadCommon();
FlutterBaseBanner banner;
common.initBannerChannel().then((value) {
String _channelNm = value;
banner = FlutterBaseBanner(
channelName: _channelNm
);
banner.setAdInfo("Your Zone Id");
banner.setCallbackListener(
onLoadAd: (String zoneId){
print("banner onLoadAd");
},
onFailAd: (String zoneId){
print("banner onFailAd");
}
);
//option
//banner.setInterval(120); //banner refresh time(60s~120s)
});
....//Banner Load
banner.load(300); //set Position Y(height)
....//Banner Remove
banner.removeAdView();
3.1.2 Banner Widget
....//Banner Widget init
Container(
child: BidmadBannerWidget(
onBidmadBannerWidgetCreated: _onWidgetTestCreated,
),
height: 50.0, //Banner Height(50, 100, 250)
),
....//onBidmadBannerWidgetCreated
void _onWidgetTestCreated(FlutterBaseBanner controller){
controller.setAdInfo("Your Zone Id");
controller.setCallbackListener(
onLoadAd: (String zoneId){
print("banner onLoadAd");
},
onFailAd: (String zoneId){
print("banner onFailAd");
}
);
controller.loadWidget();
}
3.2 Interstitial AD
The following is an example of requesting a Interstitial ad.
....//Interstitial init
FlutterBidmadCommon common = FlutterBidmadCommon();
FlutterBaseInterstitial interstitial;
common.initInterstitialChannel().then((value) {
String _channelNm = value;
interstitial = FlutterBaseInterstitial(
channelName: _channelNm
);
interstitial.setAdInfo("Your Zone Id");
interstitial.setCallbackListener(
onLoadAd: (String zoneId){
print("interstitial onLoadAd");
},
onShowAd: (String zoneId){
print("interstitial onShowAd" );
interstitial.load(); //Ad Reload
},
onCloseAd: (String zoneId){
print("interstitial onCloseAd");
},
onFailAd: (String zoneId){
print("interstitial onFailAd");
}
);
});
....//Interstitial Load
interstitial.load();
....//Interstitial Show
interstitial.isLoaded().then((value){
if(value){
interstitial.show();
}
});
3.3 Reward AD
The following is an example of requesting a Reward ad.
....//Reward init
FlutterBidmadCommon common = FlutterBidmadCommon();
FlutterBaseReward reward;
common.initRewardChannel().then((value) {
String _channelNm = value;
reward = FlutterBaseReward(
channelName: _channelNm
);
reward.setAdInfo("Your Zone Id");
reward.setCallbackListener(
onLoadAd: (String zoneId){
print("reward onLoadAd");
},
onShowAd: (String zoneId){
print("reward onShowAd");
reward.load();
},
onCompleteAd: (String zoneId){
print("reward onCompleteAd");
},
onSkipAd: (String zoneId){
print("reward onSkippedAd");
},
onCloseAd: (String zoneId){
print("reward onCloseAd");
},
onClickAd: (String zoneId){
print("reward onClickAd");
},
onFailAd: (String zoneId){
print("reward onFailAd");
}
);
});
....//Reward Load
reward.load();
....//Reward Show
reward.isLoaded().then((value){
if(value){
reward.show();
}
});
3.4 ATT Functions
reqAdTrackingAuthorization() displays a popup, requesting for App Tracking Consent from user. And the function will return set of number string values, showing the result.
FlutterBidmadCommon common = FlutterBidmadCommon();
common.reqAdTrackingAuthorization().then(
(value) {
switch (value) {
case "0":
print("App Tracking Not Determined");
break;
case "1":
print("App Tracking Restricted Authoriziation Status");
break;
case "2":
print("App Tracking Denied Authorization Status");
break;
case "3":
print("App Tracking Authorized Authorization Status");
break;
case "4":
print("user is on lower version than iOS 14");
break;
}
}
);
For App Tracking Not Determined, the function will return 0, For App Tracking Restricted Authoriziation Status, the function will return 1, For App Tracking Denied Authorization Status, the function will return 2, For App Tracking Authorized Authorization Status the function will return 3, and Lastly, if the user is on lower version than iOS 14 then it will return 4.
If you wish to obtain app tracking consent through a method other than what's provided by Plugin, If the user agrees, True, and if rejected, pass False to setAdvertiserTrackingEnabled.
common.setAdvertiserTrackingEnabled(false);
print(common.getAdvertiserTrackingEnabled());
4. Plugin Interface
4.1 FlutterBaseBanner
*Banner ads are handled through FlutterBaseBanner and this is a list of functions for that.
Function | Description |
---|---|
FlutterBaseBanner(@required String channelName) | This is the FlutterBaseBanner constructor, Receives the Name for Channel creation as a Param. |
Future(void) load(int y) | Request a banner ad. When a banner ad is exposed, the banner is exposed at height y (center alignment). |
Future(void) loadWidget() | Request a banner ad. In order for the function to function properly, FlutterBaseBanner object must be obtained through the BidmadBannerWidget Class. |
Future(void) setInterval(int sec) | Set the banner refresh cycle.(60s~120s) |
Future(void) setAdInfo(String zoneId) | Set the issued ZoneId. |
Future(void) hideBanner() | Hide the banner View |
Future(void) showBanner() | Show the banner View. |
Future(void) removeBanner() | Remove the exposed banner. |
void Function(String zoneId) onLoadAd | If a listener is registered, the registered function is called when ad load. |
void Function(String zoneId) onFailAd | If a listener is registered, the registered function is called when ad load fail. |
4.2 BidmadBannerWidget
*For banner ads in the form of a widget, it must be processed through BidmadBannerWidget, and this is a list of functions for that.
Function | Description |
---|---|
BidmadBannerWidget(BidmadBannerWidgetCreatedCallback onBidmadBannerWidgetCreated) | This is the BidmadBannerWidget constructor. After creating the widget, it receives a callback for processing. |
onBidmadBannerWidgetCreated(FlutterBaseBanner controller) | It is a callback that can receive a FlutterBaseBanner and handle banner related processing. |
4.3 FlutterBaseInterstitial
*Interstitial ads are handled through FlutterBaseInterstitial and this is a list of functions for that.
Function | Description |
---|---|
FlutterBaseInterstitial(@required String channelName) | This is the FlutterBaseInterstitial constructor, Receives the Name for Channel creation as a Param. |
Future(void) load() | Request a interstitial ad |
Future(void) show() | Display the loaded interstitial ad |
Future(bool) isLoaded() | Check if the ad is loaded. |
Future(void) setAdInfo(String zoneId) | Set the issued ZoneId. |
void Function(String zoneId) onLoadAd | If a listener is registered, the registered function is called when ad load. |
void Function(String zoneId) onShowAd | If a listener is registered, the registered function is called when ad show. |
void Function(String zoneId) onFailAd | If a listener is registered, the registered function is called when ad load fail. |
void Function(String zoneId) onCloseAd | If a listener is registered, the registered function is called when ad close. |
4.4 FlutterBaseReward
*Reward ads are handled through FlutterBaseReward and this is a list of functions for that.
Function | Description |
---|---|
FlutterBaseReward(@required String channelName) | This is the FlutterBaseReward constructor, Receives the Name for Channel creation as a Param. |
Future(void) load() | Request a reward ad. |
Future(void) show() | Display the loaded reward ad. |
Future(bool) isLoaded() | Check if the ad is loaded. |
Future(void) setAdInfo(String zoneId) | Set the issued ZoneId. |
void Function(String zoneId) onLoadAd | If a listener is registered, the registered function is called when ad load. |
void Function(String zoneId) onShowAd | If a listener is registered, the registered function is called when ad show. |
void Function(String zoneId) onFailAd | If a listener is registered, the registered function is called when ad load fail. |
void Function(String zoneId) onCompleteAd | If a listener is registered, the registered function is called when ad complate. |
void Function(String zoneId) onCloseAd | If a listener is registered, the registered function is called when ad close. |
void Function(String zoneId) onClickAd | If a listener is registered, the registered function is called when ad click. |
void Function(String zoneId) onSkipAd | If a listener is registered, the registered function is called when ad skip. |
4.5 FlutterBidmadCommon
*This is a list of functions available through BidmadCommon.
Function | Description |
---|---|
FlutterBidmadCommon() | This is the FlutterBidmadCommon constructor |
Future(void) setDebugging(bool isDebug) | Debugging log output |
Future(String) initBannerChannel() | Creating a channel for controlling banner ad |
Future(String) initInterstitialChannel() | Creating a channel for controlling interstitial ad |
Future(String) initRewardChannel() | Creating a channel for controlling reward ad |
Future(String) reqAdTrackingAuthorization() | Requesting for App Tracking Consent from user |
Future(void) setAdvertiserTrackingEnabled(bool enable) | Setting ATT Setting manually |
Future(bool) getAdvertiserTrackingEnabled() | Getting ATT Setting, true if consent and false if not consent |