iPhone上的iAds插屏广告?

16

我和我的开发者之前曾试图在iPhone和iPad上加载插屏广告,但只能在iPad上使用。

在测试期间,我们发现iPhone不支持插屏广告,但自iOS7发布以来,有些人现在说这是可能的。

然而,我找不到任何合适的文档。不过,这个Stack问题让我再次思考 iAd& Admob在iPhone上的插屏整合

那么,使用iAd在iPhone上可以实现全屏插屏广告吗?


他们还不支持iAds,但是支持许多其他的广告网络,如Admob,Amazon和Chartboost。请查看http://appodeal.com/+signup。在Android上使用时,平均每千次展示收益(eCPM)可达7-9美元,并支持插页式广告和插页式视频! - Marian Klühspies
2个回答

20

我也一直在等待iAd为iPhone提供插页式广告。我终于在我的一个应用程序中实现了它,并且它正在正常运行并显示测试广告。该应用程序目前正在审核中,一旦获得批准并且我可以测试是否正在服务任何实际广告,我将更新我的答案。同时,这是我用来实现iAd插页式广告的代码:

ViewController.h

@interface ViewController : UIViewController <ADInterstitialAdDelegate> {
    ADInterstitialAd *interstitial;
    BOOL requestingAd;
}

-(void)showFullScreenAd;

ViewController.m

-(void)viewDidLoad {
    requestingAd = NO;
}

// Interstitial iAd
-(void)showFullScreenAd {
    // Check if already requesting ad
    if (requestingAd == NO) {
        [ADInterstitialAd release];
        interstitial = [[ADInterstitialAd alloc] init];
        interstitial.delegate = self;
        self.interstitialPresentationPolicy = ADInterstitialPresentationPolicyManual;
        [self requestInterstitialAdPresentation];
        NSLog(@"interstitialAdREQUEST");
        requestingAd = YES;
    }
}

