Iphone IAP耗材在购买一次时触发两次

Iphone IAP耗材在购买一次时触发两次,iphone,ios,ipad,cocos2d-iphone,in-app-purchase,Iphone,Ios,Ipad,Cocos2d Iphone,In App Purchase,“尚未解决…” 我的iap耗材包有问题。问题是,当我买一个时,它会复制购买,在没有请求的情况下制作另一个。“警报”视图也显示为双视图 奇怪的是:这种错误只发生在我为我的应用程序制作ipa时,而不是在调试它时!我不明白为什么 以下是在我的主菜单中实现的productPurchase方法,我将IAP按钮放在主菜单中: - (void)productPurchased:(NSNotification *)notification { NSUserDefaults * defaults = [

“尚未解决…”

我的iap耗材包有问题。问题是,当我买一个时,它会复制购买,在没有请求的情况下制作另一个。“警报”视图也显示为双视图

奇怪的是:这种错误只发生在我为我的应用程序制作ipa时,而不是在调试它时!我不明白为什么

以下是在我的主菜单中实现的
productPurchase
方法,我将IAP按钮放在主菜单中:

- (void)productPurchased:(NSNotification *)notification {

    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

    NSString * productIdentifier = notification.object;

    NSString* plistPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"XXXXX.plist"];

    if(plistPath != nil){
        int playerSilverCoins = [defaults integerForKey:@"userSilverCoins"];
        int playerGoldCoins = [defaults integerForKey:@"userGoldenCoins"];

        NSArray *coinsItems = [NSArray arrayWithContentsOfFile:plistPath];
        for (NSDictionary *coinItem in coinsItems) {
            if ([[coinItem objectForKey:@"productId"] isEqualToString:productIdentifier]) {
                playerSilverCoins = playerSilverCoins + [[coinItem objectForKey:@"silverCoins"] integerValue];
                playerGoldCoins = playerGoldCoins + [[coinItem objectForKey:@"goldenCoins"] integerValue];

                [defaults setInteger:playerSilverCoins forKey:@"userSilverCoins"];
                [defaults setInteger:playerGoldCoins forKey:@"userGoldenCoins"];
                [defaults synchronize];

                NSLog(@"product bought: %@" , productIdentifier);

                NSString *message = nil;
                if([[coinItem objectForKey:@"goldenCoins"] integerValue] == 0)
                    message = [NSString stringWithFormat:@"You have bought %d silver coins", [[coinItem objectForKey:@"silverCoins"] integerValue]];
                else
                message = [NSString stringWithFormat:@"You have bought %d golden coins and %d silver coins", [[coinItem objectForKey:@"goldenCoins"] integerValue],[[coinItem objectForKey:@"silverCoins"] integerValue]];

                UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"XXXXX" message:message delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
                [alert show];
                [alert release];

                NSNumber* achievementContributor = [defaults objectForKey:@"AchievementContributor"];
                if ([achievementContributor intValue] != 1 ) {

                    [[GameCenterAchievement sharedGameCenterAchievement] checkAchievements:_kContributor];
                    [defaults setObject:[NSNumber numberWithInt:1] forKey:@"AchievementContributor"];
                    [[GKAchievementHandler defaultHandler] notifyAchievementTitle:@"Contributor"
                                                                       andMessage:@"Buy a coin pack"];
                }


                break;
            }
        }
    }
}

我不知道那里是否有问题,也不知道我的IAP类在那里实现了事务、恢复等。如果有人需要更多的代码,就要求它。谢谢

确保只添加观察者

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productPurchased:) name:IAPHelperProductPurchasedNotification object:nil];
添加侦听器乘法次数将导致多次调用回调方法。
如果您正在重用您的类-请记住在解除锁定后删除Observer-它不会自己执行此操作。

可能您正在为该通知添加两个侦听器?Than函数将被调用的次数与您有侦听器的次数相同-请确保在适当的时候清理该函数。在添加侦听器时,可能会在您发出此通知的位置发布一段代码-这会有所帮助。你粘贴的那个看起来还可以。@GrzegorzKrukowski你能告诉我在哪里添加了两次通知吗?@GrzegorzKrukowski在我的Init方法中我有一个
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(productPurchased:)name:iapherperproductpurchasednotification object:nil]这将是第二次调用吗?取决于init是否发生两次:)可能将NSLog放在这之前。