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。

  1. 在Podfile中,将平台需求设置为iOS 12。 ![Bidmad-Guide-Flutter-1]
  2. 使用命令"pod install"安装我们的CocoaPods iOS框架。 ![Bidmad-Guide-Flutter-2]
  3. 现在,打开名为"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设置
  1. 参考Android原生广告布局示例创建XML文件。
  2. 在资源文件下创建一个layout文件夹并将XML文件放入其中。 ![Android-NativeAd-1]
  3. 复制您创建的XML文件名(不包括扩展名)并将其传递给BidmadNativeAdWidget构造函数的layoutName。
BidmadNativeAdWidget(
    onBidmadNativeAdWidgetCreated: _onBidmadNativeAdWidgetCreated,
    layoutName: "nativead_layout",
    width: 400,
    height: 400
),
iOS设置
  1. 参考iOS原生广告布局设置指南创建XIB文件。
  2. 打开Runner.xcworkspace。 ![iOS-Native-1]
  3. 将创建的XIB文件放在项目Runner文件夹内的导航区域中。 ![iOS-Native-2]
  4. 复制您创建的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

1 回复

更多关于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'),
      ),
    );
  }
}
回到顶部