2014-11-19 13 views
5

Tôi đang trải qua một số hành vi kỳ lạ trong cả iOS7 và 8 ..Behavior Strange với iAd kẽ

gì xảy ra đôi khi toàn bộ màn hình được trình bày với một X (POTRAIT AD độ toàn màn hình - Ứng dụng của tôi là chỉ ngang). Bạn nhấp vào X và bạn có thể quay trở lại menu của tôi tốt.

Nhưng đôi khi quảng cáo sẽ hiển thị mà không có X (LANDSCAPE FUllSCREEN AD). Nếu bạn đợi DiDFinish, người được ủy quyền KHÔNG BAO GIỜ được gọi. Vì vậy, sau đó tôi thử nhấp vào nó để biến mất. Sau đó, nó hiển thị một quảng cáo khác có X (LANDSCAPE FUllSCREEN AD). Vì vậy, tôi nhấp vào X. Nó sau đó đi đến một quảng cáo (LANDSCAPE FUllSCREEN AD), nơi DiDFinish được gọi. iOS7 nó sẽ chỉ đóng băng trên quảng cáo thứ 3 được hiển thị. ios8 nó sẽ hiển thị quảng cáo thứ 3 trong một giây sau đó chuyển sang màn hình đen? Có ai bị xử lý như thế này không?

Bạn không chắc chắn liệu quảng cáo đầu tiên có hiển thị theo hướng dọc hay không thì có phải là đầu mối hay không?

Ngoài ra, nhiều quảng cáo hiển thị là tất cả iAd không rev mob và iAd được kết hợp khi tôi có tỷ lệ lấp đầy 100% cho iAd. tại im khoảnh khắc chỉ cố gắng để có được iAds toàn quảng cáo màn hình để làm việc một cách nhất quán

Tôi biết các đại biểu đã được thiết lập như didLoad đại biểu được gọi khi tải quảng cáo Ngoài ra đây là một vấn đề cho cả iPhone và iPad

Còn những ai có những vấn đề này nữa?

Sử dụng ..

[interstitial presentFromViewController:self]; 

Thay vì ..

[interstitial presentInView:self.view]; 

làm việc tất cả mọi thứ properly..but presentFromViewController: bị phản đối tại

enter image description here

Đây là mã tôi của tôi sử dụng ...

-(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; 
    requestingAd = NO; 
    NSLog(@"interstitialAd didFailWithERROR"); 
    NSLog(@"%@", error); 

    [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) { 
     [fs showAd]; 
     NSLog(@"Ad loaded"); 
    } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) { 
     NSLog(@"Ad error: %@",error); 
    } onClickHandler:^{ 
     NSLog(@"Ad clicked"); 
    } onCloseHandler:^{ 
     NSLog(@"Ad closed"); 
    }]; 
} 

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

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

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

nếu ai đó có thể chỉ cần gửi mã có được đầy đủ làm việc trong đó ứng dụng cho tôi để cố gắng cũng sẽ kiếm được 50 danh tiếng

Trả lời

3

Không có mã làm việc từ cuối của tôi, nhưng tôi đã có một cái nhìn trong Tài liệu và tìm thấy một catergory cho UIViewController với các phương pháp iAd

Here

có vẻ bạn đang trộn mã cũ với mã mới.

Từ những gì tôi đã thấy tôi sẽ đề nghị:

 -(void)showFullScreenAd { 
     //Check if already requesting ad 
     if (requestingAd == NO) { 
      [self requestInterstitialAdPresentation]; 
      requestingAd = YES; 
     } 
    } 

    -(void)viewDidLoad() 
{ 
    [super viewDidLoad]; 
// Any other setup. 
self.ADInterstitialPresentationPolicy = ADInterstitialPresentationPolicyManual 

} 

này sau thi hành iOS7 mới. Thiết lập chính sách trong phương thức viewDidLoad cho phép khung làm việc trước các tài sản bộ đệm và bắt đầu nhận bất kỳ quảng cáo nào từ Máy chủ iAd. Sẵn sàng vì vậy, khi phương thức "showFullScreenAd" được gọi là quảng cáo sẽ sẵn sàng.

Bạn cũng có thể gọi phương thức lớp +(void)prepareInterstitialAds khi tải chế độ xem hoặc thực hiện các tác vụ dữ liệu khác, điều này cho phép phần tử Khung trước bộ đệm nếu có thể, có nghĩa là yêu cầu tiếp theo sẽ nhanh hơn.

