在应用程序购买 - 购买错误的产品
问题描述:
我是新手在ios编程,这是我第一次使用应用程序购买。我所有的IAP都是可以使用的,而且我的代码没有错误。但是,有些事情是错误的。因为我用沙箱环境测试了我的IAP,当我试图购买我的第一层物品时,警报视图向我展示了第5层物品。在应用程序购买 - 购买错误的产品
您可以检查所有代码约IAP:
@interface ViewController(){
NSString *currencyString;
SKProduct *validProduct;
}
- (void)validateReceiptForTransaction:(SKPaymentTransaction *)transaction {
VerificationController * verifier = [VerificationController sharedInstance];
[verifier verifyPurchase:transaction completionHandler:^(BOOL success) {
if (success) {
UIAlertView *tmp = [[UIAlertView alloc]
initWithTitle:@"Complete"
message:@"Transaction successful!"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"Ok", nil];
[tmp show];
[self provideContentForProductIdentifier:transaction.payment.productIdentifier];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Purchase Unsuccessful"
message:@"Your purchase failed. Please try again."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
}];
}
- (void)provideContentForProductIdentifier:(NSString *)productIdentifier {
if ([productIdentifier isEqualToString:@"100LJ"]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int j = [defaults integerForKey:@"j"];
j += 100;
[defaults setInteger:j forKey:@"j"];
[defaults synchronize];
}
else if ([productIdentifier isEqualToString:@"500LJ"]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int j = [defaults integerForKey:@"j"];
j += 500;
[defaults setInteger:j forKey:@"j"];
[defaults synchronize];
}
else if ([productIdentifier isEqualToString:@"1000LJ"]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int j = [defaults integerForKey:@"j"];
j += 1000;
[defaults setInteger:j forKey:@"j"];
[defaults synchronize];
}
else if ([productIdentifier isEqualToString:@"5000LJ"]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int j = [defaults integerForKey:@"j"];
j += 5000;
[defaults setInteger:j forKey:@"j"];
[defaults synchronize];
}
else if ([productIdentifier isEqualToString:@"10000LJ"]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int j = [defaults integerForKey:@"j"];
j += 10000;
[defaults setInteger:j forKey:@"j"];
[defaults synchronize];
}
else if ([productIdentifier isEqualToString:@"50000LJ"]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int j = [defaults integerForKey:@"j"];
j += 50000;
[defaults setInteger:j forKey:@"j"];
[defaults synchronize];
}
else if ([productIdentifier isEqualToString:@"100000LJ"]) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int j = [defaults integerForKey:@"j"];
j += 100000;
[defaults setInteger:j forKey:@"j"];
[defaults synchronize];
}
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:{
}
break;
case SKPaymentTransactionStatePurchased:{
[_activityView stopAnimating];
[self validateReceiptForTransaction:transaction];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
break;
case SKPaymentTransactionStateRestored:{
[_activityView stopAnimating];
[self validateReceiptForTransaction:transaction];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];}
break;
case SKPaymentTransactionStateFailed:{
[_activityView stopAnimating];
if (transaction.error.code != SKErrorPaymentCancelled) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Purchase Unsuccessful"
message:@"Your purchase failed. Please try again."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];}
break;
default:{}
break;
}
}
}
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
validProduct = nil;
int count = [response.products count];
if (count>0) {
validProduct = [response.products objectAtIndex:0];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLocale:validProduct.priceLocale];
currencyString = [formatter stringFromNumber:validProduct.price];
if([validProduct.productIdentifier isEqual: @"100LJ"]){
[_storebuy1 setTitle:currencyString forState:UIControlStateNormal];
}
else if([validProduct.productIdentifier isEqual: @"500LJ"]){
[_storebuy2 setTitle:currencyString forState:UIControlStateNormal];
}
else if([validProduct.productIdentifier isEqual: @"1000LJ"]){
[_storebuy3 setTitle:currencyString forState:UIControlStateNormal];
}
else if([validProduct.productIdentifier isEqual: @"5000LJ"]){
[_storebuy4 setTitle:currencyString forState:UIControlStateNormal];
}
else if([validProduct.productIdentifier isEqual: @"10000LJ"]){
[_storebuy5 setTitle:currencyString forState:UIControlStateNormal];
}
else if([validProduct.productIdentifier isEqual: @"50000LJ"]){
[_storebuy6 setTitle:currencyString forState:UIControlStateNormal];
}
else if([validProduct.productIdentifier isEqual: @"100000LJ"]){
[_storebuy7 setTitle:currencyString forState:UIControlStateNormal];
}
}
}
我有7个按键购买IAP项。 这是我的按钮购买1级IAP项目:
- (IBAction)storebuy1:(UIButton *)sender{
_activityView=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[_activityView.layer setBackgroundColor:[[UIColor colorWithWhite: 0.0 alpha:0.30] CGColor]];
_activityView.center=self.view.center;
_activityView.hidesWhenStopped = YES;
[_activityView startAnimating];
[self.view addSubview:_activityView];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"100LJ"]];
request.delegate = self;
[request start];
if ([SKPaymentQueue canMakePayments]) {
SKPayment *payment = [SKPayment paymentWithProduct:validProduct];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
else {
UIAlertView *tmp = [[UIAlertView alloc]
initWithTitle:@"Prohibited"
message:@"Parental Control is enabled!"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"Ok", nil];
[tmp show];
}
}
希望你能帮助我。
最好的问候, 塔哈
答
因为validProduct
设置为不管它是最后一组时productsRequest:didReceiveResponse:
叫对,那是不太可能是你想要的。
一般来说,你的方法是错误的。您应该为所有产品标识符制作一个SKProductsRequest
,然后存储您找回的所有产品。您可以循环播放产品以更新您的按钮标题(首先对产品进行排序)。当按下按钮时,您应该找到具有适当标识符的产品并从中创建您的SKPayment
。
因此,摆脱SKProduct *validProduct;
而不是将产品存储在数组或字典中。
你能更具体地了解你遇到的问题吗? – Stonz2 2014-09-12 13:31:06