应用内购买未获得任何产品

Posted

技术标签:

【中文标题】应用内购买未获得任何产品【英文标题】:In app purchase not getting any product 【发布时间】:2014-03-16 06:52:44 【问题描述】:

我一直在努力让应用内购买发挥作用。目前我在应用商店中有一个应用程序(1.1 版)。我想在我想集成到应用购买的那个版本中发布另一个版本(V 1.2)。我为此创建了一个产品。但是当我尝试加载所有产品时,它显示没有产品。

V1.2 是准备上传二进制文件的形式。我已经关联了应用购买。我只想在应用购买中进行测试。我已经从我的设备(MAC + iPhone)中删除了所有配置文件。目前我只安装了一个配置文件。

这是我的代码:

-(void)fetchAvailableProducts
    NSSet *productIdentifiers = [NSSet
                                 setWithObjects:bundle_identifier,nil];
    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];


- (void)requestDidFinish:(SKRequest *)request 
    NSLog(@"purchase request finished");


- (void)request:(SKRequest *)request didFailWithError:(NSError *)error 
    NSLog(@"%@", [error description]);


- (BOOL)canMakePurchases

    return [SKPaymentQueue canMakePayments];

- (void)purchaseMyProduct:(SKProduct*)product
    if ([self canMakePurchases]) 
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    
    else
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
                                  @"Purchases are disabled in your device" message:nil delegate:
                                  self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alertView show];
    


#pragma mark StoreKit Delegate

-(void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions 
    for (SKPaymentTransaction *transaction in transactions) 
        switch (transaction.transactionState) 
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"Purchasing");
                break;
            case SKPaymentTransactionStatePurchased:
                if ([transaction.payment.productIdentifier
                     isEqualToString:bundle_identifier]) 
                    NSLog(@"Purchased ");
                    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
                                              @"Purchase is completed succesfully" message:nil delegate:
                                              self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
                    [alertView show];
                
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"Restored ");
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                NSLog(@"Purchase failed ");
                break;
            default:
                break;
        
    


-(void)productsRequest:(SKProductsRequest *)request
    didReceiveResponse:(SKProductsResponse *)response

    SKProduct *validProduct = nil;
    int count = [response.products count];
    NSLog(@"%@",response.products);
    if (count>0) 
        validProducts = response.products;
        validProduct = [response.products objectAtIndex:0];
        if ([validProduct.productIdentifier
             isEqualToString:bundle_identifier]) 
        
     else 
        UIAlertView *tmp = [[UIAlertView alloc]
                            initWithTitle:@"Not Available"
                            message:@"No products to purchase"
                            delegate:self
                            cancelButtonTitle:nil
                            otherButtonTitles:@"Ok", nil];
        [tmp show];
    

我想知道启用应用内购买的正确程序是什么以及我做错了什么?应该怎么做?

【问题讨论】:

【参考方案1】:

我解决了这个问题,所以我将其添加为答案。

我混淆了捆绑标识符和产品标识符。我的代码是正确的,我提供了捆绑标识符而不是产品标识符,这就是我没有得到任何产品的原因。

NSSet *productIdentifiers = [NSSet
                                 setWithObjects:product_identifier,nil];
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];

在上面的代码中使用 product_identifier(s)。因为我只创建了一个产品,所以我使用单个元素来构建集合。

【讨论】:

【参考方案2】:

您的代码看起来正确。您是否确认您的应用内商品 ID 与 bundle_id 变量中的值完全匹配?

【讨论】:

你能解释一下吗? bundle_identifier 是我的应用程序的捆绑包 ID。 当您在 iTunesconnect 中添加应用内购买时,您指定一个产品 ID。这是在调用 initWithProductIdentifiers 时必须发送的产品 ID:根据您自己的回答【参考方案3】:
 + (RageIAPHelper *)sharedInstance 
static dispatch_once_t once;
static RageIAPHelper * sharedInstance;
dispatch_once(&once, ^
    NSSet * productIdentifiers = [NSSet       setWithObject:kMDPulseSubscriptionProductIdentifier];
    sharedInstance = [[self alloc] initWithProductIdentifiers:productIdentifiers];
);
return sharedInstance;
   

你得到产品列表, 但你必须在真机上测试它。

【讨论】:

以上是关于应用内购买未获得任何产品的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用内购买未显示在 App Store 构建中

Apple 订阅或应用内购买在商店版本中不起作用 - 应用内产品详细信息未显示或获取

产品不适用于 Phonegap 中的应用内购买

如何在应用内购买中恢复购买?

如何在应用内购买中恢复购买?

无法向苹果提交应用内购买产品