2016-09-12 10 views
1

ココアポッド(ポッド 'GoogleAds-IMA-iOS-SDK'、 '〜> 3.2.1')を使用してGoogle IMA SDKをプロジェクトに統合しました。私はsdkとやりとりするVideoPresenterという別のクラスを持っています。このプレゼンターは、AVPlayerを使用してビデオコンテンツを再生するVideoCellというコレクションビューのセルのプロパティです(このビデオコンテンツにプリロールビデオを追加しようとしています)。広告ローダーは、常に「IMA SDK loading timed out」というエラーメッセージで失敗します。これをどうやって解決するのですか?プレゼンターのコードは次のとおりです。google ima sdk ad loaderがsdkタイムアウトで失敗する

#import "VideoAdPresenter.h" 
#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h> 

@interface VideoAdPresenter() <IMAAdsLoaderDelegate,  IMAAdsManagerDelegate> 
@property (nonatomic, strong) IMAAVPlayerContentPlayhead *contentPlayhead; 
@property (nonatomic, strong) IMAAdsLoader *adsLoader; 
@property (nonatomic, strong) IMAAdsManager *adsManager; 

@end 

NSString *const kTestAppAdTagUrl = 
@"https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/single_ad_samples&ciu_szs=300x250&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ct%3Dlinear&correlator="; 


@implementation VideoAdPresenter 

- (id)initWithAvPlayer:(AVPlayer *)anAvPlayer 
{ 
    self = [super init]; 
    if(self) { 
     self.contentPlayhead = [[IMAAVPlayerContentPlayhead alloc]initWithAVPlayer:anAvPlayer]; 
     [self setupAdsLoader]; 
    } 
    return self; 
} 

- (void)setupAdsLoader 
{ 
    self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:nil]; 
    self.adsLoader.delegate = self; 
} 

- (void)requestAds { 
    if(!self.videoAdTagUrl || [self.videoAdTagUrl isEqualToString:@""]) { 
    NSLog(@"Nil or empty video ad tag url (%@) passed to video ad presenter: %@", self.videoAdTagUrl, [self description]); 
    return; 
} 
    IMAAdDisplayContainer *adDisplayContainer =  [[IMAAdDisplayContainer alloc] initWithAdContainer:self.adContainerView companionSlots:nil]; 
    IMAAdsRequest *request = [[IMAAdsRequest alloc]initWithAdTagUrl:kTestAppAdTagUrl adDisplayContainer:adDisplayContainer contentPlayhead:self.contentPlayhead userContext:nil]; 

    [self.adsLoader requestAdsWithRequest:request]; 
} 

#pragma mark - ads loader delegate 

- (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData: (IMAAdsLoadedData *)adsLoadedData { 
    // Grab the instance of the IMAAdsManager and set ourselves as the delegate. 
    self.adsManager = adsLoadedData.adsManager; 
    self.adsManager.delegate = self; 

    IMAAdsRenderingSettings *adsRenderingSettings = [[IMAAdsRenderingSettings alloc] init]; 
    adsRenderingSettings.webOpenerPresentingController = self.presentingController; 

    [self.adsManager initializeWithAdsRenderingSettings:adsRenderingSettings]; 
} 

- (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData: (IMAAdLoadingErrorData *)adErrorData { 
    // Something went wrong loading ads. Log the error and play the content. 
    NSLog(@"Error loading ads: %@", adErrorData.adError.message); 
    if(self.delegate && [self.delegate respondsToSelector:@selector(videoAdPresenterRequestedContentResume:)]) { 
     [self.delegate videoAdPresenterRequestedContentResume:self]; 
    } 
} 




#pragma mark - ads manager delegate 
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent: (IMAAdEvent *)event { 
    // When the SDK notified us that ads have been loaded, play them. 
    if (event.type == kIMAAdEvent_LOADED) { 
     [adsManager start]; 
    } 
} 

- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdError:(IMAAdError *)error { 
    // Something went wrong with the ads manager after ads were loaded. Log the error and play the 
    // content. 
    NSLog(@"AdsManager error: %@", error.message); 
    if(self.delegate && [self.delegate respondsToSelector:@selector(videoAdPresenterRequestedContentResume:)]) { 
     [self.delegate videoAdPresenterRequestedContentResume:self]; 
    } 
} 

- (void)adsManagerDidRequestContentPause:(IMAAdsManager *)adsManager { 
    // The SDK is going to play ads, so pause the content. 
    if(self.delegate && [self.delegate respondsToSelector:@selector(videoAdPresenterRequestedContentPause:)]) { 
     [self.delegate videoAdPresenterRequestedContentPause:self]; 
    } 
} 

- (void)adsManagerDidRequestContentResume:(IMAAdsManager *)adsManager { 
    // The SDK is done playing ads (at least for now), so resume the content. 
    if(self.delegate && [self.delegate respondsToSelector:@selector(videoAdPresenterRequestedContentResume:)]) { 
     [self.delegate videoAdPresenterRequestedContentResume:self]; 
    } 
} 
@end 

答えて

0

理由は、プレゼンターがバックグラウンドスレッドから呼び出されたためです。メインスレッドから同じものを実行することで問題が解決されました。

関連する問題