연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
字节跳动穿山甲广告 Flutter版本
简介
flutter_unioad是一款集成了穿山甲Android和iOSSDK的Flutter插件,方便直接调用穿山甲SDK方法开发,已支持null safety,体验demo ,可通过GTAds 实现多个广告平台接入、统一管理。
官方文档
版本更新
更新日志
注意事项
⚠️ 版本更新必看,不然可能广告加载可能会出现异常
插件更新调整
⚠️ 由于融合SDK与旧版部分api不兼容,2.0.0 改动较大,更新后注意查看文档说明
⚠️ 用gromore来创建广告位,使用gromore id来展示广告
⚠️ 如需需要集成聚合其他广告SDK,需要根据当前插件使用的版本引入对应版本的Adapter库,离线SDK ,根据官方文档进行配置
⚠️ 鸿蒙开屏、信息流、横幅广告需要使用ohos分支代码
本地开发环境
[✓] 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
集成步骤
1、pubspec.yaml
flutter_unionad: ^latest
引入
import 'package:flutter_unionad/flutter_unionad.dart' ;
2、Android
SDK 已配置插件中无需额外配置,只需要在android目录中AndroidManifest.xml配置
<manifest ···
xmlns:tools="http://schemas.android.com/tools"
···>
<application
android:usesCleartextTraffic="true"
tools:replace="android:label">
3、IOS
SDK 已配置插件中,其余根据SDK文档配置,因为使用PlatformView,在Info.plist加入
<key>io.flutter .embedded_views_preview </key>
<true />
<key > NSAppTransportSecurity</key >
<dict >
<key > NSAllowsArbitraryLoads</key >
<true />
</dict >
4、鸿蒙next
需要把下面这个文件拷贝到你的鸿蒙项目根目录下
.ohpmrc
使用
1、SDK初始化
⚠️如果要修改个性化,重新调用初始化方法
await FlutterUnionad .register (
androidAppId: "5098580" ,
iosAppId: "5098580" ,
appName: "unionad_test" ,
useMediation: true ,
paid: false ,
keywords: "" ,
allowShowNotify: true ,
debug: true ,
supportMultiProcess: false ,
themeStatus: _themeStatus,
directDownloadNetworkType: [
FlutterUnionadNetCode .NETWORK_STATE_2G,
FlutterUnionadNetCode .NETWORK_STATE_3G,
FlutterUnionadNetCode .NETWORK_STATE_4G,
FlutterUnionadNetCode .NETWORK_STATE_WIFI
],
androidPrivacy: AndroidPrivacy (
isCanUseLocation: false ,
lat: 0.0 ,
lon: 0.0 ,
isCanUsePhoneState: false ,
imei: "" ,
isCanUseWifiState: false ,
macAddress: "" ,
isCanUseWriteExternal: false ,
oaid: "b69cd3cf68900323" ,
alist: false ,
isCanUseAndroidId: false ,
androidId: "" ,
isCanUsePermissionRecordAudio: false ,
isLimitPersonalAds: false ,
isProgrammaticRecommend: false ,
userPrivacyConfig: {
"mcod" :"0" ,
"installUninstallListen" : "0" ,
}
),
iosPrivacy: IOSPrivacy (
limitPersonalAds: false ,
limitProgrammaticAds: false ,
forbiddenCAID: false ,
),
userInfo: UnionadUserInfo (
userId: "unionad_123" ,
age: 19 ,
gender: 2 ,
channel: "flutter" ,
subChannel: "flutter_unionad" ,
userValueGroup: "QQ" ,
customInfos: {
"QQ" : "123" ,
"WeChat" : "456" ,
}
),
localConfig: "site_config_5098580" ,
);
2、获取SDK版本
await FlutterUnionad .getSDKVersion ();
3、请求权限
FlutterUnionad .requestPermissionIfNecessary (
callBack: FlutterUnionadPermissionCallBack (
notDetermined: () {
print ("权限未确定" );
},
restricted: () {
print ("权限限制" );
},
denied: () {
print ("权限拒绝" );
},
authorized: () {
print ("权限同意" );
},
),
);
Android获取定位、照片权限,只返回成功
Android相关权限为非必须权限,可选择在AndroidManifest.xml中声明
IOS 版本14及以上获取ATT权限,根据返回结果具体操作业务逻辑
4、开屏广告
FlutterUnionadSplashAdView (
androidCodeId: "102729400" ,
iosCodeId: "102729400" ,
supportDeepLink: true ,
width: MediaQuery .of (context).size.width,
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 ("开屏广告超时" );
},
),
),
5、banner广告
FlutterUnionadBannerView (
androidCodeId: "102735527" ,
iosCodeId: "102735527" ,
width: 600.5 ,
height: 120.5 ,
callBack: FlutterUnionadBannerCallBack (onShow: () {
print ("banner广告加载完成" );
}, onDislike: (message) {
print ("banner不感兴趣 $message " );
}, onFail: (error) {
print ("banner广告加载失败 $error " );
}, onClick: () {
print ("banner广告点击" );
},
),
),
6、信息流广告
FlutterUnionadNativeAdView (
androidCodeId: "102730271" ,
iosCodeId: "102730271" ,
supportDeepLink: true ,
width: 375.5 ,
height: 0 ,
callBack: FlutterUnionadNativeCallBack (
onShow: () {
print ("信息流广告显示" );
},
onFail: (error) {
print ("信息流广告失败 $error " );
},
onDislike: (message) {
print ("信息流广告不感兴趣 $message " );
},
onClick: () {
print ("信息流广告点击" );
},
),
),
8、激励视频广告
预加载激励视频广告
FlutterUnionad .loadRewardVideoAd (
androidCodeId: "102733764" ,
iosCodeId: "102733764" ,
rewardName: "200金币" ,
rewardAmount: 200 ,
userID: "123" ,
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 ("激励广告预加载准备就绪" );
await FlutterUnionad .showRewardVideoAd ();
},
onCache: () async {
print ("激励广告物料缓存成功。建议在这里进行广告展示,可保证播放流畅和展示流畅,用户体验更好。" );
},
onUnReady: (){
print ("激励广告预加载未准备就绪" );
},
onRewardArrived: (rewardVerify, rewardType, rewardAmount, rewardName,
errorCode, error, propose) {
print (
"阶段激励广告奖励 验证结果=$rewardVerify 奖励类型<FlutterUnionadRewardType>=$rewardType 奖励=$rewardAmount "
"奖励名称$rewardName 错误码=$errorCode 错误$error 建议奖励$propose " );
}),
),
);
9、draw视频广告
FlutterUnionadDrawFeedAdView (
androidCodeId: "102734241" ,
iosCodeId: "102734241" ,
width: 600.5 ,
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视频结束" );
},
),
);
11、新模版渲染插屏广告 分为全屏和插屏
预加载新模版渲染插屏广告
FlutterUnionad .loadFullScreenVideoAdInteraction (
androidCodeId: "102735530" ,
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 ("新模板渲染插屏广告预加载未准备就绪" );
},
),
);
13、日间/夜间模式
获取主题模式
_themeStatus = await FlutterUnionad .getThemeStatus ();
切换主题模式
修改初始化中themeStatus参数,重新调用初始化
14 ecpm说明
常见问题
常见问题
插件链接
开源不易,觉得有用的话可以请作者喝杯奶茶🧋
联系方式