-(void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error {
    interstitial = nil;
    [interstitialAd release];
    [ADInterstitialAd release];
    requestingAd = NO;
    NSLog(@"interstitialAd didFailWithERROR");
    NSLog(@"%@", error);
}

-(void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd {
    NSLog(@"interstitialAdDidLOAD");
    if (interstitialAd != nil && interstitial != nil && requestingAd == YES) {
        [interstitial presentFromViewController:self];
        NSLog(@"interstitialAdDidPRESENT");
    }
}

-(void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd {
    interstitial = nil;
    [interstitialAd release];
    [ADInterstitialAd release];
    requestingAd = NO;
    NSLog(@"interstitialAdDidUNLOAD");
}

-(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd {
    interstitial = nil;
    [interstitialAd release];
    [ADInterstitialAd release];
    requestingAd = NO;
    NSLog(@"interstitialAdDidFINISH");
}

我在用户执行某些操作后调用-(void)showFullScreenAd。欲了解更多信息,请参见UIViewController iAd Additions Reference

编辑:01/03/14 该应用程序更新已经获得批准并已上线12个小时。截至目前,我尚未收到任何插页式iAd。这可能是由于iPhone上缺乏插页式广告库存,也可能与我在iTunes Connect的iAd模块中收到的以下消息有关。消息如下:

当您提交要审核的应用程序[app name]时,iAd还将审核其在App网络上的使用情况,以确定其是否适合从iAd广告商那里接收广告。一旦您的应用程序获得批准,您就可以开始为在您的应用程序中运行的广告赚取收入。

我以前从未收到过这个消息,通常只要更新发布到App Store中,就会收到“您的应用现在有资格接收广告”的消息。这可能是由于我在应用程序中新实现了插页式广告,或者苹果已经更新了其iAd程序之一。

如果我开始接收插页式iAd,我会再次更新答案。在此期间,您可以在我的应用程序+Quotes上测试它。以上代码被调用,用户在应用程序内通过Facebook分享后将显示插页式广告。

编辑:01/07/14 直接联系iAd并于今日收到回复:

你好Daniel, 初始填充率将反映iOS 7上插页式的最新发布。感谢您的耐心等待,因为我们不断增加广告服务。 如果您尚未这样做,请将标准纵向和横向iAd横幅集成到应用程序中,以利用所有可用类型的广告库存。 最后,供参考,当您提交应用程序以供审核时,iAd还将对其进行审查,以确定是否适合从iAd广告商那里接收广告。因此,您的新iAd启用应用程序可能需要几天时间才能开始接收广告展示。 最好的祝福,  iAd应用网络支持

因此,iPhone的插页式iAd确实与iOS 7.0及以上版本兼容,但目前填充率较低。


代码只支持iOS7吗?期待您的应用上线后的更新。 - pixelkicks
@Buckers 是的,新的 iAd 增强功能需要 iOS 7.0 或以上版本,详见 UIViewController iAd Additions Reference - Daniel Storm
2
@DanielStormApps 这个几乎可以工作,只是 [interstitial presentFromViewController:self]; 自 iOS7 起已经被弃用了。请使用 [interstitial presentInView:self.view]; 代替。 - zero3nna
2
当广告完成调用委托时,其他人是否也遇到了黑屏的问题? - 4GetFullOf
@DanielStorm 你好,我已经实现了这个功能,但是在横屏模式下它不起作用,但在竖屏模式下除此之外都正常工作 :/ 在横屏模式下我得到的错误是:Code=3 "The operation couldn’t be completed. Ad inventory unavailable" 有什么想法吗? - user2876115
显示剩余8条评论

2

我的原始答案已经过时了,这里有一个更新的Swift实现:

此实现使用手动ADInterstitialPresentationPolicy,因此我们可以按照自己的间隔呈现插页式广告。当手动呈现插页式广告时,它不会加载自己的关闭按钮以解除自身。因此,我创建了一个UIView来呈现插页式广告,并使用插页式广告的委托方法来解除UIView。在测试中,仍然存在从iAd网络接收广告时的不一致性。有时你会收到广告,有时它无法加载,这使我们可以请求新的广告,有时什么也不会发生。这似乎就是iAd插页式广告的本质。

import UIKit
import iAd // Import iAd

class ViewController: UIViewController, ADInterstitialAdDelegate { // Include the delegate

    var iAdInterstitial = ADInterstitialAd() // Our ad
    var iAdInterstitialView = UIView() // View to present our ad in
    var adLoaded = false // Bool to keep track if an ad is loaded or not

    override func viewDidLoad() {
        super.viewDidLoad()
        setupAd()
    }

    func setupAd() {
        // Set presentation to manual so we can choose when to present the interstitial
        // Setting this will also fetch an interstitial ad for us
        self.interstitialPresentationPolicy = ADInterstitialPresentationPolicy.Manual
        iAdInterstitial.delegate = self // Set the delegate

        // Make our view the same size as the view we will be presenting in
        iAdInterstitialView.frame = self.view.bounds
    }

    func requestNewAd() {
        // This will fetch an ad for us
        ViewController.prepareInterstitialAds()
        println("Requesting new ad")
    }

    @IBAction func presentAdButton(sender: AnyObject) {
        if (adLoaded) {
            // We have an ad that is loaded so lets present it
            self.view.addSubview(iAdInterstitialView)
            iAdInterstitial.presentInView(iAdInterstitialView)
        }
        else {
            // No ad has been loaded
            println("Ad not loaded")
        }
    }

    func interstitialAdDidUnload(interstitialAd: ADInterstitialAd!) {
        // Kinda works as expected
        // Sometimes is called prematurely
        // Sometimes takes minutes after ad is dismissed to be called
        println("interstitialAdDidUnload")

        // Get new ad
        adLoaded = false
        iAdInterstitialView.removeFromSuperview()
        requestNewAd()
    }

    func interstitialAd(interstitialAd: ADInterstitialAd!, didFailWithError error: NSError!) {
        // Failed to load ad so lets try again
        println("didFailWithError: \(error)")
        requestNewAd()
    }

    func interstitialAdWillLoad(interstitialAd: ADInterstitialAd!) {
        // There is an ad and it has begun to download
        println("interstitialAdWillLoad")
    }

    func interstitialAdDidLoad(interstitialAd: ADInterstitialAd!) {
        // We got an ad
        println("interstitialAdDidLoad")
        adLoaded = true
    }

    func interstitialAdActionShouldBegin(interstitialAd: ADInterstitialAd!, willLeaveApplication willLeave: Bool) -> Bool {
        println("interstitialAdActionShouldBegin")
        return true;
    }

    func interstitialAdActionDidFinish(interstitialAd: ADInterstitialAd!) {
        // Done with this ad. Lets get a new one
        println("interstitialAdActionDidFinish")
        iAdInterstitialView.removeFromSuperview()
        adLoaded = false
        requestNewAd()
    }

我使用了上述代码,但总是收到错误消息didFailWithError: Error Domain=ADErrorDomain Code=3 "The operation couldn’t be completed. Ad inventory unavailable" UserInfo=0x7fe5584be760 {ADInternalErrorCode=3, NSLocalizedFailureReason=Ad inventory unavailable, ADInternalErrorDomain=ADErrorDomain}。请求新广告,但广告未加载。我已启用设置//developer//fill rate以始终为100%。 - amit gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接