2014-11-12 3 views
1

Я успешно реализовал покупку в приложении для удаления рекламы в своем приложении. Он работал в первый раз, когда я это пробовал, но после того, как я запустил приложение на своем телефоне еще несколько раз, он начал показывать белый рекламный баннер вместо того, чтобы скрыть рекламный баннер, как он привык.iAd, показывающий белый баннер

Вот код для StartScreen.m моего приложения, а также PurchaseViewController.m, чтобы купить IAP для удаления рекламы. Я также получил предупреждение о том, что я использую 10 экземпляров ADBanner, хотя я их удаляю всякий раз, когда вид исчезает. Спасибо за любую помощь.

// 
//StartScreen.m 
// 

@interface StartScreen() 
{ 
    BOOL _bannerIsVisible; 
} 
@end 

@implementation StartScreen 

- (void)viewDidLoad { 


//Ads 
    self.adBanner.delegate = self; 

} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [self.adBanner removeFromSuperview]; 
    self.adBanner.delegate = nil; 
    self.adBanner = nil; 
} 

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

    // Check for Remove Ads IAP 

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

    if ([prefs boolForKey:@"RemoveAds"] == TRUE) { 
     self.adBanner.hidden = YES; 
     _bannerIsVisible = NO; 
    } else if (!_bannerIsVisible) 
    { 
     self.adBanner.hidden = NO; 
     _bannerIsVisible = YES; 
    } 
} 

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 
{ 
    NSLog(@"Failed to retreive ad"); 

    // Check for Remove Ads IAP 

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

    if ([prefs boolForKey:@"RemoveAds"] == TRUE) { 
     self.adBanner.hidden = YES; 
     _bannerIsVisible = NO; 
    } 
} 

// 
// PurcahseViewController.m 
// 

#import "PurcahseViewController.h" 

@implementation PurcahseViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.productID = @"com.app.iap1"; 
    [self getProductID:self]; 

    self.buyButton.enabled = NO; 
    NSLog(@"%@", self.productID); 
} 

- (void)getProductID:(UIViewController *)viewController { 
    if ([SKPaymentQueue canMakePayments]) { 
     SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:self.productID]]; 
     request.delegate = self; 

     [request start]; 
    } else { 
     self.productDescription.text = @"Please enable in app purchase in your settings"; 
    } 
} 

- (IBAction)purchaseItem:(id)sender { 
    SKPayment *payment = [SKPayment paymentWithProduct:self.product]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 

- (IBAction)restoreButton:(id)sender { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 
    [self UnlockPurchase]; 
} 

- (void)Purchased { 
    NSLog(@"Item has been purchased"); 
} 

#pragma mark _ 
#pragma mark SKProductsRequestDelegate 

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { 

    NSArray *products = response.products; 

    if (products.count != 0) { 
     self.product = products[0]; 
     self.buyButton.enabled = YES; 
     self.productTitle.text = self.product.localizedTitle; 
     self.productDescription.text = self.product.localizedDescription; 
    } else { 
     self.productTitle.text = @"404: Product Not Found"; 
    } 

    products = response.invalidProductIdentifiers; 

    for (SKProduct *product in products) { 
     NSLog(@"404: Product Not Found: %@", product); 
    } 
} 

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 

    for (SKPaymentTransaction *transaction in transactions) { 
     switch (transaction.transactionState) { 
      case SKPaymentTransactionStatePurchased: [self UnlockPurchase]; 
       [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
       break; 

      case SKPaymentTransactionStateFailed:NSLog(@"Transaction Failed"); 
       [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
       default: 
       break; 

     } 
    } 
} 

-(void)UnlockPurchase { 
    self.buyButton.enabled = NO; 
    [self.buyButton setTitle:@"Purchased" forState:UIControlStateDisabled]; 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    [prefs setBool:TRUE forKey:@"RemoveAds"]; 
    [prefs synchronize]; 
    [self Purchased]; 
} 
+0

Скрыть баннер в 'didFailToReceiveAdWithError:' независимо от ваших «RemoveAds» условно. –

+0

Кроме того, _bannerIsVisible bool избыточен. –

+0

Я напишу свои комментарии в правильном ответе, поэтому вам будет немного легче ... –

ответ

0

Прежде всего, чтобы ответить на ваш вопрос, причина, по которой ваш баннер не скрывается, когда ваше объявление выходит из строя, заключается в том, что вы его не скрываете. Независимо от того, стоит ли [prefs boolForKey:@"RemoveAds"] == TRUE, вы захотите скрыть этот баннер, если вам не нужна пустая белая полоса на своем месте. Для этого самым простым способом (без какой-либо анимации), упростить метод didFailToReceiveAdWithError:, например, так:

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 
{ 
    NSLog(@"Failed to retreive ad"); 

    // Check for Remove Ads IAP 
    self.adBanner.hidden = YES; 
    _bannerIsVisible = NO; 
} 

И скрывать это в вашем viewDidLoad так она скрыта от самого начала до загрузки любого объявления:

- (void)viewDidLoad { 

    //Ads 
    self.adBanner.delegate = self; 
    self.adBanner.hidden = YES; 
} 

Таким образом, ваше объявление будет отображаться только в bannerViewDidLoadAd: после того, как объявление было успешно загружено.

Во-вторых, ваш _bannerIsVisible boolean не нужен. Вместо использования отдельного логического значения, чтобы проверить, является ли баннер видимым, вы можете просто проверить, скрыт ли он, с if (self.adBanner.hidden == YES) или if (self.adBanner.hidden == NO) или if (self.adBanner.hidden) или if (!self.adBanner.hidden). Устранение этого ненужного логического элемента приведет к снижению вероятности ошибки.

Таким образом, просто подвести итог, вот мое предложение о том, как ваши bannerViewDidLoadAd: и didFailToReceiveAdWithError: методы должны выглядеть:

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

    // Check for Remove Ads IAP 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

    if ([prefs boolForKey:@"RemoveAds"] == TRUE) { 
     self.adBanner.hidden = YES; 
    } else if (self.adBanner.hidden) { 
     self.adBanner.hidden = NO; 
    } 
} 

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 
{ 
    NSLog(@"Failed to retreive ad"); 
    self.adBanner.hidden = YES; 
} 
+0

Я сделал так, как вы сказали, и я все еще получаю белый баннер iAd. Я попытался запустить приложение на другом iPhone, и как только я куплю IAP для удаления рекламы, он отлично работает, и у меня нет проблем с рекламным баннером. Тем не менее, я купил тот же IAP на своем оригинальном iPhone с тремя отдельными тестовыми учетными записями. Когда я перехожу на экран покупки, я всегда прошу ввести пароль для каждой тестовой учетной записи, с которой я купил IAP. Возможно, у меня несколько транзакций застряли в очереди платежей? Если это проблема, как я могу ее исправить? Большое вам спасибо за вашу помощь! – Ansuke

+0

Итак, если вы не купите IAP, вы увидите белый баннер iAd? Что делать, если вы добавляете 'self.adBanner.hidden = YES;' в 'viewDidLoad'? –

+0

Я купил IAP, несколько раз на трех разных тестовых счетах. Когда я это сделал в первый раз, когда он работал нормально, когда я приобрел его во второй раз на другой тестовой учетной записи, появились белые баннеры. Включение 'self.adBanner.hidden = YES;' в 'viewDidLoad' скрывает его, но не скрывает его для всех (включая те, которые не покупают IAP)? – Ansuke