0

当没有要显示的 iAd 横幅时,我们希望显示指向特定 URL 的相同尺寸的 UIWebView。

但是,隐藏 iAd 横幅并显示 UIWebView 不起作用。我们将显示/隐藏代码嵌入到bannerViewDidLoadAddidFailToReceiveAdWithError. 当没有 iAd 库存而不是我们的 UIWebView 时,出现的只是白色的空白矩形。

如果用户单击 UIWebView 内的链接,我们希望该链接在 Safari 中打开。我们是否需要向 UIWebView 添加委托?

代码:

//
//  SAiOSAdPlugin.m
//  Ad Plugin for PhoneGap
//
//  Created by shazron on 10-07-12.
//  Copyright 2010 Shazron Abdullah. All rights reserved.
//  Cordova v1.5.0 Support added 2012 @RandyMcMillan
//

#import "SAiOSAdPlugin.h"

//#ifdef CORDOVA_FRAMEWORK
#import <Cordova/CDVDebug.h>
//#else
//#import "CDVDebug.h"
//#endif

@interface SAiOSAdPlugin(PrivateMethods)

- (void) __prepare:(BOOL)atBottom;
- (void) __showAd:(BOOL)show;

@end


@implementation SAiOSAdPlugin

@synthesize adView;
@synthesize bannerIsVisible, bannerIsInitialized, bannerIsAtBottom, isLandscape;

#pragma mark -
#pragma mark Public Methods

- (void) resizeViews
{
    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass && self.adView)
    {
        CGRect webViewFrame = [super webView].frame;
        CGRect superViewFrame = [[super webView] superview].frame;
        CGRect adViewFrame = self.adView.frame;

        BOOL adIsShowing = [[[super webView] superview].subviews containsObject:self.adView];
        if (adIsShowing) 
        {
            if (self.bannerIsAtBottom) {
                webViewFrame.origin.y = 0;
                CGRect adViewFrame = self.adView.frame;
                CGRect superViewFrame = [[super webView] superview].frame;
                adViewFrame.origin.y = (self.isLandscape ? superViewFrame.size.width : superViewFrame.size.height) - adViewFrame.size.height;
                self.adView.frame = adViewFrame;
            } else {
                webViewFrame.origin.y = adViewFrame.size.height;
            }

            webViewFrame.size.height = self.isLandscape? (superViewFrame.size.width - adViewFrame.size.height) : (superViewFrame.size.height - adViewFrame.size.height);
        } 
        else 
        {
            webViewFrame.size = self.isLandscape? CGSizeMake(superViewFrame.size.height, superViewFrame.size.width) : superViewFrame.size;
            webViewFrame.origin = CGPointZero;
        }

        [UIView beginAnimations:@"blah" context:NULL];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        [super webView].frame = webViewFrame;

        [UIView commitAnimations];
    }
}

- (void) orientationChanged:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
{
    NSInteger orientation = [[arguments objectAtIndex:0] integerValue];

    switch (orientation) {
        // landscape
        case 90:
        case -90:
            self.isLandscape = YES;
            break;
        // portrait
        case 0:
        case 180:
            self.isLandscape = NO;
            break;
        default:
            break;
    }

    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass && self.adView)
    {
        self.adView.currentContentSizeIdentifier = self.isLandscape ? ADBannerContentSizeIdentifierLandscape : ADBannerContentSizeIdentifierPortrait;
        [self resizeViews];
    }
}

- (void) prepare:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
    NSUInteger argc = [arguments count];
    if (argc > 1) {
        return;
    }

    NSString* atBottomValue = [arguments objectAtIndex:0];
    [self __prepare:[atBottomValue boolValue]];
}

- (void) showAd:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
    NSUInteger argc = [arguments count];
    if (argc > 1) {
        return;
    }

    NSString* showValue = [arguments objectAtIndex:0];
    [self __showAd:[showValue boolValue]];
}

#pragma mark -
#pragma mark Private Methods

