Ios 如何在应用程序关闭后保留并删除应用程序购买中的广告

Ios 如何在应用程序关闭后保留并删除应用程序购买中的广告,ios,objective-c,ads,heyzap,Ios,Objective C,Ads,Heyzap,我已通过应用内购买成功从应用中删除广告 问题是如果我关闭应用程序并重新打开。广告又开始了 我有两个主要场景。游戏场景和游戏场景。应用内购买发生在游戏场景中 GameOverScene.m: - (void)OnRemoveADS { [self showPurchaseAlert: IAP_Q_RemoveADS :0]; g_bRemoveADS = [[NSUserDefaults standardUserDefaults] boolForKey: @"REMOVEADS

我已通过应用内购买成功从应用中删除广告

问题是如果我关闭应用程序并重新打开。广告又开始了

我有两个主要场景。游戏场景和游戏场景。应用内购买发生在游戏场景中

GameOverScene.m:

- (void)OnRemoveADS {
    [self showPurchaseAlert: IAP_Q_RemoveADS  :0];

    g_bRemoveADS = [[NSUserDefaults standardUserDefaults] boolForKey: @"REMOVEADS"];

    // For HZInterstitialAd, HZVideoAd, and HZIncentivizedAd, just check the BOOL to see if an ad should be shown
    if (!g_bRemoveADS) {
        [HZInterstitialAd show];

        [self removeBannerAds];
        [self disableAds];
        NSLog(@"Disable ads is called");
    }
}

- (void)removeBannerAds {
    HZBannerAdOptions *options = [[HZBannerAdOptions alloc] init];

    [HZBannerAd placeBannerInView:self.view
                         position:HZBannerPositionBottom
                          options:options
                          success:^(HZBannerAd *banner) {
                              if (g_bRemoveADS) { // case (2)
                                  // Just discard the banner
                                  [banner setHidden: YES];
                                  [banner removeFromSuperview];
                                  banner = nil;

                                  //_currentBannerAd = banner;

                                  NSLog(@"Banner ad removed!GameOverScene");
                              } else {
                                  // Keep a reference to the current banner ad, so we can remove it from screen later if we want to disable ads.
                                  _currentBannerAd = banner;
                              }
                              NSLog(@"Ad Shown! GameOverScene");
                          } 
                          failure:^(NSError *error) {
                              NSLog(@"Error = %@",error);
                          }];
}

- (void)disableAds {
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"REMOVEADS"];
    [_currentBannerAd removeFromSuperview]; // case (3)
}
GameSecene.m:

-(id) init {
    if (self = [super init]) {
        if (!g_bRemoveADS) {
            g_bRemoveADS=FALSE;
            [[NSUserDefaults standardUserDefaults] setBool:g_bRemoveADS forKey:@"REMOVEADS"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        } else {
            g_bRemoveADS=TRUE;
            [[NSUserDefaults standardUserDefaults] setBool:g_bRemoveADS forKey:@"REMOVEADS"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
    }
}
我试图解决这个问题的方法是使用AppDelegate.m中GameOverScene.m中的相同代码,这样当应用程序启动时,它将删除广告

AppDelegate.m:

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

    g_bRemoveADS = [[NSUserDefaults standardUserDefaults] boolForKey: @"REMOVEADS"];

    if (!g_bRemoveADS) {

        [HZInterstitialAd show];

        [self disableAds];
        NSLog(@"Disable ads is called");
    }
}

更改disableAds方法中的值后,您必须同步NSUserDefaults:

[[NSUserDefaults standardUserDefaults]synchronize];

从我的角度来看,你有一个否定到很多

if(!g_bRemoveADS){
应在GameOverScene.m中替换为
if(g_bRemoveADS){

if (g_bRemoveADS) {
    [HZInterstitialAd show];

    [self removeBannerAds];
    [self disableAds];
    NSLog(@"Disable ads is called");
}

g_bRemoveADS
在设置相应的用户默认值时计算为
TRUE
。设置后,您调用removeBannerAds等,这似乎是停用操作。

初始化中的if-else是不必要的。看起来您有两种不同类型的广告。您是否在iap完成后更新了NSUserDefaultd?是的,你说得对。我把它注释掉了。我想当应用程序再次启动时,应用程序代理中需要发生一些事情?我做了一个
[[NSUserDefaults standardUserDefaults]同步]
就像下面的答案一样,但这并没有阻止广告的出现。即使是在应用程序内购买之后。当我对该行发表评论并进行测试时,广告停止了。然而,问题仍然是,当我再次启动应用程序时,它不记得广告已被删除。这两个链接可能会有所帮助:,你需要检查
是否(!g_bRemoveADS)
无论你在哪里创建广告,只要不创建它们。你在哪里创建广告?你的广告代理方法在哪里?你在他们的代理方法中重新创建广告吗?我这样做了,但广告在那之后不会停止。当我删除
[[NSUserDefaults standardUserDefaults]同步]
然后广告会再次停止。然而,最初的问题仍然存在。当我重新启动应用程序时,它不记得在应用程序中购买。不幸的是,我已经尝试过了。当我确定if声明为阳性时,广告根本不起作用。不过,我在你的回答中看到了你的推理。为什么它与
if(!g_bRemoveADS)一起工作
?我不知道。你的代码中有一点让人困惑,那就是你禁用了广告,但使用了
[hzinterstialad show]
method-为什么会这样?是的,我知道这很让人困惑。我从Heyzap工程师那里得到了代码片段,这就是我使用它的原因。你是对的,它毫无意义。我应该问问他。问题是,如果我删除了这个方法,广告就不会停止。当你问我时,你的代码就是“清理”你的场景显示了一个插页广告。意思是:它删除了横幅广告,所以它们不会干扰你的插页广告。但我认为这完全超出了你想要的用例。当用户默认设置中的相应标志被设置时,你想禁用所有广告(插页+横幅),对吗?