Để xử lý RevMob với lỗi của quảng cáo: [self requestInterstitialAdPresentation]; trả về giá trị logic, điều này có nghĩa là bạn có thể xử lý và báo cho RevMob không thành công, v.v ... Khi quảng cáo đã bị đóng. Nó có thể là tốt nhất để làm một số KVO trên tài sản presentingFullScreenAd của ViewController. Mà nói rằng nó đang hiển thị một FullScreenAd, tôi tin rằng đây chỉ là iAd, Full Ad's.

Lý do bạn có kết quả khác nhau như vậy là do bạn có 2 cách yêu cầu và trình bày quảng cáo trong cùng một trình điều khiển chế độ xem.

Khi quảng cáo được hiển thị Chân dung, [self requestInterstitialAdPresentation]; không thể truy xuất quảng cáo, nhưng Bản sao của cá thể ADInterstitialAd đã gửi một yêu cầu khác. Điều này đã được nạp, bởi vì bạn không thiết lập một khung cho khung nhìn của thể hiện nó không biết nó có nghĩa là để được cảnh quan và do đó, một phiên bản chân dung được trình bày. Vì điều này hiện được trình bày trong chế độ xem, chế độ xem không biết/quan tâm định hướng của nó, nên trình bày chế độ xem quảng cáo dựa trên hình dạng của nó.

Khi phong cảnh nằm xuống thành phố [self requestInterstitialAdPresentation]; thành công. Quảng cáo hàng đầu đó là quảng cáo từ cuộc gọi này. Tôi không chắc chắn lý do tại sao phần còn lại của cảnh quan hiển thị của quảng cáo, trừ khi đó là một cái gì đó từ Khung, tức là [self requestInterstitialAdPresentation]; nội bộ quyết định nó phải là cảnh quan từ bố cục ViewControllers, vì vậy tất cả các yêu cầu quảng cáo tiếp theo phù hợp với điều này, trừ khi định hướng VC thay đổi một lần nữa.

[EDIT] - Tôi đã gộp cùng một ví dụ mẫu cơ bản. Điều này đã được thực hiện từ bộ nhớ/tài liệu vì vậy có thể sẽ không chính xác 100% và rất có thể sẽ không hoạt động từ bản sao và dán trực tiếp. Đây là đưa ra ý tưởng, cũng bao gồm hỗ trợ cho các phiên bản trước iOS7

//.h 

@import UIKit; 
@import iAd; 

@interface MyInterstitialViewController : UIViewController <ADInterstitialAdDelegate> 
{ 

} 
@property (strong) ADInterstitialAd *fullScreenAd; 

@end 

//.m 

#include MyInterstitialViewController.h 

@implementation MyInterstitialViewController 
{ 
    - (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 
    { 
     if(self = [super initWithNibName:nibName bundle:nibBundle]) 
     { 

     } 
     return self; 
    } 


    -(void)viewDidLoad() 
    { 
     [super viewDidLoad]; 

     if([self respondsToSelector:@selector(requestInterstitialAdPresentation)] == YES) 
     { 
      self.ADInterstitialPresentationPolicy = ADInterstitialPresentationPolicyManual; 
     } 
    } 

    -(void)viewWillDisappear 
    { 
     @try 
     { 
        **[self removeObserver:self forKeyPath:@"isPresentingFullScreenAd"];** 
       } 
       @catch (NSException * __unused exception) 
     { 
     } 
    } 

    -(void)showFullScreenAd() 
    { 
     if([self respondsToSelector:@selector(requestInterstitialAdPresentation)] == NO) 
     { 
      self.fullScreenAd = [[ADInterstitialAd alloc] init]; 
      self.fullScreenAd.delegate = self; 
     } 
     else 
     { 
      if([self requestInterstitialAdPresentation] == NO) 
      { 
       //Report back to RevMob Controller that the Ad Failed. 
       [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) 
       { 
        [fs showAd]; 
        NSLog(@"Ad loaded"); 
       } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) 
       { 
        NSLog(@"Ad error: %@",error); 
       } onClickHandler:^{ 
        NSLog(@"Ad clicked"); 
       } onCloseHandler:^{ 
        NSLog(@"Ad closed"); 
       }]; 
      } 
      else 
      { 
       **[self addObserver:self forKeyPath:@"isPresentingFullScreenAd" options:NSKeyValueObservingOptions.NSKeyValueObservingOptionNew context:nil];** 
      } 
     } 
    } 

