2014-09-12 178 views
0

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

回答

0

因爲validProduct設置爲不管它是最後一組時productsRequest:didReceiveResponse:叫對,那是不太可能是你想要的。

一般來說,你的方法是錯誤的。您應該爲所有產品標識符製作一個SKProductsRequest,然後存儲您找回的所有產品。您可以循環播放產品以更新您的按鈕標題(首先對產品進行排序)。當按下按鈕時,您應該找到具有適當標識符的產品並從中創建您的SKPayment

因此,擺脫SKProduct *validProduct;而不是將產品存儲在數組或字典中。