在应用程序购买 - 购买错误的产品

问题描述:

我是新手在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]; 
} 
} 

希望你能帮助我。

最好的问候, 塔哈

+0

你能更具体地了解你遇到的问题吗? – Stonz2 2014-09-12 13:31:06

因为validProduct设置为不管它是最后一组时productsRequest:didReceiveResponse:叫对,那是不太可能是你想要的。

一般来说,你的方法是错误的。您应该为所有产品标识符制作一个SKProductsRequest,然后存储您找回的所有产品。您可以循环播放产品以更新您的按钮标题(首先对产品进行排序)。当按下按钮时,您应该找到具有适当标识符的产品并从中创建您的SKPayment

因此,摆脱SKProduct *validProduct;而不是将产品存储在数组或字典中。