//ADInterstitialAd Delegate Methods. 
-(void)interstitialAd:(ADInterstitialAd *)interstitialAd didFailWithError:(NSError *)error 
{ 
    interstitial = nil; 
    NSLog(@"interstitialAd didFailWithERROR"); 
    NSLog(@"%@", error); 
    [revmobFS loadWithSuccessHandler:^(RevMobFullscreen *fs) 
     { 
      [fs showAd]; 
      NSLog(@"Ad loaded"); 
     } andLoadFailHandler:^(RevMobFullscreen *fs, NSError *error) 
     { 
      NSLog(@"Ad error: %@",error); 
     } onClickHandler:^{ 
      NSLog(@"Ad clicked"); 
     } onCloseHandler:^{ 
      NSLog(@"Ad closed"); 
     }]; 
} 
-(void)interstitialAdDidLoad:(ADInterstitialAd *)interstitialAd 
{ 
    NSLog(@"interstitialAdDidLOAD"); 
    if (self.fullScreenAd != nil) 
    { 
        CGRect interstitialFrame = self.view.bounds; 
interstitialFrame.origin = self.view.origin; 
UIView *view = [[UIView alloc] initWithFrame:interstitialFrame]; 
[self.view addSubview:view]; 
[self.fullScreenAd presentInView:view]; 


     NSLog(@"interstitialAdDidPRESENT"); 
    }//end if 
} 
-(void)interstitialAdDidUnload:(ADInterstitialAd *)interstitialAd 
{ 
    NSLog(@"interstitialAdDidUNLOAD"); 
} 
-(void)interstitialAdActionDidFinish:(ADInterstitialAd *)interstitialAd 
{ 
    NSLog(@"interstitialAdDidFINISH"); 
} 


//KVO Responding 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    **if([keyPath isEqualTo:"isPresentingFullScreenAd"] == YES) 
    { 
     if([object === self]) 
     { 
      if([self isPresentingFullScreenAd] == false) 
      { 
      //Handle logic for your app. New Screen etc. 
      } 
      else 
      { 
      //Handle logic for your app. Pause current activity etc. 
      } 
     } 
    }** 
} 

} 

Để tham khảo.

Những thay đổi tôi đã thực hiện cho phép các khung Quảng cáo để làm việc như bạn đang mong đợi nó để trên tất cả các phiên bản của iOS từ 4.3 - 8.x

Từ iOS 4.3 - 6.X dòng chảy chung là:

Tạo quảng cáo, đặt đại biểu, hiện tại và xử lý theo phương thức đại biểu.

Từ 7 - 8.x (Cách trước trình bày trong một UIViewController đã bị phản đối trong iOS 7, nhưng không dùng nữa có nghĩa là phương pháp trước đây làm việc cho đến khi việc phát hành X.0 tới, nói chung.)

Đối với trường hợp này bạn yêu cầu Khung cho quảng cáo thông qua [UIViewController requestInterstitialAdPresentation]; phương pháp. Bộ điều khiển sẽ tạo Chế độ xem và Trình bày nó nếu nó có quảng cáo. Bạn không nhận được những phương pháp đại biểu nữa, các "- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) đối tượng thay đổi: (NSDictionary *) thay đổi bối cảnh: (void *) bối cảnh"

Phương pháp

cho phép bạn thực hiện cuộc gọi ủy nhiệm khi Quảng cáo đã hoàn tất hiển thị để bạn có thể tiếp tục với logic của ứng dụng. Về cơ bản, cuộc gọi đại biểu "AdDidFinish". Nhưng vì chúng ta không loại bỏ người quan sát cho đến khi Bộ điều khiển được dỡ xuống, có logic để xử lý nếu một quảng cáo mới được hiển thị.

Điều này có nghĩa là logic cho VC của bạn không phải kiểm tra xem liệu nó có đang hiển thị quảng cáo toàn màn hình hay không.

Bạn vẫn có thể sử dụng luồng từ iOS 4.3 - 6.X nhưng sử dụng phương pháp presentInView.Như được mô tả trong hướng dẫn lập trình iAd, điều này nên được sử dụng nếu bạn có một cái nhìn nội dung bên trong, những gì tôi đã đặt ra là một phương pháp "Chuyển đổi quảng cáo".

+0

có tất cả các lỗi cố định ngoại trừ dòng này .. [đối tượng hiển thịBannerAd] nói không có phương pháp thể hiện đã biết nào cho công cụ chọn – 4GetFullOf

+0

Xin lỗi bạn cần truyền nó trước khi dòng đó đặt một cái gì đó như: ADIntersitualAd * ad = (ADInterstitualAd *) object phương pháp trong if to [ad displaysBannerAd]; –

+0

cùng lỗi ..- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) đối tượng thay đổi: (NSDictionary *) thay đổi bối cảnh: (void *) bối cảnh { ADInterstitialAd * ad = (ADInterstitialAd *) vật; if ([keyPath isEqualToString: @ "displayingBannerAd"] == YES) { if ([Quảng cáo displayingBannerAd] == false) { – 4GetFullOf