Загрузка iAds ограничена после повторного запуска приложения из фона (также происходит в iAdSuite) - PullRequest
12 голосов
/ 13 ноября 2011

Я пытаюсь внедрить пример NavigationBanner iAdSuite в свой проект, чтобы я мог совместно использовать один экземпляр AdBannerView на нескольких контроллерах представления, но я получаю следующую ошибку:

Error Domain = ADErrorDomain Code = 2 "Операция не может быть завершена. Загрузка удушена

Я скопировал соответствующий код именно из текущего iAdSuite в свое собственное приложение и получаю эту ошибку. Фактически эта ошибкаповторяется в собственном примере Apple iAdSuite для NavigationBanner (это пример, который я пытаюсь реализовать). Ошибка может быть замечена добавлением:

NSLog (@"%@",error);

к:

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

КомуЧтобы воспроизвести проблему в iAdSuite, выполните следующие действия:

  1. Включите режим «В самолете» на устройстве. Вкл.
  2. Запустите iAdSuite NavigationBanner из XCode. Это сразу же приводит к ошибке «Ошибка ADErrorDomain 1».
  3. Выйдите из приложения, нажав кнопку «Домой» на своем устройстве, затем выключите режим «В самолете».
  4. Перезапустите NavigationBanner от tappin.g значок, и появляется сообщение об ошибке.

Это проблема для моего приложения, поскольку я хочу скрыть iAd, если нет подключения, а затем снова отобразить его после возобновления подключения.Если приложение получит ошибку регулирования, то пройдет много времени, прежде чем оно сможет принять другое объявление.

Как избежать ошибки регулирования?Я думал, что bannerView необходимо удалить, а затем снова добавить, но я не мог понять, как это сделать правильно.

Последнее, на что следует обратить внимание, это то, что текущий iAdSuite использует ARC, а мое приложение - нет.,Несмотря на это, ошибка возникает как с моим приложением, так и с iAdSuite.

Ответы [ 2 ]

1 голос
/ 17 марта 2014
/*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 <UIApplicationDelegate,ADBannerViewDelegate>
    {

      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 голос
/ 16 января 2014

Попробуйте определить состояние сети с помощью кода проекта «Reachability» от Apple.На Github есть версия, совместимая с ARC.(https://github.com/tonymillion/Reachability) После того как Reachability.h импортирован в заголовочный файл, вы можете попробовать следующий код. Reachability определит, доступно ли какое-либо соединение, а если нет, то 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);
    }
}
...