バックグラウンドからアプリケーションを再起動した後に負荷が軽減されるiAds(iAdSuiteでも発生します)

複数のView Controller間で AdBannerView のインスタンスを共有できるように、 NavigationBanner iAdSuite の例をプロジェクトに実装しようとしていますが、次のエラーが発生し続ける:

エラードメイン= ADErrorDomainコード= 2 "操作を完了できませんでした。

私は関連するコードを現在のiAdSuiteから自分のアプリに正確にコピーして、このエラーが発生しています。実際、このエラーはApple独自のNavigationBannerのiAdSuiteの例でも繰り返されています(実装しようとしている例です)。エラーは、次のものを追加することで確認できます。

NSLog (@"%@",error);

に:

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error

iAdSuite の問題を再現するには、次のようにします。

  1. 端末の飛行機モードをオンにします
  2. XcodeからiAdSuite NavigationBannerを起動します。これにより、すぐにエラー "ADErrorDomain error 1"が生成されます。
  3. 端末のホームボタンを押してアプリを終了し、飛行機モードをオフにします。
  4. アイコンをタップしてNavigationBannerを再起動すると、エラーが表示されます。

これは私のアプリケーションにとって問題です。なぜなら、接続がない場合にiAdを隠してから、接続が再開すると再び表示されるからです。アプリがスロットリングエラーを受け取った場合、別の広告を受信するまでに時間がかかります。

どのようにしてスロットルエラーを回避できますか?バナービューを削除してから再追加する必要があると思っていましたが、これを正しく行う方法を理解できませんでした。

最後に注意しておきたいのは、現在のiAdSuiteはアプリケーションが動作していない間にARCを使用するということです。それでも、私のアプリとiAdSuiteの両方でエラーが発生します。

12
追加された 編集された
ビュー: 1
@ user955853「壊れた」バナーが表示された場合は、ビューの階層から削除してください。例えばエラーが発生した場合は [_ bannerview removeFromSuperview]; を呼び出してください。
追加された 著者 t_motooka,
スロットリングエラーについてはわかりませんが、別の広告を受信するまでに時間がかかると書いているのはなぜですか?それは次のiAdサイクルで大丈夫なはずなので3分、いいえ?
追加された 著者 gregory,
これは混乱しています。私はあなたの手順を正確にiAdSuiteで追跡しました。これはステップ2で取得したメッセージです:設定データをダウンロードできませんでした。エラードメイン= NSURLErrorDomainコード= -1009 "インターネット接続はオフラインです。これはiAdエラーではなく、NSURLのエラーです。ステップ4で広告が表示されます。遠いフェッチが、あなたの私のフレームワークを再インストールすることができます私に聞こえる。
追加された 著者 gregory,
はい、私はiPhone 4であなたのステップを正確に続けました。これ以上のアイデアはありません。
追加された 著者 gregory,
@gregoryエラーを受け取った後、広告が現在ロードされている場合、「中断」しているように見えます(白い枠線が消えてタップできなくなります)。まだ広告がロードされていない場合は、 。アプリケーションを終了してもう一度起動した後、問題は解決するように見えますが、Appleがこれを実現するために提供しているコードが正しくないようです。
追加された 著者 user955853,
エラーを記録するためにNSLogステートメントを追加しましたか? Xcode 4.2を再インストールしようとしましたが、まだこのエラーが発生します。私はまた、2つのiPhone(4Sと3GS)と同じ問題でこれを試しました。興味深いことに、3GSでは、あなたが言及するNSURLエラーも同様ですが、NSURLエラーは4Sには表示されません。
追加された 著者 user955853,
アップデート:同じ問題を抱えている人は、決して問題を解決できなかったので、最終的にAppleにバグレポートを提出しました。私はこれがiOS 6で修正されたという応答を受けました。これは確認して確認しました。以前のバージョンのiOSでも引き続きこの問題が発生します。私はこれが同じ問題を克服するかもしれない他の誰かを助けることを願っています。
追加された 著者 user955853,

2 答え

