2016-10-09 2 views
0

У меня есть несколько продуктов в IAP (в этом примере 2 из них), и я использую UITableView, который пользователь нажимает и выбирает, какой продукт они хотели бы купить. Однако я не могу определить у делегата updatedTransactions, какую транзакцию пользователь приобрел. Ниже приведены мои коды:Не удалось идентифицировать приобретенный продукт у делегатов updatedTransactions

NSArray *arrayProducts; 

-(void) getProductInfo:(BLevelViewController *) viewController 
{ 
if ([SKPaymentQueue canMakePayments]) 
{ 
    _linkStatus.text = @"Able to purchase";   
    SKProductsRequest *requestProducts = [[SKProductsRequest alloc] 
    initWithProductIdentifiers:[NSSet setWithObjects:@"example.1coin", @"example.2coin", nil]]; 
    requestProducts.delegate = self; 
    [requestProducts start]; 

}else{ 
     _linkStatus.text = @"Please enable In App Purchase in Setting"; 
}  
} 

-(void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
    NSArray *products = response.products; 

    if (products.count != 0) 
    { 
     _linkStatus.text = @"Product loaded"; 
     arrayProducts = products; 

    } else { 
     _linkStatus.text = @"Product no found"; 
     arrayProducts = @[@"0",@"0"]; 
    } 

    products = response.invalidProductIdentifiers; 

    for (SKProduct *product in products) 
    { 
     NSLog(@"Product not found: %@", product); 
    } 

} 


-(void) tableView:(UITableView *)tableView_ didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

if (indexPath.row == 0) 
{ 
    SKPayment *payment = [SKPayment paymentWithProduct:[arrayProducts objectAtIndex:0]]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 

} else if (indexPath.row == 1) 
{ 
    SKPayment *payment = [SKPayment paymentWithProduct:[arrayProducts objectAtIndex:1]]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 

} 

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    for (SKPaymentTransaction *transaction in transactions) 
    { 
     switch (transaction.transactionState) { 
      case SKPaymentTransactionStatePurchased: 
       if ([transaction.description isEqualToString:[arrayProducts objectAtIndex:0]]){ 
        [self unlockFeature1coin]; 
       } 
       if ([transaction.description isEqualToString:[arrayProducts objectAtIndex:1]]){ 
        [self unlockFeature10coins]; 
       } 
       [[SKPaymentQueue defaultQueue] 
       finishTransaction:transaction]; 
       break; 

      case SKPaymentTransactionStateFailed: 
       [[SKPaymentQueue defaultQueue] 
       finishTransaction:transaction]; 
       break; 

      case SKPaymentTransactionStatePurchasing: 

       break; 


      default: 
       break; 
     } 
    } 
} 

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    BCoinsViewCell * cell = [tableView dequeueReusableCellWithIdentifier:coinsCellIdentifier]; 

    if (indexPath.row == 0) 
    { 
     cell.cellLabel.text = @"Buy 10 coins"; 
     [cell.cellButton setTitle:@"Buy" forState:UIControlStateNormal]; 
    } 
    else if (indexPath.row == 1) 
    { 
     cell.cellLabel.text = @"Buy 1 coin"; 
     [cell.cellButton setTitle:@"Buy" forState:UIControlStateNormal]; 
    } 

    return cell; 
} 

Проблема заключается в следующих строках, что я должен использовать в качестве идентификатора, так что я могу назвать различные функции, основанные на покупках пользователей?

 if ([transaction.description isEqualToString:[arrayProducts objectAtIndex:0]]){ 
      [self unlockFeature1coins]; 
     } 
     if ([transaction.description isEqualToString:[arrayProducts objectAtIndex:1]]){ 
      [self unlockFeature10coins]; 
     } 
+0

Где вы храните информацию о приобретенных товарах? И вы можете показать реализацию метода cellForRowAtIndexPath: '? Я думаю, вы приближаетесь к этому вопросу ненадлежащим образом. – Adeel

+0

Я обновил свои коды с помощью cellForRowAtIndexPath. Насколько я знаю, Apple не предоставила общий метод для метода getProductInfo, поэтому нам нужно жестко запрограммировать запрос, поэтому в cellForRowAtIndexPath у меня также есть жестко закодированные 2 продукта (в качестве примера). Как я мог бы неправильно подходить к этому вопросу, какие-либо рекомендации, которые я должен решить? – Calvin

+0

Я хотел бы узнать еще пару вещей, прежде чем предлагаю вам что-нибудь. Ваши покупки не потребляются? Если да, то вы реализуете способ восстановления покупок, поскольку это является неотъемлемой частью покупок приложений. На самом деле Apple откажется от вашего приложения, если вы не реализуете способ восстановления покупок. – Adeel

ответ

1

Вы можете получить идентификатор продукта из SKPaymentTransaction объекта, как этот transaction.payment.productIdentifier. Просто замените ваши условия if этим кодом:

if ([transaction.payment.productIdentifier isEqualToString:@"example.1coin"]){ 

     [self unlockFeature1coins]; 
    } 
    if ([transaction.payment.productIdentifier isEqualToString:@"example.10coins"]){ 

     [self unlockFeature10coins]; 
    } 
+0

Adele Miraj, не могли бы вы обновить свой ответ с помощью следующего кода, если другие хотят использовать их напрямую. Существует проблема обращения к продуктам массива, поскольку они не сохраняются в качестве идентификатора. Таким образом, коды показаны ниже. В очередной раз благодарим за помощь! if ([transaction.payment.productIdentifier isEqualToString: @ "example.1coin"]) { [self unlockFeature1coins]; } if ([transaction.payment.productIdentifier isEqualToString: @ "example.10coins"]) { [self unlockFeature10coins]; } – Calvin

+0

@Calvin Я обновил код. – Adeel

Смежные вопросы