应用内购买,展示产品但没有任何反应

时间:2013-04-29 15:38:03

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

我正在尝试在一个应用程序中实现IAP,但我仍然遇到困难。我遵循了各种教程,但所有教程都已过时且充满了错误。我找到的唯一可行的是this one

但是我遇到了问题,3个产品出现在我的tableview上,但是当我点击其中一个产品时没有任何反应......细胞变成蓝色,这就是全部...我错过了什么?

或者那个教程是不完整的?

如何进行购买尝试?

这是我的代码:

   -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
     {
      [productDetailsList addObjectsFromArray: response.products];
      [productDisplayTableView reloadData];
     }


     -(void)request:(SKRequest *)request didFailWithError:(NSError *)error
      {
         NSLog(@"Failed to connect with error: %@", [error localizedDescription]);
       }    


       - (NSInteger)tableView:(UITableView *)tableView
   numberOfRowsInSection:(NSInteger)section
       {
        return [self.productDetailsList count];
       }
       - (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
       {
           static NSString *GenericTableIdentifier = @"GenericTableIdentifier";
           UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: GenericTableIdentifier];
           if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: GenericTableIdentifier];
           }
           NSUInteger row = [indexPath row];
           SKProduct *thisProduct = [productDetailsList objectAtIndex:row];
           [cell.textLabel setText:[NSString stringWithFormat:@"%@ - %@",            thisProduct.localizedTitle, thisProduct.price]];
           return cell;
       }



        - (void)viewDidLoad
       {
           productDetailsList    = [[NSMutableArray alloc] init];
           productIdentifierList = [[NSMutableArray alloc] init];
           for (short item_count=1; item_count <= 5; item_count++) {
               [productIdentifierList addObject:[NSString              stringWithFormat:@"com.mycompany.myapp.%d", item_count]];
           }
           SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifierList]];
           request.delegate = self;
           [request start];

           [super viewDidLoad];
           // Do any additional setup after loading the view from its nib.
       }

2 个答案:

答案 0 :(得分:2)

你需要有以下几点:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
if ([SKPaymentQueue canMakePayments])
{
    SKProduct *selectedProduct = [self.productDetailsList objectAtIndex:indexPath.row];
    SKPayment *payment = [SKPayment paymentWithProduct:selectedProduct];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}
}

Apple为应用程序购买提供了一个不错的step by step guide

答案 1 :(得分:1)

运行IAP的主要方法涉及几种不同的方法,但在实施IAP时需要遵循几个不同的步骤。

这些要求中的第一个是协议。请在头文件中包含以下每个协议。

  • SKProductsRequestDelegate
  • SKPaymentTransactionObserver
  • SKRequestDelegate

您需要请求方法:

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    if(response.products.count > 0)
    {
        SKProduct* product;

        for(int i = 0; i<response.products.count; i++)
        {
            product = [response.products objectAtIndex:i];

            if([product.productIdentifier isEqualToString:@"product identifier"])
            {
                self.currentProduct = product;
                [self beginPaymentWithProduct:product];
            }
        }
    }
}

我使用if语句来跟踪正在购买的产品。如果您有多个产品,则需要在每个产品标识符的for循环中使用if语句。稍后使用此功能可在完成购买时解锁任何内容。

您还需要beginPayment方法:

- (void)beginPaymentWithProduct:(SKProduct*)product
{
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

您还需要付款处理方式。我不会在这里发布所有内容,因为这会占用太多空间,但我会给你原型。

-(void)requestDidFinish:(SKRequest *)request;
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error;
- (void)recordTransaction:(SKPaymentTransaction *)transaction;
- (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful;
- (void)completeTransaction:(SKPaymentTransaction *)transaction;
- (void)restoreTransaction:(SKPaymentTransaction *)transaction;
- (void)failedTransaction:(SKPaymentTransaction *)transaction;

对于表中应该购买的每个按钮,他们需要在didSelectRowAtIndex...方法上执行与此类似的方法:

- (void)buyCoins:(id)sender
{
    if([self canMakePurchases])
    {
        ualRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:[NSArray arrayWithObjects: @"product identifier", nil]]];
        [ualRequest setDelegate:self];
        [ualRequest start];
    }
}

此方法将成功运行产品请求。如果你有所有这些组件,你应该没有问题。

我已在多个应用中成功使用此代码。