怎么集成穿山甲(今日头条广告SDK)

一、创建应用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];

}

版权声明:本文为Jsonbaby原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。