- (void) __prepare:(BOOL)atBottom
{
    NSLog(@"SAiOSAdPlugin Prepare Ad At Bottom: %d", atBottom);

    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass && !self.adView)
    {
        self.adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
        // we are still using these constants even though they are deprecated - if it is changed, iOS 4 devices < 4.3 will crash.
        // will need to do a run-time iOS version check 
        self.adView.requiredContentSizeIdentifiers = [NSSet setWithObjects: ADBannerContentSizeIdentifierPortrait, ADBannerContentSizeIdentifierLandscape, nil];        

        self.adView.delegate = self;

        NSString* contentSizeId = (self.isLandscape ? ADBannerContentSizeIdentifierLandscape : ADBannerContentSizeIdentifierPortrait);

        self.adView.currentContentSizeIdentifier = contentSizeId;

        if (atBottom) {
            self.bannerIsAtBottom = YES;
        }

        self.bannerIsVisible = NO;
        self.bannerIsInitialized = YES;

        self.houseAdView = [[UIWebView alloc] initWithFrame: CGRectMake(0.0, 0.0, 1.0, 1.0)];
        self.houseAdView.frame = self.adView.frame;
        NSURLRequest *request = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.panabee.com"]];
        [self.houseAdView loadRequest: request];

    }
}

- (void) __showAd:(BOOL)show
{
    NSLog(@"SAiOSAdPlugin Show Ad: %d", show);

    if (!self.bannerIsInitialized){
        [self __prepare:NO];
    }

    if (!(NSClassFromString(@"ADBannerView") && self.adView)) { // ad classes not available
        return;
    }

    if (show == self.bannerIsVisible) { // same state, nothing to do
        return;
    }

    if (show)
    {
        [UIView beginAnimations:@"blah" context:NULL];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        [[[super webView] superview] addSubview:self.adView];
        [[[super webView] superview] bringSubviewToFront:self.houseAdView];
        [[[super webView] superview] bringSubviewToFront:self.adView];
        [self resizeViews];

        [UIView commitAnimations];

        self.bannerIsVisible = YES;
    }
    else 
    {
        [UIView beginAnimations:@"blah" context:NULL];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        [self.adView removeFromSuperview];
        [self resizeViews];

        [UIView commitAnimations];

        self.bannerIsVisible = NO;
    }

}

#pragma mark -
#pragma ADBannerViewDelegate

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass)
    {
        NSString* jsString =
        @"(function(){"
        "var e = document.createEvent('Events');"
        "e.initEvent('iAdBannerViewDidLoadAdEvent');"
        "document.dispatchEvent(e);"
        "})();";

        [banner setHidden:YES];
        [self.houseAdView setHidden:NO];

        [super writeJavascript:[NSString stringWithFormat:jsString]];
    }
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError*)error
{
    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass)
    {
        NSString* jsString = 
        @"(function(){"
        "var e = document.createEvent('Events');"
        "e.initEvent('iAdBannerViewDidFailToReceiveAdWithErrorEvent');"
        "e.error = '%@';"
        "document.dispatchEvent(e);"
        "})();";

        [banner setHidden:YES];
        [self.houseAdView setHidden:NO];

        [super writeJavascript:[NSString stringWithFormat:jsString, [error description]]];
    }
}

@end
4

1 回答 1

0

又是我 :)

您没有将其添加到子视图树中。

从你的__prepare方法

self.houseAdView = [[UIWebView alloc] initWithFrame: CGRectMake(0.0, 0.0, 1.0, 1.0)];
self.houseAdView.frame = self.adView.frame;
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.panabee.com"]];
[self.houseAdView loadRequest: request];

那太棒了。但它不起作用——你错过了一行代码——一条关键的、重要的行,让每个开发人员都花时间或其他时间。

[self addSubview:self.houseAdView];

我正在做一些假设,self比如UIView. 发货前测试。

所以,你的方法的那部分__prepare应该是这样的:

self.houseAdView = [[UIWebView alloc] initWithFrame: CGRectMake(0.0, 0.0, 1.0, 1.0)];
self.houseAdView.frame = self.adView.frame;
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.panabee.com"]];
[self.houseAdView loadRequest: request];
[self addSubview:self.houseAdView];
于 2013-06-01T14:29:31.657 回答