@binbins
2017-05-26T09:36:56.000000Z
字数 6950
阅读 269
引入依赖框架
# 快速开发框架pod 'FFastlib', '~> 0.1.5'# 接入ADMobpod 'Firebase/Core'pod 'Firebase/AdMob'# 接入InMobipod '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.frameworkSecurity.frameworkWebKit.frameworklibz.tbdAVFoundation.frameworkAVKit.frameworkCoreMedia.frameworkSystemConfiguration.frameworkCoreTelephony.frameworkCoreLocation.frameworkMessageUI.frameworkCoreMotion.frameworklibc++.tbdStoreKit.frameworkAdSupport.frameworkSafariServices.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];// 广告ViewAdCommonView *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;}// 清除之前的广告UIfor (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]) {// 广告ViewAdCommonView *view = [adObj getAdViewWithCtrl:[self baseViewController]];view.touchAdBlock = ^(){[[AdManager shareManager] clickAd:adObj];};// 将广告View放到self.view上[self addSubview:view];// 将广告数据更新到广告UI上[adObj loadAdInfoUI];}_row = row;}@end