在应用程序内购买后,viewWillAppear多次加载已购买的项目

时间:2015-08-13 21:31:55

标签: ios objective-c in-app-purchase

我的应用内购买遇到了问题。在离开MasterViewController(列出和购买IAP项目的地方)后,我来到ViewController,它在viewDidLoad中检查所购买的商品,但我还有一个viewWillAppear检查购买的商品并在加载ViewController时解锁这些购买的商品

问题是,每次重新加载或刷新ViewController,然后再返回时,viewWillAppear会检查购买的商品并再次解锁商品,在我的情况下,购买的商品来自javascript文件,这恰好多次加载JS,一遍又一遍地使用相同的IAP项目混乱应用程序。

例如,如果您购买了“书签”,则每次重新加载ViewController时,您都会反复获得另一个“书签”工具。

如何才能获得IAP只加载一次?

我的viewWillAppear看起来像这样:

- (void)viewWillAppear:(BOOL)animated {
// Check To See If The Uniques IAP Has Been Paid For
if (![[[NSUserDefaults standardUserDefaults] objectForKey:SHOW_UNIQUES_KEY] isEqualToString: @"YES"]){ // NEW CODE
    // Code to show bookmarks

} else {
    NSString *jsString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"Uniques" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil];
    [viewWeb stringByEvaluatingJavaScriptFromString:jsString];    }
NSLog(@"Shows uniques?: %@", [[NSUserDefaults standardUserDefaults] objectForKey:SHOW_UNIQUES_KEY]);

// Check To See If The PL Numbers IAP Has Been Paid For
if (![[[NSUserDefaults standardUserDefaults] objectForKey:SHOW_PORTAL_LEVEL_KEY] isEqualToString: @"YES"]){ // NEW CODE
    // Code to show bookmarks

} else {
    NSString *jsString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"PortalLevel" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil];
    [viewWeb stringByEvaluatingJavaScriptFromString:jsString];    }
NSLog(@"Shows portal levels?: %@", [[NSUserDefaults standardUserDefaults] objectForKey:SHOW_PORTAL_LEVEL_KEY]);

// Check To See If The PN IAP Has Been Paid For
if (![[[NSUserDefaults standardUserDefaults] objectForKey:SHOW_PORTALS_KEY] isEqualToString: @"YES"]){ // NEW CODE
    // Code to show bookmarks

} else {
    NSString *jsString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"PortalNames" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil];
    [viewWeb stringByEvaluatingJavaScriptFromString:jsString];    }
NSLog(@"Shows portal names?: %@", [[NSUserDefaults standardUserDefaults] objectForKey:SHOW_PORTALS_KEY]);

// Check To See If The Bookmarks IAP Has Been Paid For
if (![[[NSUserDefaults standardUserDefaults] objectForKey:SHOW_BOOKMARKS_KEY] isEqualToString: @"YES"]){ // NEW CODE
    // Code to show bookmarks

} else {
    NSString *jsString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"bookmarks" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil];
    [viewWeb stringByEvaluatingJavaScriptFromString:jsString];    }
NSLog(@"Shows bookmarks?: %@", [[NSUserDefaults standardUserDefaults] objectForKey:SHOW_BOOKMARKS_KEY]);

// Check To See If The Poke A Bowl Ad Has Been Paid For
if (![[[NSUserDefaults standardUserDefaults] objectForKey:SHOW_ADS_KEY] isEqualToString: @"No"]){ // NEW CODE
    // Code to show ads
    _PokeABowlAd.hidden = NO;

} else {
    _PokeABowlAd.hidden = YES;
}
NSLog(@"Shows ads?: %@", [[NSUserDefaults standardUserDefaults] objectForKey:SHOW_ADS_KEY]);
}

1 个答案:

答案 0 :(得分:1)

我认为你应该做的是让每个人最多被召唤一次。您应该使用NSUserDefaults来完成此任务。做这样的事情:

将它放在你的AppDelegate.m中:

//One new key for each IAP - put at the top of the AppDelegate.m and VC.m
#define IAP_FIRST_USED @"IAP 1 Used"
...
#define IAP_LAST_USED @"IAP X Used"

// In applicationDidFinishLaunchingWithOptions, should be the first method listed

[[NSUserDefaults standardUserDefaults] setObject: @"No" forKey: IAP_FIRST_USED];
...
[[NSUserDefaults standardUserDefaults] setObject: @"No" forKey: IAP_LAST_USED];
[[NSUserDefaults standardUserDefaults] synchronize];

然后在VC.m修改viewWillAppear中就像这样(这是第一个IAP应该是什么样子的例子):

// Check To See If The PL Numbers IAP Has Been Paid For
if (![[[NSUserDefaults standardUserDefaults] objectForKey:SHOW_PORTAL_LEVEL_KEY] isEqualToString: @"YES"]){ // NEW CODE


   // NEW CODE BEGINS HERE

   if ([[[NSUserDefaults standardUserDefaults] objectForKey:IAP_FIRST_USED] isEqualToString: @"No"]){
   [[NSUserDefaults standardUserDefaults] setObject: @"Yes" forKey: IAP_FIRST_USED];
   [[NSUserDefaults standardUserDefaults] synchronize];  
   // Code to show bookmarks



   // End of code to show bookmarks
   // NEW CODE ENDS HERE

   }
} else {
    NSString *jsString = [NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"PortalLevel" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil];
    [viewWeb stringByEvaluatingJavaScriptFromString:jsString];    
}

还要记住在VC.m

中包含define语句