Appleが "Reachability"プロジェクトコードでネットワークの状態を検出してみてください。 GithubにはARC互換バージョンがあります。 ( https://github.com/tonymillion/Reachability )ヘッダーにReachability.hをインポートしたら以下のコードを試してみてください。接続可能な接続があれば到達可能性が検出され、そうでなければiAdは画面外に移動します。お役に立てれば!

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    [reachability startNotifier];

    NetworkStatus status = [reachability currentReachabilityStatus];

    if(status == NotReachable)
    {
       //No internet connection. We need to move the iAd off screen.
        NSLog(@"No network connection. iAd will hide.");
        banner.frame = CGRectOffset(banner.frame, 320, 0);
    }
    if(status == ReachableViaWifi)
    {
        banner.frame = CGRectOffset(banner.frame, your position here);
    }
    if(status == ReachableViaWWAN)
    {
        banner.frame = CGRectOffset(banner.frame, your position here);
    }
}
1
追加された
/*Implement the iAd in app delegate and use the applicationDidBecomeActive method.Here I use #import "Reachability.h" class downloaded from Github Here is the code.*/




//  AppDelegate.h




 @interface AppDelegate : UIResponder 
    {

      BOOL iAdLauchFlag;
      ADBannerView *bannerView;
      UILabel  *notifier ;
      UIView *iAdview;
    }

//  AppDelegate.m




  #import "AppDelegate.h"

  #import "Reachability.h"



    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

    {

      LauchFlag=NO;

      notifier=[[UILabel alloc]init];

      notifier=[[UILabel alloc]initWithFrame:CGRectMake(0.0f, 40.0f, bounds.size.height, 30)];

       iAdview =[[UIView      alloc]initWithFrame:CGRectMake(0.0f,bounds.size.width,bounds.size.height, 30)]; 

    }

    -(void) applicationDidBecomeActive: (UIApplication *) application 
    {

        NSLog(@"applicationDidBecomeActive");

     if ( [self connectedToNetwork] )

      {

          if(!LauchFlag)
            {
              CGRect bounds=[[UIScreen mainScreen] bounds];

              NSLog(@"allocated banner view");

             bannerView = [[ADBannerView alloc]
                          initWithFrame:CGRectMake(0.0f, 30.0f, bounds.size.height, 30)];


             [notifier setText:@"  Connecting to iAd service......."];
             [iAdview addSubview:notifier];
            }
            bannerView.delegate = self;


        }
        else
        {
            if(LauchFlag)
            {
                [bannerView removeFromSuperview];
                [bannerView release];
                 LauchFlag=NO;
            }
            [notifier setText:@" iAd failed to launch due to internet connection problem "];
            [iAdview addSubview:notifier];
        }

    }

    -(BOOL)bannerViewActionShouldBegin:
    (ADBannerView *)banner
                   willLeaveApplication:(BOOL)willLeave{


     return YES;

    }

    - (void)bannerViewActionDidFinish:(ADBannerView *)banner
    {
    }

    -(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
    {

        NSLog(@"bannerView:(ADBannerView *)banner didFailToReceiveAdWithError");


        if ([self connectedToNetwork]) {

            [notifier setText:@" Launching iAd ............"];


            NSLog(@"Reachable");
        }
        else {

            [notifier setText:@"error: iAd failed to launch due internet connection problem "];


            NSLog(@"Not Reachable");
        }


    }

    -(void)bannerViewDidLoadAd:(ADBannerView *)banner
    {

        NSLog(@"bannerViewDidLoadAd");
        [notifier removeFromSuperview];
        [iAdview  addSubview:bannerView];
         LauchFlag=YES;

    }
- (BOOL) connectedToNetwork
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];
    BOOL internet;
    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) {
        internet = NO;
    } else {
        internet = YES;
    }
    return internet;
}

// viewcontroller1

#import "AppDelegate.h"

 - (void)viewDidLoad
{
     AppDelegate *appdelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];
      [[self view] addSubview:appdelegate.iAdview];
}

// viewcontroller2

#import "AppDelegate.h"
 - (void)viewDidLoad
{
    AppDelegate *appdelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];
     [[self view] addSubview:appdelegate.iAdview];
}
1
追加された