Flutter广告管理插件bidmad_plugin_for_jeomsin的使用
Flutter广告管理插件bidmad_plugin_for_jeomsin的使用
重要提示
从版本1.11.0开始,之前使用的Appkey已更改为AppDomain。 AppDomain与现有的Appkey不兼容,因此必须重新获取新的AppDomain来初始化。 如果您正在更新到版本1.11.0,请联系Techlabs平台运营团队。
简介
BidmadPlugin是一个用于在Flutter中使用Bidmad移动应用广告SDK的插件。 您可以使用该插件在您的Flutter移动应用中展示横幅广告、插屏广告和激励视频广告。 下载Flutter示例
编程指南
1. Android设置
如果您使用的是低于1.0.0的版本,请先参阅此处的迁移指南,然后再继续下面的指南。
1.1 gradle.properties设置
将以下选项添加到gradle.properties文件中:
...
android.enableDexingArtifactTransform=false
1.2 Proguard设置
如果使用Proguard,请添加以下规则:
...
-keep class com.adop.sdk.** { *; }
-keep class ad.helper.openbidding.** { *; }
-keep class com.adop.sdk.adapter.**{ *; }
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# Pangle
-keep class com.bytedance.sdk.** { *; }
-keep class com.bykv.vk.openvk.component.video.api.** { *; }
# Tapjoy
-keep class com.tapjoy.** { *; }
-keep class com.moat.** { *; }
-keepattributes JavascriptInterface
-keepattributes *Annotation*
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
public static final *** NULL;
}
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
@com.google.android.gms.common.annotation.KeepName *;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
-keep class com.google.android.gms.ads.identifier.** { *; }
-dontwarn com.tapjoy.**
1.3 Admob应用ID设置
在AndroidManifest.xml中的application标签下声明以下代码。(查看指南) *检查Admob仪表板中的com.google.android.gms.ads.APPLICATION_ID值。
<application>
...
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="APPLICATION_ID"/>
...
</application>
2. iOS设置
2.1 Xcode版本与隐私声明
- 请使用Xcode 15.3或更高版本进行应用构建和分发。
- 当向App Store提交应用时,请使用以下指南正确设置您的隐私调查表:隐私声明与隐私调查指南
2.2 导入BidmadSDK-iOS CocoaPods
在通过"flutter pub get"将我们的插件添加到您的应用后,会在项目iOS文件夹中生成一个Podfile。
- 在Podfile中,将平台需求设置为iOS 12。 ![Bidmad-Guide-Flutter-1]
- 使用命令"pod install"安装我们的CocoaPods iOS框架。 ![Bidmad-Guide-Flutter-2]
- 现在,打开名为"Runner.xcworkspace"的Xcode工作区文件并继续引导2.2。 ![Bidmad-Guide-Flutter-3]
2.3 Xcode构建设置
在构建设置中选择"禁用Bitcode"。
2.4 Info.plist设置
- 为了让广告网络能够正确控制UI,请在Info.plist设置中添加以下键/值。
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
- 要使用BidmadSDK提供的广告网络,您需要向Info.plist添加SKAdNetworkIdentifier。请将以下SKAdNetworkItems添加到info.plist。
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>
<!-- ... 更多条目 -->
</array>
- 另外,请添加NSUserTrackingUsageDescription,并包含您自己的描述(例如:“App需要访问IDFA以进行跟踪”)到info.plist中。
<key>NSUserTrackingUsageDescription</key>
<string>App需要访问IDFA以进行跟踪</string>
使用插件
3.1 初始化BidmadSDK
执行运行BidmadSDK所需的任务。如果不调用initializeSdk方法,SDK不会允许加载广告。 initializeSdk方法接收App Domain作为参数。 在加载广告之前,请在应用程序启动之初调用initializeSdk方法。 (要检查App Domain,请联系Techlabs平台运营团队。)
if (foundation.defaultTargetPlatform == foundation.TargetPlatform.android) {
FlutterBidmadCommon().initializeSdk("ANDROID APP Domain");
} else if (foundation.defaultTargetPlatform == foundation.TargetPlatform.iOS) {
FlutterBidmadCommon().initializeSdk("IOS APP Domain");
}
对于v1.6.0或以上版本,您可以接收一个回调,指示初始化是否成功完成。
FlutterBidmadCommon common = FlutterBidmadCommon();
if (foundation.defaultTargetPlatform == foundation.TargetPlatform.android) {
common.setInitializeCallbackListener(onInitialized: (bool isInitialized) {
print("Android Initialization Done: $isInitialized");
});
common.initializeSdkWithCallback("ANDROID APP Domain");
} else if (foundation.defaultTargetPlatform == foundation.TargetPlatform.iOS) {
common.setInitializeCallbackListener(onInitialized: (bool isInitialized) {
print("IOS Initialization Done: $isInitialized");
});
common.initializeSdkWithCallback("IOS APP Domain");
}
3.1 横幅广告
3.1.1 基于位置的横幅广告放置
// 横幅广告初始化
FlutterBidmadCommon common = FlutterBidmadCommon();
FlutterBaseBanner banner;
common.initBannerChannel().then((value) {
String _channelNm = value;
banner = FlutterBaseBanner(
channelName: _channelNm
);
banner.setAdInfo("Your Zone Id");
banner.setCallbackListener(
onLoadAd: (BidmadInfo? info){
print("banner onLoadAd");
},
onFailAd: (String error){
print("banner onFailAd");
}
);
// 选项
// banner.setInterval(120); // 横幅刷新时间(60s~120s)
});
// 横幅广告加载
banner.load(300); // 设置Y高度
// 横幅广告移除
banner.removeAdView();
3.1.2 横幅广告小部件
// 横幅广告小部件初始化
Container(
child: BidmadBannerWidget(
onBidmadBannerWidgetCreated: _onWidgetTestCreated,
),
height: 50.0, // 横幅高度(50, 100, 250)
),
// 横幅广告小部件创建回调
void _onWidgetTestCreated(FlutterBaseBanner controller){
controller.setAdInfo("Your Zone Id");
controller.setCallbackListener(
onLoadAd: (BidmadInfo? info){
print("banner onLoadAd");
},
onFailAd: (String error){
print("banner onFailAd");
}
);
controller.loadWidget();
}
3.1.3 预先加载广告并在稍后显示横幅广告小部件(仅支持v1.6.0或更高版本)
// 先加载横幅广告
FlutterBidmadCommon common = FlutterBidmadCommon();
FlutterBaseBannerRefined bannerAd;
common.initBannerRefinedChannel().then((chanNm) {
FlutterBaseBannerRefined.create(channelNm: chanNm, zoneId: "Your Zone Id").then((ad) {
bannerAd = ad;
bannerAd.setCallbackListener(
onLoadAd: (BidmadInfo? info) {
print("bannerAdWidget onLoad");
textView.text = "onLoadAd";
setState(() {
isLoaded = true;
});
},
onFailAd: (String error) {
print("bannerAdWidget onFailAd : "+error);
textView.text = "onFailAd";
},
onClickAd: (BidmadInfo? info) {
print("bannerAdWidget onClickAd");
textView.text = "onClickAd";
});
bannerAd.load();
});
});
// 后续显示横幅广告小部件
Container(
child: isLoaded ? BidmadBannerRefinedWidget(ad: bannerAd) : Text("isLoading..."),
height: 50, // 横幅可以有50、100或250的高度
),
3.2 插屏广告
// 插屏广告初始化
FlutterBidmadCommon common = FlutterBidmadCommon();
FlutterBaseInterstitial interstitial;
common.initInterstitialChannel().then((value) {
String _channelNm = value;
interstitial = FlutterBaseInterstitial(
channelName: _channelNm
);
interstitial.setAdInfo("Your Zone Id");
interstitial.setCallbackListener(
onLoadAd: (BidmadInfo? info){
print("interstitial onLoadAd");
},
onShowAd: (BidmadInfo? info){
print("interstitial onShowAd" );
interstitial.load(); // 广告重新加载
},
onClickAd: (BidmadInfo? info){
print("interstitial onClickAd");
},
onCloseAd: (BidmadInfo? info){
print("interstitial onCloseAd");
},
onFailAd: (String error){
print("interstitial onFailAd");
}
);
});
// 插屏广告加载
interstitial.load();
// 插屏广告显示
interstitial.isLoaded().then((value){
if(value){
interstitial.show();
}
});
3.3 激励视频广告
// 激励视频广告初始化
FlutterBidmadCommon common = FlutterBidmadCommon();
FlutterBaseReward reward;
common.initRewardChannel().then((value) {
String _channelNm = value;
reward = FlutterBaseReward(
channelName: _channelNm
);
reward.setAdInfo("Your Zone Id");
reward.setCallbackListener(
onLoadAd: (BidmadInfo? info){
print("reward onLoadAd");
},
onShowAd: (BidmadInfo? info){
print("reward onShowAd");
reward.load();
},
onCompleteAd: (BidmadInfo? info){
print("reward onCompleteAd");
},
onSkipAd: (BidmadInfo? info){
print("reward onSkippedAd");
},
onCloseAd: (BidmadInfo? info){
print("reward onCloseAd");
},
onClickAd: (BidmadInfo? info){
print("reward onClickAd");
},
onFailAd: (String error){
print("reward onFailAd");
}
);
});
// 激励视频广告加载
reward.load();
// 激励视频广告显示
reward.isLoaded().then((value){
if(value){
reward.show();
}
});
3.4 原生广告小部件
原生广告是一种通过特定的应用程序UI组件向用户展示的广告格式。 由于需要显示原生广告,因此需要特定的应用程序UI设计,这需要对Android和iOS进行额外设置。
Android设置
- 参考Android原生广告布局示例创建XML文件。
- 在资源文件下创建一个layout文件夹并将XML文件放入其中。 ![Android-NativeAd-1]
- 复制您创建的XML文件名(不包括扩展名)并将其传递给BidmadNativeAdWidget构造函数的layoutName。
BidmadNativeAdWidget(
onBidmadNativeAdWidgetCreated: _onBidmadNativeAdWidgetCreated,
layoutName: "nativead_layout",
width: 400,
height: 400
),
iOS设置
- 参考iOS原生广告布局设置指南创建XIB文件。
- 打开Runner.xcworkspace。 ![iOS-Native-1]
- 将创建的XIB文件放在项目Runner文件夹内的导航区域中。 ![iOS-Native-2]
- 复制您创建的XIB文件名(不包括扩展名)并将其传递给BidmadNativeAdWidget构造函数的layoutName。
BidmadNativeAdWidget(
onBidmadNativeAdWidgetCreated: _onBidmadNativeAdWidgetCreated,
layoutName: "IOSNativeAd",
width: 400,
height: 400
),
请求原生广告的示例:
// 横幅广告小部件初始化
Container(
child: BidmadNativeAdWidget(
onBidmadNativeAdWidgetCreated: _onBidmadNativeAdWidgetCreated,
layoutName:"YourXMLorXIBFileName", // 请输入XIB或XML文件名
width: 400,
height: 400
),
),
// 在横幅广告小部件完全创建后,_onBidmadNativeAdWidgetCreated回调会被调用
void _onBidmadNativeAdWidgetCreated(FlutterBaseNativeAd controller) {
controller.setAdInfo("Your Zone ID");
controller.setCallbackListener(
onLoadAd: (BidmadInfo? info) {
print("NativeAd onLoadAd");
},
onFailAd: (String error) {
print("NativeAd onFailAd" + error);
},
onClickAd: (BidmadInfo? info) {
print("NativeAd onClickAd");
}
);
controller.loadWidget();
}
3.5 ATT功能
reqAdTrackingAuthorization()会弹出一个窗口,请求用户同意App跟踪授权。 该函数将返回一组数字字符串值,显示结果。
FlutterBidmadCommon common = FlutterBidmadCommon();
common.reqAdTrackingAuthorization().then(
(value) {
switch (value) {
case "0":
print("App跟踪未确定");
break;
case "1":
print("App跟踪受限授权状态");
break;
case "2":
print("App跟踪拒绝授权状态");
break;
case "3":
print("App跟踪授权状态");
break;
case "4":
print("用户使用的是低于iOS 14的版本");
break;
}
}
);
对于App跟踪未确定,函数将返回0, 对于App跟踪受限授权状态,函数将返回1, 对于App跟踪拒绝授权状态,函数将返回2, 对于App跟踪授权状态,函数将返回3, 最后,如果用户使用的是低于iOS 14的版本,则返回4。
如果您希望通过插件以外的方法获得App跟踪同意, 如果用户同意,True,如果拒绝,传False给setAdvertiserTrackingEnabled。
common.setAdvertiserTrackingEnabled(false);
print(common.getAdvertiserTrackingEnabled());
更多关于Flutter广告管理插件bidmad_plugin_for_jeomsin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter广告管理插件bidmad_plugin_for_jeomsin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
bidmad_plugin_for_jeomsin
是一个 Flutter 插件,用于在 Flutter 应用中集成广告管理和展示功能。以下是如何使用该插件的基本步骤:
1. 添加插件到项目
首先,你需要在 pubspec.yaml
文件中添加插件依赖:
dependencies:
flutter:
sdk: flutter
bidmad_plugin_for_jeomsin: ^1.0.0 # 请根据实际情况使用最新版本
然后运行 flutter pub get
来安装插件。
2. 初始化插件
在你的 Flutter 应用中初始化插件。通常在 main.dart
文件中进行初始化:
import 'package:bidmad_plugin_for_jeomsin/bidmad_plugin_for_jeomsin.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 Bidmad 插件
await BidmadPlugin.initialize(
appKey: 'YOUR_APP_KEY', // 替换为你的应用密钥
);
runApp(MyApp());
}
3. 加载和展示广告
你可以使用插件提供的方法来加载和展示不同类型的广告,例如横幅广告、插页式广告和激励视频广告。
横幅广告
import 'package:bidmad_plugin_for_jeomsin/bidmad_plugin_for_jeomsin.dart';
class BannerAdWidget extends StatefulWidget {
[@override](/user/override)
_BannerAdWidgetState createState() => _BannerAdWidgetState();
}
class _BannerAdWidgetState extends State<BannerAdWidget> {
late BannerAd _bannerAd;
[@override](/user/override)
void initState() {
super.initState();
_bannerAd = BannerAd(
adUnitId: 'YOUR_BANNER_AD_UNIT_ID', // 替换为你的横幅广告单元ID
size: AdSize.banner, // 广告尺寸
listener: BannerAdListener(
onAdLoaded: (Ad ad) {
print('Banner Ad loaded.');
},
onAdFailedToLoad: (Ad ad, LoadAdError error) {
print('Banner Ad failed to load: $error');
},
),
);
_bannerAd.load();
}
[@override](/user/override)
void dispose() {
_bannerAd.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
alignment: Alignment.center,
child: AdWidget(ad: _bannerAd),
width: _bannerAd.size.width.toDouble(),
height: _bannerAd.size.height.toDouble(),
);
}
}
插页式广告
import 'package:bidmad_plugin_for_jeomsin/bidmad_plugin_for_jeomsin.dart';
class InterstitialAdExample extends StatefulWidget {
[@override](/user/override)
_InterstitialAdExampleState createState() => _InterstitialAdExampleState();
}
class _InterstitialAdExampleState extends State<InterstitialAdExample> {
InterstitialAd? _interstitialAd;
[@override](/user/override)
void initState() {
super.initState();
_loadInterstitialAd();
}
void _loadInterstitialAd() {
InterstitialAd.load(
adUnitId: 'YOUR_INTERSTITIAL_AD_UNIT_ID', // 替换为你的插页式广告单元ID
request: AdRequest(),
adLoadCallback: InterstitialAdLoadCallback(
onAdLoaded: (InterstitialAd ad) {
_interstitialAd = ad;
_interstitialAd?.show();
},
onAdFailedToLoad: (LoadAdError error) {
print('InterstitialAd failed to load: $error');
},
),
);
}
[@override](/user/override)
void dispose() {
_interstitialAd?.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Interstitial Ad Example'),
),
body: Center(
child: Text('Interstitial Ad'),
),
);
}
}
激励视频广告
import 'package:bidmad_plugin_for_jeomsin/bidmad_plugin_for_jeomsin.dart';
class RewardedAdExample extends StatefulWidget {
[@override](/user/override)
_RewardedAdExampleState createState() => _RewardedAdExampleState();
}
class _RewardedAdExampleState extends State<RewardedAdExample> {
RewardedAd? _rewardedAd;
[@override](/user/override)
void initState() {
super.initState();
_loadRewardedAd();
}
void _loadRewardedAd() {
RewardedAd.load(
adUnitId: 'YOUR_REWARDED_AD_UNIT_ID', // 替换为你的激励视频广告单元ID
request: AdRequest(),
rewardedAdLoadCallback: RewardedAdLoadCallback(
onAdLoaded: (RewardedAd ad) {
_rewardedAd = ad;
_rewardedAd?.show();
},
onAdFailedToLoad: (LoadAdError error) {
print('RewardedAd failed to load: $error');
},
),
);
}
[@override](/user/override)
void dispose() {
_rewardedAd?.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Rewarded Ad Example'),
),
body: Center(
child: Text('Rewarded Ad'),
),
);
}
}