@binbins
2017-05-26T17:36:56.000000Z
字数 6950
阅读 157
引入依赖框架
# 快速开发框架
pod 'FFastlib', '~> 0.1.5'
# 接入ADMob
pod 'Firebase/Core'
pod 'Firebase/AdMob'
# 接入InMobi
pod 'InMobiSDK', '~> 6.2.0'
info.plist iOS9适配,增加
<key>LSApplicationQueriesSchemes</key>
<array>
<string>baidumobads</string>
</array>
info.plist设置NSAllowsArbitraryLoads
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
增加依赖框架
QuartzCore.framework
Security.framework
WebKit.framework
libz.tbd
AVFoundation.framework
AVKit.framework
CoreMedia.framework
SystemConfiguration.framework
CoreTelephony.framework
CoreLocation.framework
MessageUI.framework
CoreMotion.framework
libc++.tbd
StoreKit.framework
AdSupport.framework
SafariServices.framework
增加相应的广告库
* 将sdk_adgithub文件夹sdk_ad引入项目
* 将manager_adgithub文件夹manager_ad引入项目
在主UIViewController中初始化广告
// 初始化
- (void)viewDidLoad {
[super viewDidLoad];
[[AdSplashManager shareManager] initSplash];
}
// 校验初始化
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[[AdSplashManager shareManager] checkInit];
}
在AppDelegate中加载Splash广告
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[AdSplashManager shareManager] loadSplashAppDelegate];
return YES;
}
在App每次进入到前台,加载splash
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[AdSplashManager shareManager] loadSplashWillEnterForeground];
}
在主UIViewController中,加载Splash广告
- (void)viewDidLoad {
[super viewDidLoad];
[[AdSplashManager shareManager] loadSplashCtrl:self];
}
AppDelegate.m文件
// 引入头文件
#import "AdManager.h"
// App切换到后台
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[AdManager shareManager] applicationDidEnterBackground];
}
// App切换到前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[AdManager shareManager] applicationWillEnterForeground];
}
初始化
在主UIViewController中增加
- (void)viewDidLoad {
[super viewDidLoad];
[[AdManager shareManager] initWithCtrl:self];
}
在所有UIViewController中增加,校验广告是否初始化成功,未成功将会再次初始化
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[AdManager shareManager] checkInit:self];
}
获取广告,展示广告
// 广告
AdBean *adBean = [[AdManager shareManager] getAdBean];
// 广告View
AdCommonView *view = [adBean getAdView];
// 将广告View放到self.view上
[self.view addSubview:view];
// 将广告数据更新到广告UI上
[adBean loadAdInfoUI];
// 广告展示,上发展示请求,注意,一定要广告处于可视范围内,才能触发此方法
[[AdManager shareManager] showAd:adBean];
// 广告点击,上发广告点击,触发广告点击操作
[[AdManager shareManager] clickAd:adBean];
备注
广告尺寸:宽度:设备宽度;高度:250。在AdBean中,createAdView定义
广点通,360广告由AdCommonView处理
百度广告,由AdBean处理
AdManager扩展方法使用
// 判断广告是否为空
- (BOOL)adIsEmpty;
// 在array中插入广告bean,广告间隔由AdHeader.h Ad_Split控制
+ (NSArray *)mergeAd: (NSArray *)array;
// // 在array中插入广告bean,广告间隔由传入的split参数控制
+ (NSArray *)mergeAd: (NSArray *)array split:(NSInteger)split;
// array中广告bean个数
+ (int)adOffset:(NSArray *)array;
// 返回默认的广告间隔split
+ (int)adSplit;
// array中指定的下标对象是否为广告
+ (BOOL)isAd:(NSArray *)array index:(int)index;
// array中广告bean个数
+ (int)adCountInArray:(NSArray *)array;
初始化
// 初始化方法
[[AdInterRecommendManager shareManager] initInterRecommend];
// 初始化检验方法
[[AdInterRecommendManager shareManager] checkInit];
// 在程序入口,调用init方法
- (void)viewDidLoad {
[super viewDidLoad];
[[AdInterRecommendManager shareManager] initInterRecommend];
}
// 在页面切换,消失等调用checkInit方法
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[AdInterRecommendManager shareManager] checkInit];
}
三种style
AD_STYLE_IMG 图片方式
AD_STYLE_DETAIL 弹框,详细信息方式
AD_STYLE_BANNER 弹框,banner简洁形式
hiddenClose 表示是否隐藏关闭按钮
[AdInterRecommendManager launchInterRecommendView:self adStryle:AD_STYLE_IMG hiddenClose:NO];
[AdInterRecommendManager launchInterRecommendView:self adStryle:AD_STYLE_DETAIL hiddenClose:NO];
[AdInterRecommendManager launchInterRecommendView:self adStryle:AD_STYLE_BANNER hiddenClose:NO];
style 参数,与隐藏关闭按钮,由在线参数控制
// 参数 pos_interrecommend_style 展示样式
// 参数 pos_interrecommend_hidden_close_btn 是否隐藏关闭按钮
[AdInterRecommendManager launchInterRecommendView:self];
在线参数控制
pos_ad_sort_interstitial 排序
pos_ad_interstitial 广告位
pos_ad_interstitial_enable 是否开启插屏广告
pos_ad_interstitial_duration 插屏广告间隔时间
// 主UIViewController中初始化
- (void)viewDidLoad {
[super viewDidLoad];
[[AdInterstitialManager shareManager] initInterstitial];
}
// 在所有UIViewController中,检验是否初始化成功
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[AdInterstitialManager shareManager] checkInit];
}
// 在所有UIViewController中调用展示方法,满足条件将会自动展示
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[[AdInterstitialManager shareManager] showAd:self];
}
在相应app中增加计算事件
ad_native_key 原生广告
ad_splash_key splash广告
ad_interstitial_key 插屏广告
ad_inter_recommend_key 交叉推广
AdManager.h
// 信息流广告间隔在线配置
+ (int)adSplitWithDefault:(int)defaultSplit max:(int)max
注意事项
1. 在内容流中增加广告后,发起网络请求的skip处理
2. 相应cell点击的广告判断
3. cell展示时,上报广告曝光
网络请求成功, 内容插入广告
- (void)requestSuccess:(NSDictionary *)dict {
[super requestSuccess:dict];
NSDictionary *resdict = [JSONParse optNSDictionary:dict valueForKey:@"res"];
NSArray *news = [JSONParse optNSArray:resdict valueForKey:@"news"];
// array 内容数据
NSMutableArray *array = [[NSMutableArray alloc] init];
for (NSDictionary *temp in news) {
NewsBean *bean = [[NewsBean alloc] initWithDict:temp];
[array addObject:bean];
}
// 在内容流中插入广告,如果广告间隔,参数超过合法值,则取一个默认值
int split = [AdManager adSplitWithDefault:20 max:NEWS_LIMIT];
if (![[AdManager shareManager] adIsEmpty]) {
array = [AdManager mergeAd:array split:split];
}
[self.items addObjectsFromArray:array];
[self.tableView reloadData];
}
发起网络请求,处理skip
- (NSMutableDictionary *)createParams {
NSMutableDictionary *params = [super createParams];
NSInteger skip = [self.items count] - [AdManager adCountInArray];
[params setValue:[NSString stringWithFormat:@"%ld", (long)skip] forKey:PARAM_SKIP];
[params setValue:[NSString stringWithFormat:@"%d", NEWS_LIMIT] forKey:PARAM_LIMIT];
return params;
}
cell显示时,上报曝光
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([cell isKindOfClass:[AdTableViewCell class]]) {
AdTableViewCell *adCell = (AdTableViewCell *)cell;
[[AdManager shareManager] showAd:adCell.cellAdBean];
}
}
AdTableViewCell.h文件
#import <UIKit/UIKit.h>
@interface AdTableViewCell : UITableViewCell
@property (retain, nonatomic) AdBean *cellAdBean;
- (void)updateContent:(AdBean *)adBean row:(NSInteger)row;
@end
AdTableViewCell.m文件
#import "AdTableViewCell.h"
@interface AdTableViewCell ()
{
NSInteger _row;
}
@end
@implementation AdTableViewCell
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (void)updateContent:(AdBean *)adBean row:(NSInteger)row {
if (!adBean) {
return;
}
if (![[AdManager shareManager] adIsEmpty] && _row == row) {
return;
}
// 清除之前的广告UI
for (UIView *temp in [self subviews]) {
if ([temp isKindOfClass:[AdCommonView class]]) {
PLog(@"remove ad common view");
[temp removeFromSuperview];
}
}
// 广告
AdBean *adObj = [[AdManager shareManager] getAdBean];
self.cellAdBean = adObj;
if (![SafeObject objIsNull:adObj]) {
// 广告View
AdCommonView *view = [adObj getAdViewWithCtrl:[self baseViewController]];
view.touchAdBlock = ^(){
[[AdManager shareManager] clickAd:adObj];
};
// 将广告View放到self.view上
[self addSubview:view];
// 将广告数据更新到广告UI上
[adObj loadAdInfoUI];
}
_row = row;
}
@end