(iOS) 应用内购买失败?

Posted

技术标签:

【中文标题】(iOS) 应用内购买失败?【英文标题】:(iOS) In-app purchase fails? 【发布时间】:2014-12-11 10:39:00 【问题描述】:

我正在尝试执行应用内购买,但失败了,我不知道为什么。奇怪的是,它可以很好地获取 SKProduct 并且可以打印所有详细信息,但是当我真正尝试购买它时,它就失败了。

现在,因为我知道产品被提取并记录到控制台,所以问题不在于那个。问题出在我尝试实际购买获取的产品时,所以这里是代码:

- (void)viewDidLoad 
[super viewDidLoad];
// Do any additional setup after loading the view.

// Setup notifaction to handle the successfull payment
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(succeedPayment)
                                             name:@"kInAppPurchaseManagerTransactionSucceededNotification"
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(failedPayment)
                                             name:@"kInAppPurchaseManagerTransactionFailedNotification"
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(cancelPayment)
                                             name:@"userCancel"
                                           object:nil];


- (IBAction)purchase10Crystals:(id)sender 
    InAppPurchaseManager *p = [InAppPurchaseManager IAPManager];
    if ([p canMakePurchases]) 
        [p purchaseGoldCoins:10];
        NSLog(@"Buying 10 crystals");
    

所以我让视图控制器收听有关付款的通知,并实际进行付款。以下是 InAppPurchaseManager 内部发生的情况:

SKPayment *payment = [SKPayment paymentWithProduct:gold10];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

现在购买已发送到商店。经理等待响应,这些是选项:

    //
// removes the transaction from the queue and posts a notification with the transaction result
//
- (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful

    // remove the transaction from the payment queue.
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

    NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:transaction, @"transaction" , nil];
    if (wasSuccessful)
    
        // send out a notification that we’ve finished the transaction
        [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:userInfo];
        NSLog(@"Success transaction!");
    
    else
    
        // send out a notification for the failed transaction
        [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionFailedNotification object:self userInfo:userInfo];
    


//
// called when the transaction was successful
//
- (void)completeTransaction:(SKPaymentTransaction *)transaction

    [self recordTransaction:transaction];
    [self provideContent:transaction.payment.productIdentifier];
    [self finishTransaction:transaction wasSuccessful:YES];



//
// called when a transaction has been restored and and successfully completed
//
- (void)restoreTransaction:(SKPaymentTransaction *)transaction

    [self recordTransaction:transaction.originalTransaction];
    [self provideContent:transaction.originalTransaction.payment.productIdentifier];
    [self finishTransaction:transaction wasSuccessful:YES];


//
// called when a transaction has failed
//
- (void)failedTransaction:(SKPaymentTransaction *)transaction

    if (transaction.error.code != SKErrorPaymentCancelled)
    
        // error!
        NSLog(@"Failed: %li", (long)transaction.error);
        [self finishTransaction:transaction wasSuccessful:NO];
    
    else
    
        // this is fine, the user just cancelled, so don’t notify
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"userCancel" object:self userInfo:nil];
    

被调用的方法是failedTransaction。我不知道为什么。沙盒帐户正在运行,因为它可以在游戏中心进行测试。该产品被提取是因为它全部打印出来。但是当我尝试购买时,它只是失败了,并且没有告诉我为什么。被注销的代码只是很多数字。

希望任何人都可以帮助我。 最好的祝福 /JBJ

编辑 这就是我获取 SKProducts 的方式。

    首先我调用它来加载它

    - (void)loadStore
    

    // 如果上次应用程序打开时被中断,则重新开始购买 [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    // get the product description (defined in early sections)
    [self request10GoldData];
    

    从商店获取产品

    -(void) request10GoldData
    

    NSSet *productIdentifiers = [NSSet setWithObject:@"10crystals" ]; productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; productsRequest.delegate = self; [产品请求开始];

    打印出来验证它是否被提取

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

    // 创建一个新的 SKProduct,识别它是哪个产品,并添加到适当的实例变量中

    NSArray *products = response.products;
    SKProduct *theProduct = [products count] == 1 ? [products objectAtIndex:0] : nil;
    if (theProduct)
    
        // Identify the product and assign to instance variable SKProducts
        if ([theProduct.productIdentifier isEqualToString:@"10crystals"]) 
            gold10 = theProduct;
        
    
        // Debugging
        NSLog(@"Product title: %@" , theProduct.localizedTitle);
        NSLog(@"Product description: %@" , theProduct.localizedDescription);
        NSLog(@"Product price: %@" , theProduct.price);
        NSLog(@"Product id: %@" , theProduct.productIdentifier);
    
    
    for (NSString *invalidProductId in response.invalidProductIdentifiers)
    
        NSLog(@"Invalid product id: %@" , invalidProductId);
    
    
    
    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];
    

这行得通,在上面的 NSLog 语句中,它准确地打印出我在 iTunes 连接中创建的内容。

【问题讨论】:

您是否已将产品 ID 添加到您在 iTunes Connect 网站上的应用程序中? 是的,我有,它可以毫无问题地获取数据。它只是无法完成交易。 请告诉我,您是如何将它们添加到您的应用程序中的。因为有两个步骤:1. 定义产品和 2. 添加到您的应用程序。我假设您已经完成了这两个基本步骤,对吧? 我编辑了帖子以展示我如何获取产品。它可以使用 NSLog 打印出产品信息,所以我知道它获取了正确的信息。这就是让我难过的地方。因为它似乎在工作,并且可以识别要获取的产品,但无法完成购买。 我把范围缩小到它说“无法连接到 iTunes Store”?? 【参考方案1】:

好吧,真可惜。我发现它就像在测试时注销我的实际帐户一样简单-.-'我没有发现其他人有这个问题,因为我没有打印出交易的错误。

所以对于其他有问题的人,试试这个: 1. 记录错误描述如下:

    - (void)failedTransaction:(SKPaymentTransaction *)transaction

    // Log the error
    NSLog(@"%@", [transaction.error localizedDescription]);

    if (transaction.error.code != SKErrorPaymentCancelled)
    
        // error!
        [self finishTransaction:transaction wasSuccessful:NO];
    
    else
    
        // this is fine, the user just cancelled, so don’t notify
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"userCancel" object:self userInfo:nil];
    

如果错误提示“无法连接到 iTunes 商店”-> 请转到您的测试设备上的设置,然后退出您的实际帐户,以便您可以登录您的测试帐户!

这为我解决了这个问题。感谢您尝试提供帮助。下次我一定会先把错误记录下来。

【讨论】:

以上是关于(iOS) 应用内购买失败?的主要内容,如果未能解决你的问题,请参考以下文章

应用内购买测试在 IOS 4.01 上失败,适用于 iOS 5+

IOS应用内购买验证或数据检索

在应用内购买 iOS 中恢复交易

亚马逊应用内购买失败

如何修复在生产中失败的应用内购买?

应用商店版本的应用内购买失败