Внедрение проверки квитанций в Swift 3

Я разрабатываю приложение для iOS в Swift 3 и пытаюсь реализовать проверку квитанций, следуя этому руководству:http://savvyapps.com/blog/how-setup-test-auto-renewable-subscription-ios-app, Тем не менее, учебник, кажется, был написан с использованием более ранней версии Swift, поэтому мне пришлось внести несколько изменений. Вот моя функция receiveValidation ():

func receiptValidation() {
    let receiptPath = Bundle.main.appStoreReceiptURL?.path
    if FileManager.default.fileExists(atPath: receiptPath!){
        var receiptData:NSData?
        do{
            receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, options: NSData.ReadingOptions.alwaysMapped)
        }
        catch{
            print("ERROR: " + error.localizedDescription)
        }
        let receiptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
        let postString = "receipt-data=" + receiptString! + "&password=" + SUBSCRIPTION_SECRET
        let storeURL = NSURL(string:"https://sandbox.itunes.apple.com/verifyReceipt")!
        let storeRequest = NSMutableURLRequest(url: storeURL as URL)
        storeRequest.httpMethod = "POST"
        storeRequest.httpBody = postString.data(using: .utf8)
        let session = URLSession(configuration:URLSessionConfiguration.default)
        let task = session.dataTask(with: storeRequest as URLRequest) { data, response, error in
            do{
                let jsonResponse:NSDictionary = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                let expirationDate:NSDate = self.expirationDateFromResponse(jsonResponse: jsonResponse)!
                self.updateIAPExpirationDate(date: expirationDate)
            }
            catch{
                print("ERROR: " + error.localizedDescription)
            }
        }
        task.resume()
    }
}

Проблема обнаруживается, когда я пытаюсь вызвать метод expirationDateFromResponse (). Оказывается, что jsonResponse, который передается этому методу, содержит только:status = 21002;, Я посмотрел на это, и это означает: «Данные в свойстве квитанции были искажены или отсутствуют». Однако устройство, на котором я тестирую, имеет активную подписку на «песочницу» для продукта, и, похоже, подписка работает правильно, помимо этой проблемы. Есть ли что-то еще, что мне еще нужно сделать, чтобы убедиться, что значение receiveData будет прочитано и закодировано правильно, или какая-то другая проблема, которая может быть причиной этой проблемы?

РЕДАКТИРОВАТЬ:

Я попробовал альтернативный способ установки storeRequest.httpBody:

func receiptValidation() {
    let receiptPath = Bundle.main.appStoreReceiptURL?.path
    if FileManager.default.fileExists(atPath: receiptPath!){
        var receiptData:NSData?
        do{
            receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, options: NSData.ReadingOptions.alwaysMapped)
        }
        catch{
            print("ERROR: " + error.localizedDescription)
        }
        let receiptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) //.URLEncoded
        let dict = ["receipt-data":receiptString, "password":SUBSCRIPTION_SECRET] as [String : Any]
        var jsonData:Data?
        do{
            jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
        }
        catch{
            print("ERROR: " + error.localizedDescription)
        }
        let storeURL = NSURL(string:"https://sandbox.itunes.apple.com/verifyReceipt")!
        let storeRequest = NSMutableURLRequest(url: storeURL as URL)
        storeRequest.httpMethod = "POST"
        storeRequest.httpBody = jsonData!
        let session = URLSession(configuration:URLSessionConfiguration.default)
        let task = session.dataTask(with: storeRequest as URLRequest) { data, response, error in
            do{
                let jsonResponse:NSDictionary = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
                let expirationDate:NSDate = self.expirationDateFromResponse(jsonResponse: jsonResponse)!
                self.updateIAPExpirationDate(date: expirationDate)
            }
            catch{
                print("ERROR: " + error.localizedDescription)
            }
        }
        task.resume()
    }
}

Однако, когда я запускаю приложение с этим кодом, оно зависает при достижении строкиjsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted), Он даже не попадает в блок catch, он просто перестает что-либо делать. Из того, что я видел в Интернете, другие люди, похоже, испытывают проблемы с использованием JSONSerialization.data для установки запроса httpBody в Swift 3.

Ответы на вопрос(6)

Ваш ответ на вопрос