一、创建应用ID和广告位ID
1.新建应用
(1)在流量管理-应用管理界面创建应用
(2)建议创建为测试状态,注意测试状态代码位的展示和点击是无效的,不计费!
(3)正式上线后一定要变更成正式状态才有数据
2.新建代码位
(1)在流量管理-代码位管理中可新建代码位
(2)媒体可以根据自己需要的类型来创建代码位
(3)可新建信息流、banner、插屏、全屏视频、开屏、激励视屏和Draw信息流等多种广告类型。
(4)媒体创建代码位成功后,即可获取到代码位ID
二、集成网盟iOS SDK接入
1.工程设置导入framework
方法一:获取 framework 文件后直接将 {BUAdSDK.framework, BUAdSDK.bundle}文件拖入工程即可。 升级SDK必须同时更新framework和bundle文件,否则可能出现部分页面无法展示的问题
拖入时请按以下方式选择:
方法二:通过pod方式引入
pod 'Bytedance-UnionAD'
2.添加权限
工程plist文件设置,点击右边的information Property List后边的 “+” 展开
添加 App Transport Security Settings,先点击左侧展开箭头,再点右侧加号,Allow Arbitrary Loads 选项自动加入,修改值为 YES。 SDK API 已经全部支持HTTPS,但是广告主素材存在非HTTPS情况。
Build Settings中Other Linker Flags 增加参数-ObjC,SDK同时支持-all_load
3.运行环境配置
支持系统 iOS 9.X 及以上;
SDK编译环境 Xcode 10.0及以上;
支持架构:i386, x86-64, armv7, armv7s, arm64
4.添加依赖库
如果通过cocoapods安装,则不需要添加下面的库。
工程需要在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
libresolv.9.tbd
libc++.tbd
libz.tbd
ImageIO.framework
5.添加语言配置
注意 : 开发者必须在这里设置所支持的语言,否则会有语言显示的问题.
例如 : 支持中文 添加 Chinese
三、广告接入
1.开屏广告
OC:
引入头文件
#import <BUAdSDK/BUAdSDK.h>
遵守协议:
<BUSplashAdDelegate>
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法里加入。
[BUAdSDKManager setAppID:@"第一步申请的应用ID"];
CGRect frame = [UIScreen mainScreen].bounds;
BUSplashAdView *splashView = [[BUSplashAdView alloc] initWithSlotID:@"第一步申请的代码为ID" frame:frame];
splashView.delegate = self;
UIWindow *keyWindow = [UIApplication sharedApplication].windows.firstObject;
[splashView loadAdData];
[keyWindow.rootViewController.view addSubview:splashView];
splashView.rootViewController = keyWindow.rootViewController;
实现协议方法:
- (void)splashAdDidClose:(BUSplashAdView *)splashAd {
[splashAd removeFromSuperview];
}
- (void)splashAd:(BUSplashAdView *)splashAd didFailWithError:(NSError * _Nullable)error{
[splashAd removeFromSuperview];
}
swift:
引入头文件
import BUAdSDK
遵守协议:
BUSplashAdDelegate
在func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 方法里加入
BUAdSDKManager.setAppID("第一步申请的应用ID")
let frame = UIScreen.main.bounds
let splashView = BUSplashAdView.init(slotID: "第一步申请的代码为ID", frame: frame)
splashView.delegate = self
let keyWindow = UIApplication.shared.windows.first
splashView.loadAdData()
keyWindow?.rootViewController?.view.addSubview(splashView)
splashView.rootViewController = keyWindow?.rootViewController
实现协议方法
func splashAdDidClose(_ splashAd: BUSplashAdView) {
splashAd.removeFromSuperview()
}
func splashAd(_ splashAd: BUSplashAdView, didFailWithError error: Error?) {
splashAd.removeFromSuperview()
}
2.Banner广告
一般选择时选择600X150大小的banner
OC:
引入头文件
#import <BUAdSDK/BUAdSDK.h>
在- (void)viewDidLoad里加入下面的代码
// 加载banner广告
CGFloat screenWidth = CGRectGetWidth([UIScreen mainScreen].bounds);
CGFloat bannerHeigh = (screenWidth)/600*90;
BUSize *imgSize = [BUSize sizeBy:BUProposalSize_Banner600_150];
self.bannerView = [[BUNativeExpressBannerView alloc] initWithSlotID:@"您的代码位" rootViewController:self imgSize:imgSize adSize:CGSizeMake(screenWidth, bannerHeigh) IsSupportDeepLink:YES interval:30];
self.bannerView.frame = CGRectMake(0, TWScreenH-bannerHeigh-DZVirtualHomeHeight, screenWidth, bannerHeigh);
self.bannerView.delegate = self;
[self.view addSubview:self.bannerView];
[self.bannerView loadAdData];
swift:
引入头文件
import BUAdSDK
在func viewDidLoad()里面添加
//加载banner广告
let screenWidth = UIScreen.main.bounds.width
let screenHeight = UIScreen.main.bounds.height
let bannerHeight = screenWidth/600*90
let imageSize = BUSize(by: .banner600_150)
// 要用30s循环,请参考oc代码
bannerView = BUNativeExpressBannerView.init(slotID: "931527852", rootViewController: self, imgSize: imageSize, adSize:CGSize(width: screenWidth, height: bannerHeight) , isSupportDeepLink: true)
var height : CGFloat = 0.0
if UIScreen.main.bounds.height >= 812 {
height = 34.0
}
bannerView.frame = CGRect(x: 0, y: screenHeight - bannerHeight - height, width: screenWidth, height: bannerHeight)
bannerView.delegate = self
view.addSubview(bannerView)
bannerView.loadAdData()
3.激励视频广告
oc:
引入头文件
#import <BUAdSDK/BUAdSDK.h>
在- (void)viewDidLoad中加入
BURewardedVideoModel *model2 = [[BURewardedVideoModel alloc] init];
model2.userId = @"123";
self.rewardedVideoAd = [[BUNativeExpressRewardedVideoAd alloc] initWithSlotID:@"激励视频广告ID" rewardedVideoModel:model2];
self.rewardedVideoAd.delegate = self;
[self.rewardedVideoAd loadAdData];
然后在触发激励广告的地方加入以下代码:
[self.rewardedVideoAd showAdFromRootViewController:self.navigationController ritScene:BURitSceneType_home_get_bonus ritSceneDescribe:nil];
4.全屏视频广告
我们全屏视频广告的加入实际是用户从后台返回前台的时候
swift:
引入头文件
import BUAdSDK
定义变量
var fullscreenVideoAd : BUNativeExpressFullscreenVideoAd?
在func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 方法里加入
fullscreenVideoAd = BUNativeExpressFullscreenVideoAd(slotID: "广告位id")
fullscreenVideoAd?.delegate = self
fullscreenVideoAd?.loadData()
在func applicationWillEnterForeground(_ application: UIApplication)里加入代码:
let keyWindow = UIApplication.shared.windows.first
fullscreenVideoAd?.show(fromRootViewController: keyWindow?.rootViewController ?? ViewController())
OC:
引入头文件
#import <BUAdSDK/BUAdSDK.h>
定义属性
@property (nonatomic, strong)BUNativeExpressFullscreenVideoAd *fullscreenVideoAd;
加载数据
self.fullscreenVideoAd = [[BUNativeExpressFullscreenVideoAd alloc] initWithSlotID:@"广告位id"];
self.fullscreenVideoAd.delegate = self;
[self.fullscreenVideoAd loadAdData];
在- (void)applicationWillEnterForeground:(UIApplication *)application 里弹出全屏广告
[self.fullscreenVideoAd showAdFromRootViewController:self.window.rootViewController];
五、插屏广告
OC:
引入头文件
#import <BUAdSDK/BUAdSDK.h>
定义属性
@property (nonatomic, strong) BUNativeExpressInterstitialAd *interstitialAd;
加载数据
- (void)loadInterstitialAd{
self.interstitialAd = [[BUNativeExpressInterstitialAd alloc] initWithSlotID:@"xxx" imgSize:[BUSize sizeBy:BUProposalSize_Interstitial600_900] adSize:CGSizeMake(300, 450)];
self.interstitialAd.delegate = self;
[self.interstitialAd loadAdData];
}
在合适的实际弹出插屏
if (self.interstitialAd.isAdValid) {
[self.interstitialAd showAdFromRootViewController:self.window.rootViewController];
}
遵守协议BUNativeExpresInterstitialAdDelegate
并实现以下代理方法
-(void)nativeExpresInterstitialAdDidClose:(BUNativeExpressInterstitialAd *)interstitialAd{
[self loadInterstitialAd];
}
否则再次触发弹出插屏,没反应。
swift
引入头文件
#import <BUAdSDK/BUAdSDK.h>
定义属性
var interstitialAd = BUNativeExpressInterstitialAd.init(slotID: "931527033", imgSize: BUSize.init(by: .interstitial600_600), adSize: CGSize(width: 300,height: 300))
加载数据
interstitialAd.delegate = self
interstitialAd.loadData()
在合适的时机弹出插屏
if self.interstitialAd.isAdValid{
self.interstitialAd.show(fromRootViewController: self)
}
遵守协议BUNativeExpresInterstitialAdDelegate
并实现以下代理方法
func nativeExpresInterstitialAdDidClose(_ interstitialAd: BUNativeExpressInterstitialAd) {
interstitialAd.loadData()
}
六、第一次加载开屏广告逻辑
if([[NSUserDefaults standardUserDefaults] boolForKey:@"isNotFirst"]){
[self loadBUAd];
}else{
AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager sharedManager];
[netManager startMonitoring]; //开始监听
[netManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
if (status != AFNetworkReachabilityStatusNotReachable)
{
[self loadBUAd];
}
}];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isNotFirst"];
}
#七、先加载QQ开屏,然后在加载穿山甲开屏
- (void)splashAdFailToPresent:(GDTSplashAd *)splashAd withError:(NSError *)error{
[self addDanceAd];
}
- (void)splashAdWillClosed:(GDTSplashAd *)splashAd{
[self addDanceAd];
}
#八、先加载穿山甲开屏,再加载QQ开屏
- (void)splashAdDidClose:(BUSplashAdView *)splashAd {
[self addQQAd];
[splashAd removeFromSuperview];
}
- (void)splashAd:(BUSplashAdView *)splashAd didFailWithError:(NSError * _Nullable)error{
[self addQQAd];
[splashAd removeFromSuperview];
}
九、信息流广告
- (void)loadData {
BUAdSlot *slot1 = [[BUAdSlot alloc] init];
slot1.ID = @"代码位";
slot1.AdType = BUAdSlotAdTypeFeed;
BUSize *imgSize = [BUSize sizeBy:BUProposalSize_Feed228_150];
slot1.imgSize = imgSize;
slot1.position = BUAdSlotPositionFeed;
slot1.isSupportDeepLink = YES;
self.nativeExpressAdManager = [[BUNativeExpressAdManager alloc] initWithSlot:slot1 adSize:CGSizeMake(TWScreenW, 150*TWScreenW/228)];
self.nativeExpressAdManager.delegate = self;
[self.nativeExpressAdManager loadAd:1];
}
- (void)nativeExpressAdSuccessToLoad:(BUNativeExpressAdManager *)nativeExpressAd views:(NSArray<__kindof BUNativeExpressAdView *> *)views {
if (views.count) {
self.nativeExpressAdView = views[0];
self.nativeExpressAdView.rootViewController = self;
[self.nativeExpressAdView render];
NSLog(@"【BytedanceUnion】个性化模板拉取广告成功回调");
}
}
- (void)nativeExpressAdFailToLoad:(BUNativeExpressAdManager *)nativeExpressAd error:(NSError *)error {
}
- (void)nativeExpressAdViewRenderSuccess:(BUNativeExpressAdView *)nativeExpressAdView {
self.nativeExpressAdView.frame = CGRectMake(0, TWScreenH-DZVirtualHomeHeight-150*TWScreenW/228, TWScreenW, 150*TWScreenW/228);
[self.view addSubview:self.nativeExpressAdView];
}
- (void)nativeExpressAdView:(BUNativeExpressAdView *)nativeExpressAdView dislikeWithReason:(NSArray<BUDislikeWords *> *)filterWords {//【重要】需要在点击叉以后 在这个回调中移除视图,否则,会出现用户点击叉无效的情况
[nativeExpressAdView removeFromSuperview];
}