带有InAppPurchase和2个目标的iOS App

时间:2018-06-27 23:39:56

标签: ios swift xcode in-app-purchase

我用IAP(只有一个非消耗品)创建了一个应用,并进行了试用和完整目标。到目前为止,一切正常(我认为)。 如果我使用模拟器启动了试用版或完整版,那么即使是IAP方法也可以使用。但是问题是:当用户购买完整版时,如何更改目标? 在Xcode中,我可以选择并启动所需的版本(目标),但是如何确定起始目标是试用版而不是完整版? 我在Xcode中添加了Swift Flag,但是也许我误解了它的操作。 我必须重新开始吗?

1 个答案:

答案 0 :(得分:0)

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
        }
    }
}

只需要一个目标。