iOS 集成 Facebook 广告 Audience Network

  • 如果APP 在海外一定用户基础后一定会开始想着变现 Facebook的 Audience Network是一个非常不错的选择
    Audience Network 由于墙的原因 国内几乎没什么攻略 ,遇到的坑在此记录一下
    官方集成文档Audience Network 需要翻墙

开始集成

  • 使用 Cocoapod 将以下代码行添加到项目的 Podfile 文件中:pod 'FBAudienceNetwork'
    运行 pod install 命令。
    可是这第一步就出问题了


    3606E67D-A527-4E9D-AA30-7A72D42AA534.png

我是翻墙的网络 也下不了,各种查也没办法。所以改为手动集成Audience Network SDK下载 需要翻墙

113E02F2-5B49-4685-BA2F-1475AF59A166.png

里面有SDK 和 Demo
我们把FBAudienceNetwork.framework 拖进工程

  • 在写代码之前 我们要在Facebook 后台查看一下 所创建广告版位的,这个版位是产品创建了,我们需要的是版位编码,
    已我的理解 版位编码 是可以创建多个,不同显示类型的分别创建,比如Banner类型创建一个 ,Native类型创建一个。由于这是产品负责,以后有添加在补充。


    D4088E78-F957-4E51-8EA2-6A722DCCF748.png
  • 还有一步 是我们要添加测试账号
    如果想要在你的测试机上显示AudienceNetwork. 广告,除了翻墙,并且要添加测试账号 ,还有你的测试机上安装Facebook应用 ,并使用管理员账号 或者 测试账号 登录Facebook ,否则无法请求成功。


    0500238E-1C8B-4590-8E0B-5B903EECEC38.png

总结一下必要的:

  1. 翻墙的网络
  2. 版位编码
  3. 添加测试账号或管理员账号
  4. 真机上安装Facebook 并使用测试账号或管理员登录
  • 接下来 就是 代码了 按照demo里写的就可以
    因为我是在TableView中展示 所以用的是FBNativeAdsManager
    代码如下


    99B80182-B53C-4571-962A-6A8C01B9A733.png
- (void)loadNativeAd{
    if (!self.adsManager) {
      //第一个参数是刚才申请的版位编码
      //第二个参数 请求广告的个数
        self.adsManager = [[FBNativeAdsManager alloc] initWithPlacementID:@"YOUR_PLACEMENT_ID"
                                                        forNumAdsRequested:5];
        // Set a delegate to get notified when the ads are loaded.
        self.adsManager.delegate = self;
        // Configure native ad manager to wait to call nativeAdsLoaded until all ad assets are loaded
        self.adsManager.mediaCachePolicy = FBNativeAdsCachePolicyAll;
    }
    [self.adsManager loadAds];
}
#pragma mark FBNativeAdsManagerDelegate implementation
- (void)nativeAdsLoaded{
    NSLog(@"Native ad was loaded, constructing native UI...");
}
- (void)nativeAdsFailedToLoadWithError:(NSError *)error{
    NSLog(@"Native ad failed to load with error: %@", error);
}
#pragma mark FBNativeAdDelegate
- (void)nativeAdDidClick:(FBNativeAd *)nativeAd{
    NSLog(@"Native ad was clicked.");
}
- (void)nativeAdDidFinishHandlingClick:(FBNativeAd *)nativeAd{
    NSLog(@"Native ad did finish click handling.");
}

- (void)nativeAdWillLogImpression:(FBNativeAd *)nativeAd{
    NSLog(@"Native ad impression is being captured.");
}

现在就可以进行调试了,结果我用iOS11的手机一直请求错误,下面是错误提示。

Initial request from a bundle must come from a App Admin, Developer or Tester

百度根本没有,换谷歌 终于在一位日本开发者的博客中找到了解决方案:找一个iOS10手机 在设置页面的Facebook里登录并且安装Facebook应用,重新运行程序,终于看到了请求成功的提示

Native ad was loaded, constructing native UI...

后来我在另一个应用中集成,iOS11 的手机直接就能请求成功。总结一句话:还得看运气

  • UI的搭建,按照demo 写就可以
