应用内购买 - 产品购买后的确认提醒

时间:2015-12-10 23:48:28

标签: ios objective-c in-app-purchase storekit

我已经实现了IAP,我正在测试它,但是我遇到了以下问题,为此我搜索了很多解决方案。它不会一直发生,这让我责怪沙箱模式,但我认为这不是很聪明,所以我在寻求帮助:

  1. 点击购买产品
  2. 显示警告以插入itunes的密码
  3. 未插入密码或未确认 (同时在后面已经买了产品,然后进入显示产品的视图。)
  4. 点按取消
  5. 没关系,已经买了。
  6. 这是我的代码:

    - (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    {
        for(SKPaymentTransaction *transaction in transactions)
        {
            switch (transaction.transactionState) 
            {
                case SKPaymentTransactionStatePurchasing:
                {
                    NSLog(@"transaction state -> Purchasing");
                    break;
                }
                case SKPaymentTransactionStatePurchased:
                {
                    NSLog(@"purchased -- state");
    
                    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
                    [self goToProductViewController];
                    break;
                }
                case SKPaymentTransactionStateRestored:
                {
                    NSLog(@"transaction state -> RESTORED");
                    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                    break;
                }
                case SKPaymentTransactionStateFailed:
                {
                    NSLog(@"transaction state -> Cancelled");
                    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                    break;
                }
                default:
                    break;
            }  
        }
    }
    

    我做错了什么?为什么在确认之前购买产品,甚至在输入密码之前?我购买产品后,我正在调用购买产品的方法,而不是采购状态。如果这是正常行为,那么我如何才能确定产品已被确认购买的状态?它只有4次正常运行,就像它在确认之后等待实际调用方法goToProductViewController,但其余的几十次测试都没有。

    提前谢谢!

3 个答案:

答案 0 :(得分:0)

可能是因为您不符合 SKPaymentTransactionObserver 协议。

如果您还没有,请将<SKPaymentTransactionObserver>添加到您的头文件中,并在didFinishLaunchingWithOptions中实施观察者(下面的示例)

- (BOOL)application:(UIApplication *)application
 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    /* ... */

    [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
}

〜更新

由于您设置了Observer,因此请确保您的应用在更新整个UI和方法调用时完成事务,以准备访问新功能。使用以下方式完成交易:

SKPaymentTransaction *transaction = <# The current payment #>;
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

如果没有调用(或过去没有),则可能导致您当前遇到的问题。

答案 1 :(得分:0)

我建议您尝试购买具有不同商店ID的其他商品。也许你的观察者正在捕捉最后一次购买,而不是你刚刚初始化的购买者。要检查是否发生了什么,请尝试测试购买具有不同产品ID的其他产品。当你的观察者购买时购买。检查产品ID并将其与刚刚初始化的产品ID进行比较。

注意:如果您错过了需要使用新产品ID进行重新测试,则需要专注于此测试原因。

答案 2 :(得分:0)

四年后才回答,但是如果有人遇到同样的问题,如果您使用的是越狱的设备,请尝试重新启动未越狱的系统,我不确定是否有特定的调整导致这种情况,但是有效。