【问题标题】:Already purchased subscriptions in StoreKit已在 StoreKit 中购买的订阅
【发布时间】:2011-05-30 15:07:25
【问题描述】:

我在 iOS 应用的应用购买中使用可续订订阅。 当用户尝试购买他们已经支付的订阅时,iTunes 会显示一条消息“您当前订阅了此”。

我如何检测此事件何时发生,以便我可以处理交易并授予对我的应用程序的访问权限。

在观察者的 paymentQueue:updatedTransactions: 方法中,它以 SKPaymentTransactionStateFailed 的形式通过。如何区分此类故障和用户按下取消按钮等其他故障?

我是提交返回的交易还是需要调用 restorePreviousTransactions。

在 Apple 文档中,它声明“如果用户尝试购买他们已经购买的非消耗性产品或可续订的订阅,您的应用程序会收到该项目的常规交易,而不是恢复交易。但是,用户是不会对该产品再次收费。您的应用程序应以与原始交易相同的方式处理这些交易。"

【问题讨论】:

    标签: objective-c ios storekit


    【解决方案1】:
    Q: How I can detect when this event (currently subscribed) has occurred so that I can process the transaction and grant access to my app.
    

    您通过 Apple 验证检测订阅何时存在(我使用 php 网站代码来执行此操作),您会收到“状态代码”响应,并且可以验证它是否是代码 21006(订阅已过期),或者其他(我认为 0 和 21006 以外的任何内容都是实际错误)。

    我做事的方式是将交易细节存储在一个 PLIST 文件中,该文件存储在文档目录中。

    您可以在 PLIST 中添加额外的字段,例如 expiryDates、布尔标志等。

    这样您就有了收据的副本,尽管您应该始终验证它,因为它可能已经过期。

    问:在 paymentQueue:updatedTransactions: 方法中观察它 以 SKPaymentTransactionStateFailed 的形式出现。我如何 区分此类故障和其他故障,例如 用户按下取消按钮?

    您在 updatedTransactions 方法中使用 switch 语句来确定不同类型的响应。

    例子

    -(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
    {    
        NSString *message = [NSString stringWithFormat:@"Transaction failed with error - %@", error.localizedDescription];
        NSLog(@"Error - %@", message);
    
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" 
                                                            message:message 
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK" 
                                                  otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }
    
    -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    {
        NSLog(@"updatedTransactions");
        for (SKPaymentTransaction *transaction in transactions)
        {
            switch (transaction.transactionState)
            {
                case SKPaymentTransactionStatePurchasing:
                    // take action whilst processing payment
                    break;
    
                case SKPaymentTransactionStatePurchased:
                    // take action when feature is purchased
                    break;
    
                case SKPaymentTransactionStateRestored:
                    // take action to restore the app as if it was purchased            
                    break;
    
    
                case SKPaymentTransactionStateFailed:
                    if (transaction.error.code != SKErrorPaymentCancelled)
                    {
                    // Do something with the error
                    } // end if
                    break;
    
                default:
                    break;
            } // end switch
    
        } // next
    

    TransactionStateFailed 处理失败,尽管我没有为取消编写代码,因为我没有理由在我的应用程序中这样做。

    问:我是提交被退回的交易还是需要调用 恢复PreviousTransactions。

    我相信 StoreKit 在内部使用 finishTransaction 方法和 restorePreviousTransaction 方法处理这个问题

    即,

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

    完成交易

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 2023-04-03
      • 2018-05-25
      • 2015-02-18
      • 2018-09-08
      • 2015-01-28
      • 1970-01-01
      • 2019-12-15
      • 2019-07-21
      相关资源
      最近更新 更多