96A20B86-6202-4004-B214-A4DE1796C171.png
  • 还有一点 可以分享给大家 ,FBNativeAd 是原生广告的对象,包括了广告的具体参数,如果你是 在列表中展示广告TableView或CollectionView,
    使用了 FBNativeAdsManager 请求多个原生广告 如TableView使用了 FBNativeAdTableViewCellProvider
#pragma mark FBNativeAdsManagerDelegate implementation

- (void)nativeAdsLoaded
{
    NSLog(@"Native ad was loaded, constructing native UI...");

    // After the native ads have loaded we create the native ad cell provider and let it take over
    FBNativeAdsManager *manager = self.adsManager;
    self.adsManager.delegate = nil;
    self.adsManager = nil;
    // The native ad cell provider operates over a loaded ads manager and can create table cells with native
    // ad templates in them as well as help with the math to have a consistent distribution of ads within a table.
    FBNativeAdTableViewCellProvider *cellProvider = [[FBNativeAdTableViewCellProvider alloc] initWithManager:manager forType:FBNativeAdViewTypeGenericHeight300];
    self.cellProvider = cellProvider;
    self.cellProvider.delegate = self;


    [self.tableView reloadData];
}

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // In this example the ads are evenly distributed within the table every kRowStrideForAdCell-th cell.
    NSUInteger count = [self.tableViewContentArray count];
    count = [self.cellProvider adjustCount:count forStride:kRowStrideForAdCell] ?: count;
    return count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // For ad cells just as the ad cell provider, for normal cells do whatever you would do.
    if ([self.cellProvider isAdCellAtIndexPath:indexPath forStride:kRowStrideForAdCell]) {
        return [self.cellProvider tableView:tableView cellForRowAtIndexPath:indexPath];
    } else {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kDefaultCellIdentifier forIndexPath:indexPath];
        // In this example we need to adjust the index back to the domain of the data.
        indexPath = [self.cellProvider adjustNonAdCellIndexPath:indexPath forStride:kRowStrideForAdCell] ?: indexPath;
        cell.textLabel.text = [self.tableViewContentArray objectAtIndex:indexPath.row];
        return cell;
    }
}

#pragma mark - UITableViewDelegate

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // The ad cell provider knows the height of ad cells based on its configuration
    if ([self.cellProvider isAdCellAtIndexPath:indexPath forStride:kRowStrideForAdCell]) {
        return [self.cellProvider tableView:tableView heightForRowAtIndexPath:indexPath];
    } else {
        return 80;
    }
}

会发现很卡顿 官方的方法虽然 都是if 判断,但某些场景下耦合度还是有点高,而且数据结构复杂的页面,经常广告和数据对不上。不想使用这个官方列表的方法,可以通过以下方法拿到原生广告FBNativeAd 对象 自行搭建列表

#pragma mark FBNativeAdsManagerDelegate implementation
- (void)nativeAdsLoaded
{
    APDLog(@"Native ad was loaded, constructing native UI...");
    
    FBNativeAdsManager *manager = self.adsManager;
    self.adsManager.delegate = nil;
    self.adsManager = nil;
    NSUInteger count =manager.uniqueNativeAdCount;
    NSLog(@"广告个数count :%ld",count);
      while (count) {
            NSLog(@"广告对象NativeAd :%@",manager.nextNativeAd);
        count--;
      }
}

参考链接:

  1. 官方集成文档Audience Network
    https://developers.facebook.com/docs/audience-network/

2.一位日本开发者 http://www.cl9.info/entry/2017/08/28/220000

  1. swift https://disp.cc/b/11-aeBf
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,968评论 3 119
  • 上周,国内院线杀出一匹黑马:《大护法》 豆瓣8.1,坐实了目前今年国产电影口碑NO.1。 电影用风格强烈的隐喻,道...
    猎影娘阅读 288评论 0 1
  • 去医院做身体检查总是很累的事情。因为等待的时间太漫长了。 医院这个地方什么时候去都是人满为患。 各种不同的病症,都...
    是个人类阅读 329评论 0 0
  • 第一次去北京,其中的欢欣与激动不言于耳,然而在真正去了北京,才发现北京的环境,建筑以及人文其实都与我经常去的西安是...
    塞飞夜阅读 235评论 0 2
  • 和我相处,请带上你的真诚 世界这么大,到处都是人。 不喜欢心眼太多的人, 因为玩不过人家; 不喜欢太有心机的人, ...
    crystal701阅读 157评论 0 2