flutter_unioad是一款集成了穿山甲Android和iOSSDK的Flutter插件,方便直接调用穿山甲SDK方法开发,已支持null safety,体验demo,可通过GTAds实现多个广告平台接入、统一管理。
⚠️ 版本更新必看,不然可能广告加载可能会出现异常 插件更新调整
⚠️ 由于融合SDK与旧版部分api不兼容,2.0.0改动较大,更新后注意查看文档说明
[✓] Flutter (Channel stable, 3.22.1, on macOS 14.5 23F79 darwin-x64, locale zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1)
[✓] Xcode - develop for iOS and macOS (Xcode 15.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2022.1)
[✓] IntelliJ IDEA Ultimate Edition (version 2024.1.2)
[✓] VS Code (version 1.89.1)
[✓] Connected device (3 available)
[✓] Network resources
flutter_unionad: ^latest
引入
import 'package:flutter_unionad/flutter_unionad.dart';
SDK已配置插件中无需额外配置,只需要在android目录中AndroidManifest.xml配置
<manifest ···
xmlns:tools="http://schemas.android.com/tools"
···>
<application
tools:replace="android:label">
SDK已配置插件中,其余根据SDK文档配置,因为使用PlatformView,在Info.plist加入
<key>io.flutter.embedded_views_preview</key>
<true/>
⚠️如果要修改个性化,重新调用初始化方法
await FlutterUnionad.register(
//穿山甲广告 Android appid 必填
androidAppId: "5098580",
//穿山甲广告 ios appid 必填
iosAppId: "5098580",
//appname 必填
appName: "unionad_test",
//使用聚合功能一定要打开此开关,否则不会请求聚合广告,默认这个值为false
//true使用GroMore下的广告位
//false使用广告变现下的广告位
useMediation: true,
//是否为计费用户 选填
paid: false,
//用户画像的关键词列表 选填
keywords: "",
//是否允许sdk展示通知栏提示 选填
allowShowNotify: true,
//是否显示debug日志
debug: true,
//是否支持多进程 选填
supportMultiProcess: false,
//主题模式 默认FlutterUnionAdTheme.DAY,修改后需重新调用初始化
themeStatus: _themeStatus,
//允许直接下载的网络状态集合 选填
directDownloadNetworkType: [
FlutterUnionadNetCode.NETWORK_STATE_2G,
FlutterUnionadNetCode.NETWORK_STATE_3G,
FlutterUnionadNetCode.NETWORK_STATE_4G,
FlutterUnionadNetCode.NETWORK_STATE_WIFI
],
androidPrivacy: AndroidPrivacy(
//是否允许SDK主动使用地理位置信息 true可以获取,false禁止获取。默认为true
isCanUseLocation: false,
//当isCanUseLocation=false时,可传入地理位置信息,穿山甲sdk使用您传入的地理位置信息lat
lat: 0.0,
//当isCanUseLocation=false时,可传入地理位置信息,穿山甲sdk使用您传入的地理位置信息lon
lon: 0.0,
// 是否允许SDK主动使用手机硬件参数,如:imei
isCanUsePhoneState: false,
//当isCanUsePhoneState=false时,可传入imei信息,穿山甲sdk使用您传入的imei信息
imei: "",
// 是否允许SDK主动使用ACCESS_WIFI_STATE权限
isCanUseWifiState: false,
// 当isCanUseWifiState=false时,可传入Mac地址信息
macAddress: "",
// 是否允许SDK主动使用WRITE_EXTERNAL_STORAGE权限
isCanUseWriteExternal: false,
// 开发者可以传入oaid
oaid: "b69cd3cf68900323",
// 是否允许SDK主动获取设备上应用安装列表的采集权限
alist: false,
// 是否能获取android ID
isCanUseAndroidId: false,
// 开发者可以传入android ID
androidId: "",
// 是否允许SDK在申明和授权了的情况下使用录音权限
isCanUsePermissionRecordAudio: false,
// 是否限制个性化推荐接口
isLimitPersonalAds: false,
// 是否启用程序化广告推荐 true启用 false不启用
isProgrammaticRecommend: false,
),
iosPrivacy: IOSPrivacy(
//允许个性化广告
limitPersonalAds: false,
//允许程序化广告
limitProgrammaticAds: false,
//允许CAID
forbiddenCAID: false,
)
);
await FlutterUnionad.getSDKVersion();
FlutterUnionad.requestPermissionIfNecessary(
callBack: FlutterUnionadPermissionCallBack(
notDetermined: () {
print("权限未确定");
},
restricted: () {
print("权限限制");
},
denied: () {
print("权限拒绝");
},
authorized: () {
print("权限同意");
},
),
);
Android获取定位、照片权限,只返回成功
Android相关权限为非必须权限,可选择在AndroidManifest.xml中声明
IOS 版本14及以上获取ATT权限,根据返回结果具体操作业务逻辑
FlutterUnionadSplashAdView(
//android 开屏广告广告id 必填 889033013 102729400
androidCodeId: "102729400",
//ios 开屏广告广告id 必填
iosCodeId: "102729400",
//是否支持 DeepLink 选填
supportDeepLink: true,
// 期望view 宽度 dp 选填
width: MediaQuery.of(context).size.width,
//期望view高度 dp 选填
height: MediaQuery.of(context).size.height - 100,
//是否影藏跳过按钮(当影藏的时候显示自定义跳过按钮) 默认显示
hideSkip: false,
//超时时间
timeout: 3000,
callBack: FlutterUnionadSplashCallBack(
onShow: () {
print("开屏广告显示");
setState(() => _offstage = false);
},
onClick: () {
print("开屏广告点击");
},
onFail: (error) {
print("开屏广告失败 $error");
Navigator.pop(context);
},
onFinish: () {
print("开屏广告倒计时结束");
Navigator.pop(context);
},
onSkip: () {
print("开屏广告跳过");
Navigator.pop(context);
},
onTimeOut: () {
print("开屏广告超时");
},
),
),
FlutterUnionadBannerView(
//andrrid banner广告id 必填
androidCodeId: "102735527",
//ios banner广告id 必填
iosCodeId: "102735527",
// 期望view 宽度 dp 必填
width: 600.5,
//期望view高度 dp 必填
height: 120.5,
//广告事件回调 选填
callBack: FlutterUnionadBannerCallBack(onShow: () {
print("banner广告加载完成");
}, onDislike: (message) {
print("banner不感兴趣 $message");
}, onFail: (error) {
print("banner广告加载失败 $error");
}, onClick: () {
print("banner广告点击");
},
),
),
//个性化模板信息流广告
FlutterUnionadNativeAdView(
//android 信息流广告id 必填
androidCodeId: "102730271",
//ios banner广告id 必填
iosCodeId: "102730271",
//是否支持 DeepLink 选填
supportDeepLink: true,
// 期望view 宽度 dp 必填
width: 375.5,
//期望view高度 dp 必填
height: 0,
callBack: FlutterUnionadNativeCallBack(
onShow: () {
print("信息流广告显示");
},
onFail: (error) {
print("信息流广告失败 $error");
},
onDislike: (message) {
print("信息流广告不感兴趣 $message");
},
onClick: () {
print("信息流广告点击");
},
),
),
预加载激励视频广告
FlutterUnionad.loadRewardVideoAd(
//是否个性化 选填
androidCodeId: "102733764",
//Android 激励视频广告id 必填
iosCodeId: "102733764",
//ios 激励视频广告id 必填
rewardName: "200金币",
//奖励名称 选填
rewardAmount: 200,
//奖励数量 选填
userID: "123",
// 用户id 选填
orientation: FlutterUnionadOrientation.VERTICAL,
//视屏方向 选填
mediaExtra: null,
//扩展参数 选填
);
显示激励视频广告
await FlutterUnionad.showRewardVideoAd();
监听激励视频结果
FlutterUnionad.FlutterUnionadStream.initAdStream(
//激励广告
flutterUnionadRewardAdCallBack: FlutterUnionadRewardAdCallBack(
onShow: (){
print("激励广告显示");
},
onClick: (){
print("激励广告点击");
},
onFail: (error){
print("激励广告失败 $error");
},
onClose: (){
print("激励广告关闭");
},
onSkip: (){
print("激励广告跳过");
},
onVerify: (rewardVerify,rewardAmount,rewardName){
print("激励广告奖励 $rewardVerify $rewardAmount $rewardName");
},
onReady: () async{
print("激励广告预加载准备就绪");
},
onCache: () async {
print("激励广告物料缓存成功。建议在这里进行广告展示,可保证播放流畅和展示流畅,用户体验更好。");
await FlutterUnionad.showRewardVideoAd();
},
onUnReady: (){
print("激励广告预加载未准备就绪");
},
onRewardArrived: (rewardVerify, rewardType, rewardAmount, rewardName,
errorCode, error, propose) {
print(
"阶段激励广告奖励 验证结果=$rewardVerify 奖励类型<FlutterUnionadRewardType>=$rewardType 奖励=$rewardAmount"
"奖励名称$rewardName 错误码=$errorCode 错误$error 建议奖励$propose");
}),
),
);
FlutterUnionadDrawFeedAdView(
androidCodeId: "102734241",
iosCodeId: "102734241",
//是否支持 DeepLink 选填
width: 600.5,
// 期望view 宽度 dp 必填
height: 800.5,
callBack: FlutterUnionadDrawFeedCallBack(
onShow: () {
print("draw广告显示");
},
onFail: (error) {
print("draw广告加载失败 $error");
},
onClick: () {
print("draw广告点击");
},
onDislike: (message) {
print("draw点击不喜欢 $message");
},
onVideoPlay: () {
print("draw视频播放");
},
onVideoPause: () {
print("draw视频暂停");
},
onVideoStop: () {
print("draw视频结束");
},
),
);
预加载新模版渲染插屏广告
FlutterUnionad.loadFullScreenVideoAdInteraction(
//android 全屏广告id 必填
androidCodeId: "102735530",
//ios 全屏广告id 必填
iosCodeId: "102735530",
//视屏方向 选填
orientation: FlutterUnionadOrientation.VERTICAL,
);
显示新模版渲染插屏广告
await FlutterUnionad.showFullScreenVideoAdInteraction();
新模版渲染插屏广告结果监听
FlutterUnionad.FlutterUnionadStream.initAdStream(
// 新模板渲染插屏广告回调
flutterUnionadNewInteractionCallBack: FlutterUnionadNewInteractionCallBack(
onShow: () {
print("新模板渲染插屏广告显示");
},
onSkip: () {
print("新模板渲染插屏广告跳过");
},
onClick: () {
print("新模板渲染插屏广告点击");
},
onFinish: () {
print("新模板渲染插屏广告结束");
},
onFail: (error) {
print("新模板渲染插屏广告错误 $error");
},
onClose: () {
print("新模板渲染插屏广告关闭");
},
onReady: () async{
print("新模板渲染插屏广告预加载准备就绪");
//显示新模板渲染插屏
await FlutterUnionad.showFullScreenVideoAdInteraction();
},
onUnReady: (){
print("新模板渲染插屏广告预加载未准备就绪");
},
),
);
获取主题模式
// 0正常模式 1夜间模式
_themeStatus = await FlutterUnionad.getThemeStatus();
切换主题模式
修改初始化中themeStatus参数,重新调用初始化
插件 | 地址 |
---|---|
字节-穿山甲广告插件 | flutter_unionad |
腾讯-优量汇广告插件 | flutter_tencentad |
百度-百青藤广告插件 | baiduad |
字节-Gromore聚合广告 | gromore |
Sigmob广告 | sigmobad |
聚合广告插件(迁移至GTAds) | flutter_universalad |
GTAds聚合广告 | GTAds |
字节穿山甲内容合作插件 | flutter_pangrowth |
文档预览插件 | file_preview |
滤镜 | gpu_image |
Email: gstory0404@gmail.com