iAds Loading Throttled na opnieuw starten app vanaf achtergrond (gebeurt ook in iAdSuite)

Ik probeer het NavigationBanner iAdSuite -voorbeeld in mijn project te implementeren, zodat ik een enkele AdBannerView -instantie over meerdere view-controllers kan delen, maar ik blijf de volgende foutmelding krijgen:

Error Domain = ADErrorDomain Code = 2 "De bewerking kon niet worden voltooid

Ik heb de relevante code exact gekopieerd van de huidige iAdSuite naar mijn eigen app en krijg deze foutmelding. In feite is deze fout herhaalbaar in Apple's eigen iAdSuite-voorbeeld voor NavigationBanner (dat is het voorbeeld dat ik probeer te implementeren). De fout kan worden gezien door toevoeging van:

NSLog (@"%@",error);

naar:

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

Ga als volgt te werk om het probleem in iAdSuite te repliceren:

  1. Schakel de vliegtuigmodus van je apparaat in naar Aan
  2. Start iAdSuite NavigationBanner vanuit Xcode. Dit genereert meteen een fout "ADErrorDomain error 1".
  3. Sluit de app door op de startknop op uw apparaat te drukken en schakel de vliegtuigmodus uit.
  4. Start NavigatieBanner opnieuw door op het pictogram te tikken en de foutmelding wordt weergegeven.

Dit is een probleem voor mijn applicatie omdat ik de iAd wil verbergen als er geen connectiviteit is en deze dan opnieuw te laten verschijnen zodra de connectiviteit wordt hervat. Als de app de throttling-fout ontvangt, duurt het lang voordat een nieuwe advertentie kan worden ontvangen.

Hoe kan de smoorfout worden voorkomen? Ik dacht dat de bannerView moet worden verwijderd en vervolgens opnieuw moet worden toegevoegd, maar niet kon achterhalen hoe dit op de juiste manier moet worden gedaan.

Een laatste ding om op te merken is dat de huidige iAdSuite ARC gebruikt terwijl mijn applicatie dat niet doet. Toch doet de fout zich voor met zowel mijn app als iAdSuite.

12
@ user955853 Als u een "gebroken" banner ziet, probeer deze dan uit de weergavehiërarchie te verwijderen. bijv. bel [_ bannerview removeFromSuperview]; wanneer u een foutmelding ontvangt.
toegevoegd de auteur t_motooka, de bron
Weet niet over de throttling error, maar waarom schrijf je dat er een lange vertraging zal zijn voordat je een nieuwe advertentie ontvangt? Het zou goed moeten zijn in de volgende iAd-cyclus, dus 3 minuten, niet?
toegevoegd de auteur gregory, de bron
Dit is verwarrend, ik volgde exact dezelfde stappen met de iAdSuite en dit is het bericht dat ik krijg bij stap 2: Configuratiegegevens kunnen niet worden gedownload Fout Domain = NSURLErrorDomain Code = -1009 "De internetverbinding lijkt offline te zijn.". Let op dit is geen iAd-fout, maar een NSURL-eroor. Bij stap 4 verschijnt de advertentie. Een verre haal, maar het klinkt voor mij dat je iad-framework opnieuw kan worden geïnstalleerd.
toegevoegd de auteur gregory, de bron
Ja, ik heb precies je stappen gevolgd, op een iPhone 4. Geen idee meer dat ik bang ben.
toegevoegd de auteur gregory, de bron
@gregory Na ontvangst van de fout lijkt het of een advertentie momenteel is geladen (de witte rand verdwijnt en er kan niet langer op worden getikt) en als er nog geen advertentie is geladen, wordt een advertentie nooit geladen nadat de fout is ontvangen . Nadat de app is gestopt en opnieuw is opgestart, lijkt het probleem vanzelf op te lossen, maar het lijkt erop dat er iets niet helemaal klopt met de code die Apple aanbiedt om dit te laten gebeuren.
toegevoegd de auteur user955853, de bron
Heb je de NSLog-verklaring toegevoegd om eventuele fouten te loggen? Ik heb geprobeerd om Xcode 4.2 opnieuw te installeren en ik krijg nog steeds deze foutmelding. Ik probeerde dit ook op twee iPhones (4S en 3GS) en hetzelfde probleem. Interessant is dat op de 3GS de NSURL-fout die je noemt ook komt, maar de NSURL-fout verschijnt niet op de 4S.
toegevoegd de auteur user955853, de bron
Update: voor iedereen die hetzelfde probleem heeft, kon ik het probleem nooit oplossen en daarom heb ik eindelijk een bugrapport bij Apple ingediend. Ik kreeg een antwoord dat dit nu is opgelost in iOS 6, die ik heb gecontroleerd en bevestigd. Eerdere versie van iOS heeft dit probleem nog steeds. Ik hoop dat dit iemand anders helpt die hetzelfde probleem tegen kan komen.
toegevoegd de auteur user955853, de bron

2 antwoord

Probeer de netwerkstatus te detecteren met de projectcode "Bereikbaarheid" van Apple. Er is een ARC-compatibele versie op Github. ( https://github.com/tonymillion/Reachability ) Zodra je Reachability.h hebt geïmporteerd in je header bestand, kunt u de onderstaande code proberen. Bereikbaarheid detecteert of een verbinding beschikbaar is en zo niet, dan wordt de iAd van het scherm verwijderd. Ik hoop dat dit helpt!

- (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
toegevoegd
/*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
toegevoegd