zjsdk_flutter 0.1.0
zjsdk_flutter: ^0.1.0 copied to clipboard
zjsdk ads flutter plusin package.
html: embed_local_images: false embed_svg: true offline: false toc: true
print_background: true #
ZJSDK_iOS_Flutter使用文档 {ignore=true} #
一、iOS SDK接入说明 #
1.1、工程设置导入framework #
1.1.1、申请应用的AppID
请找运营人员获取应用ID和广告位ID。
1.1.2、导入framework
1. pubspec.yaml接入方式 复杂度: ★☆☆ 优缺点: 桥接已写好,开发者只需导入package即可。 适用: 适用于大多数flutter开发者,集成、使用简单,省时省力。
zjsdk_flutter: ^0.0.1
2. CocoaPods接入方式 通过CocoaPods接入后,需实现原生与flutter之间的桥接
复杂度: ★★☆ 优缺点: 通过原生调用接口,更为灵活。但是需要混编,各种借口调用需要桥接,费时费力。 适用: 适用于pub导入方式所开放的接口 满足不了需求,且有原生开发,与flutter混编经验的,时间预算更多一些的开发者
#完整的SDK
pod 'ZJSDK'
#如需模块拆分导入,请导入ZJSDKModuleDSP
pod 'ZJSDK/ZJSDKModuleDSP'
pod 'ZJSDK/ZJSDKModuleGDT'#优量汇广告
pod 'ZJSDK/ZJSDKModuleCSJ'#穿山甲广告
pod 'ZJSDK/ZJSDKModuleKS'#快手广告
pod 'ZJSDK/ZJSDKModuleMTG'#MTG广告
pod 'ZJSDK/ZJSDKModuleSIG' #Sigmob广告
pod 'ZJSDK/ZJSDKModuleYM' #云码广告,
3.手动方式 复杂度: ★★★ 优缺点: 需要手动集成,复杂度较高,不推荐。 适用: 与项目中其他原生库冲突,比如有集成快手短视频时,或者需要接入视频内容(ZJContentPage)广告时使用此方式。
1.获取 framework 文件后直接将 {ZJSDK}文件拖入工程即可
2.
3.
4.为了方便模拟器调试,KSAdSDK 带有x86_64,i386架构,上架App store需要移除对应的这两个架构,请参考:(https://stackoverflow.com/questions/30547283/submit-to-app-store-issues-unsupported-architecture-x86)
*升级SDK的同学必须同时更新framework和bundle文件,否则可能出现部分页面无法展示的问题,老版本升级的同学需要重新引入ZJSDK.framework
*拖入完请确保Copy Bundle Resources中有BUAdSDK.bundle,ZJSDKBundle.bundle否则可能出现icon图片加载不出来的情况。
1.2、Xcode编译选项设置 #
1.2.1、添加权限
- 工程plist文件设置,点击右边的information Property List后边的 "+" 展开
添加 App Transport Security Settings,先点击左侧展开箭头,再点右侧加号,Allow Arbitrary Loads 选项自动加入,修改值为 YES。 SDK API 已经全部支持HTTPS,但是广告主素材存在非HTTPS情况。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
- Build Settings中Other Linker Flags 增加参数-ObjC,字母o和c大写。
1.2.2、运行环境配置
- 支持系统 iOS 9.X 及以上;
- SDK编译环境 Xcode 11;
- 支持架构: x86-64, armv7, arm64,i386
添加依赖库
工程需要在TARGETS -> Build Phases中找到Link Binary With Libraries,点击“+”,依次添加下列依赖库
-
StoreKit.framework
-
MobileCoreServices.framework
-
WebKit.framework
-
MediaPlayer.framework
-
CoreMedia.framework
-
CoreLocation.framework
-
AVFoundation.framework
-
CoreTelephony.framework
-
SystemConfiguration.framework
-
AdSupport.framework
-
CoreMotion.framework
-
Accelerate.framework
-
libresolv.9.tbd
-
libc++.tbd
-
libz.tbd
-
libsqlite3.tbd
-
libbz2.tbd
-
libxml2.tbd
-
QuartzCore.framework
-
Security.framework
如果以上依赖库增加完仍旧报错,请添加ImageIO.framework。
SystemConfiguration.framework、CoreTelephony.framework、Security.framework是为了统计app信息使用
1.2.3、位置权限
SDK 不会主动获取应用位置权限,当应用本身有获取位置权限逻辑时,需要在应用的 info.plist 添加相应配置信息,避免 App Store 审核被拒:
// 应用根据实际情况配置
Privacy - Location When In Use Usage Description
Privacy - Location Always and When In Use Usage Description
Privacy - Location Always Usage Description
Privacy - Location Usage Description
1.3、初始化SDK #
开发者需要在AppDelegate#application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中调用以下代码来初始化sdk。
flutter项目初始化 参考demo的AppDelegate 1.通过pub集成
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 初始化ZJSDK
[ZJAdSDK registerAppId:@"zj_20201014iOSDEMO"];
// 注册flutter插件
[GeneratedPluginRegistrant registerWithRegistry:self];
}
2.通过其他方式集成
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//初始化ZJSDK
[ZJAdSDK registerAppId:@"zj_20201014iOSDEMO"];
// 注册 flutter 插件
[ZJAdPlugin registerWithRegistry:self];
return YES;
}
- (NSObject<FlutterPluginRegistrar>*)registrarForPlugin:(NSString*)pluginKey {
UIViewController* rootViewController = self.window.rootViewController;
if ([rootViewController isKindOfClass:[FlutterViewController class]]) {
return [[(FlutterViewController*)rootViewController pluginRegistry] registrarForPlugin:pluginKey];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
FlutterViewController *flutterVC = [rootViewController.childViewControllers firstObject];
if ([flutterVC isKindOfClass:[FlutterViewController class]]) {
return [[flutterVC pluginRegistry] registrarForPlugin:pluginKey];
}
}
return nil;
}
二、加载广告 #
2.1、接入开屏广告(SplashAd) #
- 类型说明: 开屏广告主要是 APP 启动时展示的全屏广告视图,开发只要按照接入标准就能够展示设计好的视图。
2.1.1、开屏广告调用
static void showSplashAd(String adId,int fetchDelay,
{AdCallback onAdLoad,
AdCallback onAdShow,
AdCallback onAdClick,
AdCallback onCountdownEnd,
AdCallback onAdClose,
AdCallback onError}) {
_methodChannel.invokeMethod(
"showSplashAd", {"_channelId": ++_channelId, "adId": adId,"fetchDelay":fetchDelay});
EventChannel eventChannel = EventChannel("com.zjsdk.adsdk/event_$_channelId");
eventChannel.receiveBroadcastStream().listen((event) {
switch (event["event"]) {
case "splashAdDidLoad":
onAdLoad?.call("splashAdDidLoad","");
break;
case "splashAdSuccessPresentScreen":
onAdShow?.call("splashAdSuccessPresentScreen","");
break;
case "splashAdClicked":
onAdClick?.call("splashAdClicked","");
break;
case "splashAdCountdownEnd":
onCountdownEnd?.call("splashAdCountdownEnd","");
break;
case "splashAdClosed":
onAdClose?.call("splashAdClosed","");
break;
case "splashAdError":
onError?.call("splashAdError", event["error"]);
break;
}
});
}
2.1.2、开屏广告回调说明
通过回调中的event获取
//开屏广告素材加载成功
splashAdDidLoad
//开屏广告成功展示
splashAdSuccessPresentScreen
//开屏广告点击回调
splashAdClicked
//开屏广告关闭回调
splashAdClosed
//应用进入后台时回调 详解: 当点击下载应用时会调用系统程序打开,应用切换到后台
splashAdApplicationWillEnterBackground
//开屏广告倒记时结束
splashAdCountdownEnd;
//开屏广告错误
splashAdError;
2.2、接入激励视频(RewardVideoAd) #
- 类型说明: 激励视频广告是一种全新的广告形式,用户可选择观看视频广告以换取有价物,例如虚拟货币、应用内物品和独家内容等等;这类广告的长度为 15-30 秒,不可跳过,且广告的结束画面会显示结束页面,引导用户进行后续动作。
2.2.1、激励视频调用
/// show reward video ad
static void showRewardVideoAd(String adId,String userId,
{AdCallback onAdLoad,
AdCallback onAdShow,
AdCallback onReward,
AdCallback onAdClick,
AdCallback onVideoComplete,
AdCallback onAdClose,
AdCallback onError}) {
_methodChannel.invokeMethod(
"showRewardVideoAd", {"_channelId": ++_channelId, "adId": adId,"userId":userId});
EventChannel eventChannel = EventChannel("com.zjsdk.adsdk/event_$_channelId");
eventChannel.receiveBroadcastStream().listen((event) {
switch (event["event"]) {
case "rewardVideoLoadSuccess":
onAdLoad?.call("rewardVideoLoadSuccess","");
break;
case "rewardVideoAdDidShow":
onAdShow?.call("rewardVideoAdDidShow","");
break;
case "rewardVideoDidRewardEffective":
onReward?.call("rewardVideoDidRewardEffective",event["transId"]);
break;
case "rewardVideoAdDidClicked":
onAdClick?.call("rewardVideoAdDidClicked","");
break;
case "rewardVideoAdDidPlayFinish":
onVideoComplete?.call("rewardVideoAdDidPlayFinish","");
break;
case "rewardVideoAdDidClose":
onAdClose?.call("rewardVideoAdDidClose","");
break;
case "onError":
onError?.call("rewardVideoAdError", event["error"]);
break;
}
});
}
2.2.2、激励视频回调说明
通过回调中的message获取
//视频数据下载成功回调
rewardVideoLoadSuccess
//视频广告展示
rewardVideoAdDidShow
//视频播放页关闭
rewardVideoAdDidClose
//视频广告信息点击
rewardVideoAdDidClicked
//奖励触发
rewardVideoDidRewardEffective
//视频广告视频播放完成
rewardVideoAdDidPlayFinish
//视频广告各种错误信息回调
rewardVideoAdError
2.3、接入插屏广告(InterstitialAd) #
- 类型说明: 插屏广告是移动广告的一种常见形式,在应用开流程中弹出,当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。
2.3.1、插屏广告调用
/// show interstitial ad
static void showInterstitialAd(String adId,
{AdCallback onAdLoad,
AdCallback onAdShow,
AdCallback onAdClick,
AdCallback onAdClose,
AdCallback onAdDetailClose,
AdCallback onError}) {
_methodChannel.invokeMethod(
"showInterstitialAd", {"_channelId": ++_channelId, "adId": adId});
EventChannel eventChannel = EventChannel("com.zjsdk.adsdk/event_$_channelId");
eventChannel.receiveBroadcastStream().listen((event) {
switch (event["event"]) {
case "interstitialAdDidLoad":
onAdLoad?.call("interstitialAdDidLoad","");
break;
case "interstitialAdDidPresentScreen":
onAdShow?.call("interstitialAdDidPresentScreen","");
break;
case "interstitialAdDidClick":
onAdClick?.call("interstitialAdDidClick","");
break;
case "interstitialAdDidClose":
onAdClose?.call("interstitialAdDidClose","");
break;
case "interstitialAdDetailDidClose":
onAdDetailClose?.call("interstitialAdDetailDidClose","");
break;
case "interstitialAdError":
onError?.call("interstitialAdError", event["error"]);
break;
}
});
}
2.3.2、插屏广告回调说明
//插屏广告数据加载成功回调
interstitialAdDidLoad
//插屏广告错误回调
interstitialAdError
//插屏广告展示
interstitialAdDidPresentScreen
//插屏广告点击
interstitialAdDidClick
//插屏广告关闭
interstitialAdDidClose
//插屏广告详情页关闭
interstitialAdDetailDidClose
2.4、banner广告(BannerAd) #
2.4.1、banner广告调用
class BannerAdView extends StatelessWidget {
final String adId;
final double width;
final double height;
final AdCallback onAdLoad;
final AdCallback onAdShow;
final AdCallback onAdClick;
final AdCallback onAdClose;
final AdCallback onError;
final AdCallback onAdDetailClose;
BannerAdView(
{Key key,
this.adId,
this.width,
this.height,
this.onAdLoad,
this.onAdShow,
this.onAdClick,
this.onAdClose,
this.onAdDetailClose,
this.onError})
: super(key: key);
@override
Widget build(BuildContext context) {
Widget banner;
if (defaultTargetPlatform == TargetPlatform.android) {
banner = AndroidView(
viewType: 'com.zjad.adsdk/banner',
creationParams: {
"adId": adId,
"width": width,
"height": height,
},
creationParamsCodec: const StandardMessageCodec(),
onPlatformViewCreated: _onPlatformViewCreated,
);
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
banner = UiKitView(
viewType: 'com.zjad.adsdk/banner',
creationParams: {
"adId": adId,
"width": width,
"height": height,
},
creationParamsCodec: const StandardMessageCodec(),
onPlatformViewCreated: _onPlatformViewCreated,
);
} else {
banner = Text("Not supported");
}
return Container(
width: width,
height: height,
child: banner,
);
}
void _onPlatformViewCreated(int id) {
EventChannel eventChannel = EventChannel("com.zjsdk.adsdk/banner_event_$id");
eventChannel.receiveBroadcastStream().listen((event) {
switch (event["event"]) {
case "bannerAdViewDidLoad":
onAdLoad?.call("bannerAdViewDidLoad","");
break;
case "bannerAdViewWillBecomVisible":
onAdShow?.call("bannerAdViewWillBecomVisible","");
break;
case "bannerAdViewDidClick":
onAdClick?.call("bannerAdViewDidClick","");
break;
case "bannerAdViewDislike":
onAdClose?.call("bannerAdViewDislike","");
break;
case "bannerAdDidLoadFail":
onError?.call("bannerAdDidLoadFail", event["error"]);
break;
case "bannerAdViewDidCloseOtherController":
onAdDetailClose?.call("bannerAdViewDidCloseOtherController","");
break;
}
});
}
}
2.4.2、banner广告回调说明
//banner广告加载成功
bannerAdViewDidLoad
//banner广告加载失败
bannerAdDidLoadFail
//banner广告曝光回调
bannerAdViewWillBecomVisible
//关闭banner广告回调
bannerAdViewDislike
//点击banner广告回调
bannerAdViewDidClick
//关闭banner广告详情页回调
bannerAdViewDidCloseOtherController
2.5、H5广告 #
2.5.1、H5广告调用
static void showH5Ad(String adId,String userID, String userName ,String userAvatar,
{AdCallback onAdLoad,
AdCallback onError,
AdCallback onRewardAdLoad,
AdCallback onRewardAdReward,
AdCallback onRewardAdClick,
AdCallback onRewardAdError}) {
_methodChannel.invokeMethod(
"showH5Ad", {"_channelId": ++_channelId, "adId": adId,"userID":userID,"userName":userName,"userAvatar":userAvatar});
EventChannel eventChannel = EventChannel("com.zjsdk.adsdk/event_$_channelId");
eventChannel.receiveBroadcastStream().listen((event) {
switch (event["event"]) {
case "h5AdDidLoad":
onAdLoad?.call("h5AdDidLoad","");
break;
case "h5AdError":
onError?.call("h5AdError",event["error"]);
break;
case "h5_rewardAdDidLoad":
onRewardAdLoad?.call("h5_rewardAdDidLoad","");
break;
case "h5_rewardAdRewardEffective":
onRewardAdReward?.call("h5_rewardAdRewardEffective",event["transId"]);
break;
case "h5_rewardAdRewardClick":
onRewardAdClick?.call("h5_rewardAdRewardClick","");
break;
case "h5_rewardAdRewardError":
onRewardAdError?.call("h5_rewardAdRewardError", event["error"]);
break;
}
});
}
2.5.2、H5广告回调说明
//H5广告加载成功
h5AdDidLoad
//H5广告错误回调
h5AdError
//H5广告 激励视频加载成功
h5_rewardAdDidLoad
//H5广告 激励视频触发奖励
h5_rewardAdRewardEffective
//H5广告 激励视频点击回调
h5_rewardAdRewardClick
//H5广告 激励视频错误回调
h5_rewardAdRewardError