0

“还没解决……”

我的 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 类上是否存在问题。如果有人需要更多代码,请索取。谢谢!

4

1 回答 1

0

确保您只添加观察者。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productPurchased:) name:IAPHelperProductPurchasedNotification object:nil];

多次添加侦听器将导致多次调用您的回调方法。如果您正在重用您的课程 - 请记住在您释放它之后 removeObserver - 它不会自行完成。

于 2013-10-04T16:20:11.227 回答