具有 InAppPurchase 和 2 个目标的 iOS 应用程序

标签 ios swift xcode in-app-purchase

我已经使用 IAP 创建了一个应用程序(只有一个非消耗品),并制定了试用版和完整目标。到目前为止一切都很好(我认为)。 如果我使用模拟器启动试用版或完整版,则一切都可以工作,甚至是 IAP 方法。但问题是:当用户购买完整版后如何更改目标? 在 Xcode 中,我可以选择并启动我想要的版本(目标),但如何确定起始目标是试用版本而不是完整版本? 我在 Xcode 中添加了 Swift Flag,但也许我误解了它的操作。 我必须重新开始吗?

最佳答案

func startBuyingProducts() {
    let purchaseRequest = SKProductsRequest(productIdentifiers: Set<String>(arrayLiteral:productID))
    purchaseRequest.delegate = self
    purchaseRequest.start()
}

// SKPridcutsRequestDelegate method
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
    if let product = response.products.first {
        if SKPaymentQueue.canMakePayments() {
            let payment = SKPayment(product: product)
            SKPaymentQueue.default().add(self)
            SKPaymentQueue.default().add(payment)
        }
    }    


//implement method of SKPaymentTransactionObserver 
//trigger the unlock feature method when the purchase succeed and the receipt return is verified through apple
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        switch transaction.transactionState {
            case .purchased:
                if let receiptURL = Bundle.main.appStoreReceiptURL {
                    let request = URLSession.shared.dataTask(with: receiptURL, completionHandler: { (data, response, error) in
                        let receiptJSON = data?.base64EncodedString(options: Data.Base64EncodingOptions.init(rawValue: 0))

                        //verify the receipt throught apple, or sending the verification throught your own server
                        var request = URLRequest(url: URL(string:"https://sandbox.itunes.apple.com/verifyReceipt")!)
                        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                        request.httpMethod = "POST"
                        request.httpBody = receiptJSON?.data(using: String.Encoding.utf8)
                        let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
                            // unlock the feature here
                        })
                    })
                }
                SKPaymentQueue.default().finishTransaction(transaction)
                break
            case .failed:
                SKPaymentQueue.default().finishTransaction(transaction)
                break
            case .deferred:
                break
            case .purchasing:
                break
            case .restored: break
        }
    }
}

只需要一个目标。

关于具有 InAppPurchase 和 2 个目标的 iOS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072809/

相关文章:

iphone - 如何垂直移动带有 slider 的 UILabel

ios - iPhone 4 上的背景图像被压缩,因为它使用与 iPhone 5 和 6 共享的 2 倍图像。有解决办法吗?

ios - 在 iOS 10 中,NSFetchedResultsController 的实例需要非零 fetchRequest 和 ManagedObject 上下文

swift - 如何实现图书馆进化?

xcode - Swift:如何将协议(protocol)类型转换为特定协议(protocol)?

ios - 转换为 swift 3 后, View Controller 中出现奇怪的通用函数

ios - 如何使用 url 而不是本地加载 rtf

swift - IBInspectable 变量值在界面生成器和模拟器中没有改变

ios - 从 Firebase 检索所有子值并显示在文本字段/ TextView 上

ios - iOS MVVM 中 View Controller 之间的通信