Flutter可扩展聚合广告插件GTAds
由于之前flutter_universalad开发时未考虑到扩展性,后面在接入新的广告商时发现接入很麻烦,所以对插件进行重构,开发了GTAds,能够按需加载需要的广告,也可以通过简单的接入就实现自定义广告,开发者无需关注广告的展示,插件会根据配置自动选择不同的广告商广告进行展示,暂时不支持bidding模式。
广告的展示选择通过传入的展示概率来选择展示。
一、支持插件
- gtads(本体)
- gtads_csj(穿山甲广告支持)
- gtads_ylh(优量汇广告支持)
- gtads_sigmob(Sigmob广告支持)
除gtads本体必须引入外,其余广告可以按需引入。如果想要的广告不支持,则可以通过通过扩展接口进行自定义广告接入。
//广告基础库 必须引入
gtads: ^0.0.6
//需要使用的广告按需引入,以下可选
//穿山甲广告
gtads_csj: ^0.0.5
//优量汇广告
gtads_ylh: ^0.0.2
//Sigmob广告
gtads_sigmob: ^0.0.1
2、引入
import 'package:gtads/gtads.dart';
3、添加广告
广告初始化前必须完成添加
GTAds.addProvider([GTAdsCsjProvider("csj","5098580","5098580")]);
GTAdsCsjProviderc参数
alias: 广告别名,必须保证唯一,后续广告加载回调将返回这个别名 识别是哪家的广告
androidId: andorid appId
iosId: ios appId
4、初始化
//isDebug 是否开启debug日志
await GTAds.init(isDebug: true);
//return [{csj: true}],添加的广告初始化结果
5、横幅广告
GTAdsBannerWidget(
//需要的广告位数组
codes: [GTAdsCode(alias: "csj", probability: 5,androidId: "945410197",iosId: "945410197")],
//宽
width: 300,
//高
height: 400,
//超时时间 当广告失败后会依次重试其他广告 直至所有广告均加载失败 设置超时时间可提前取消
timeout: 5,
//回调
callBack: GTAdsCallBack(
onShow: (code) {
print("Banner显示 ${code.toJson()}");
},
onClick: (code) {
print("Banner点击 ${code.toJson()}");
},
onFail: (code,message) {
print("Banner错误 ${code.toJson()} $message");
},
onClose: (code) {
print("Banner关闭 ${code.toJson()}");
},
)),
6、激励广告
var b = await GTAds.rewardAd(
//需要的广告位数组
codes: [GTAdsCode(alias: "csj", probability: 5,androidId: "945418088",iosId: "945418088")],
//奖励名称
rewardName: "100金币",
//奖励数量
rewardAmount: 100,
//用户id
userId: "user100",
//扩展参数
customData: "123",
//超时时间 当广告失败后会依次重试其他广告 直至所有广告均加载失败 设置超时时间可提前取消
timeout: 5,
callBack: GTAdsCallBack(
onShow: (code) {
print("激励广告显示 ${code.toJson()}");
}, onFail: (code, message) {
print("激励广告失败 ${code.toJson()} $message");
}, onClick: (code) {
print("激励广告点击 ${code.toJson()}");
}, onClose: (code) {
print("激励广告关闭 ${code.toJson()}");
}, onVerify: (code, verify, transId, rewardName,
rewardAmount) {
print(
"激励广告关闭 ${code.toJson()} $verify $transId $rewardName $rewardAmount");
}, onExpand: (code, param) {
print("激励广告自定义参数 ${code.toJson()} $param");
}),
);
if (b) {
print("激励广告开始请求");
}else{
print("激励广告开始请求失败");
}
7、插屏广告
var b = await GTAds.insertAd(
//需要的广告位组
codes: [GTAdsCode(alias: "csj", probability: 5,androidId: "946201351",iosId: "946201351")],
isFull: false,
width: 300,
height: 500,
//超时时间 当广告失败后会依次重试其他广告 直至所有广告均加载失败 设置超时时间可提前取消
timeout: 5,
callBack: GTAdsCallBack(
onShow: (code) {
print("插屏广告显示 ${code.toJson()}");
},
onFail: (code, message) {
print("插屏广告失败 ${code.toJson()} $message");
},
onClick: (code) {
print("插屏广告点击 ${code.toJson()}");
},
onClose: (code) {
print("插屏广告关闭 ${code.toJson()}");
},
));
8、开屏广告
GTAdsSplashWidget(
//需要的广告位组
codes: [GTAdsCode(alias: "csj", probability: 5,androidId: "887367774",iosId: "887367774")],
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
//超时时间 当广告失败后会依次重试其他广告 直至所有广告均加载失败 设置超时时间可提前取消
timeout: 5,
callBack: GTAdsCallBack(
onShow: (code) {
print("开屏显示 ${code.toJson()}");
},
onClick: (code) {
print("开屏点击 ${code.toJson()}");
},
onFail: (code, message) {
print("开屏错误 ${code.toJson()} $message");
Navigator.pop(context);
},
onClose: (code) {
print("开屏关闭 ${code.toJson()}");
Navigator.pop(context);
},
),
),
9、信息流
GTAdsNativeWidget(
//需要的广告位组
codes: [GTAdsCode(alias: "csj", probability: 5,androidId: "945417699",iosId: "945417699")],
width: 300,
height: 200,
//超时时间 当广告失败后会依次重试其他广告 直至所有广告均加载失败 设置超时时间可提前取消
timeout: 5,
callBack: GTAdsCallBack(
onShow: (code) {
print("信息流显示 ${code.toJson()}");
},
onClick: (code) {
print("信息流点击 ${code.toJson()}");
},
onFail: (code,message) {
print("信息流错误 ${code.toJson()} $message");
},
onClose: (code) {
print("信息流关闭 ${code.toJson()}");
},
),
),
三、广告位GTAdsCode说明
【Flutter可扩展聚合广告插件GTAds】如果不想展示某个广告商的广告,则可以通过不传入该广告的code来显示
//别名 需要与GTAds.addProvider传入的Provider别名保持一致 不然无法加载对应广告
String alias = "";
//当前广告位 androidid
String? androidId;
//当前广告位 iosid
String? iosId;
//当前广告位出现的概率 必须大于0,如果小于0则不会加载该广告
int probability = 0;
四、广告扩展
通过继承实现GTAdsProvider类来实现自定义广告接入
class MYAdProvider extends GTAdsProvider{MYAdProvider(
{required String alias,
String? androidId,
String? iosId})
: super(alias, androidId, iosId);
@override
Future initAd(bool isDebug) {
// TODO: 调用广告初始化,返回是否成功
throw UnimplementedError();
}@override
Widget? bannerAd(GTAdsCode adCode, double width, double height, GTAdsCallBack? callBack) {
// TODO: 返回一个横幅广告Widget,如果不支持则返回null
throw UnimplementedError();
}@override
Future insertAd(GTAdsCode adCode, bool isFull, double? width, double? height, GTAdsCallBack? callBack) {
// TODO: 调用插屏广告方法,如果不支持则返回null
throw UnimplementedError();
}@override
Widget? nativeAd(GTAdsCode adCode, double width, double height, GTAdsCallBack? callBack) {
// TODO: 返回一个信息流广告Widget,如果不支持则返回null
throw UnimplementedError();
}@override
Future rewardAd(GTAdsCode adCode, String rewardName, int rewardAmount, String userId, String customData, GTAdsCallBack? callBack) {
// TODO: 调用激励广告方法,如果不支持则返回null
throw UnimplementedError();
}@override
Widget? splashAd(GTAdsCode adCode, double width, double height, GTAdsCallBack? callBack) {
// TODO: 返回一个开屏广告Widget,如果不支持则返回null
throw UnimplementedError();
}}
五、说明
个人开发时间有限目前仅显示了穿山甲、优量汇、Sigmob的广告接入,后续有空会实现其他的广告。如果有小伙伴实现了其他的广告,欢迎pr、或者提供插件链接,如果没问题可以加入的插件支持列表中。
推荐阅读
- flutter轮子计划之进度条
- flutter|【Flutter混合开发踩坑日记之‘applicationVariants‘ for extension ‘android‘】
- flutter系列之:用来管理复杂状态的State详解
- Flutter学习第四课(SharedPreferences本地存储的简单使用)
- flutter系列之:widgets,构成flutter的基石
- mongoDB|mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
- 网约车|大厂入局网约车,聚合模式成捷径?
- Android知识点——Java的依赖、关联、聚合和组合
- Flutter 学习第二课(Dio网络请求简单用法和数据适配)
- Flutter|Flutter GetPageRoute实现嵌套导航学习