首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS- In应用程序购买在沙箱环境中正常工作,Appstore版本内容未解锁

iOS- In应用程序购买在沙箱环境中正常工作,Appstore版本内容未解锁
EN

Stack Overflow用户
提问于 2017-12-30 22:42:01
回答 1查看 285关注 0票数 0

在应用程序内购买工作在沙箱环境中,但在应用程序商店版本金额从用户帐户借记,但内容未解锁。

我不认为在编码方面有问题。否则,它将无法在沙箱环境中工作。我认为有可能交易收据为零。

当我再次点击购买时,它显示“您已经订阅”。但是,它仍然没有解锁应用程序的内容。即使我点击恢复购买,但它也不起作用。我很惊讶为什么一切都能在沙箱环境中工作。

订阅类型:自动续费。内容解锁:音频、视频和pdf教程。

我已经检查了后端日志。API从未执行过,我填写的唯一问题是,即使用户成功购买,我也没有收到应用程序商店的收据。一切都能在沙箱环境中完美工作。

代码:

代码语言:javascript
复制
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {

        for transaction in transactions {

            switch transaction.transactionState {
            case .purchasing:
                handlePurchasingState(for: transaction, in: queue)
            case .purchased:
                handlePurchasedState(for: transaction, in: queue)
            case .restored:
                handleRestoredState(for: transaction, queue: queue)
            case .failed:
                handleFailedState(for: transaction, in: queue)
            case .deferred:
                handleDeferredState(for: transaction, in: queue)
            }
        }
    }

//On transaction state changed to purchased:
func handlePurchasedState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
        print("User purchased product id: \(transaction.payment.productIdentifier)")
        print("User purchased product id: \(transaction)")
        queue.finishTransaction(transaction)
        self.completeTransaction(transaction:transaction)
    }

//In completeTransaction Method:
func completeTransaction(transaction:SKPaymentTransaction)
    {
        if let receiptURL = Bundle.main.appStoreReceiptURL,FileManager.default.fileExists(atPath: receiptURL.path)
        {
            let receipt:Data = try! Data(contentsOf: receiptURL)
            let jsonObjectString = receipt.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
            var strIdentifier:String = transaction.transactionIdentifier!

            if let identifier = transaction.original?.transactionIdentifier
            {
                strIdentifier = identifier
            }

        //API call to save receipt to validate later and unlock the content
        //In case API calling failed then I stored data and called API again on app home page.
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2018-02-07 15:35:24

请在验证收款queue.finishTransaction(交易)后完成交易

苹果还建议“在完成交易之前下载所有苹果托管的内容。交易完成后,其下载对象将不能再被使用。”

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48034951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档