Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios JSON解码器不返回与键编码键相关的值,例如;到期日;在IAP收据中_Ios_Swift_In App Purchase - Fatal编程技术网

Ios JSON解码器不返回与键编码键相关的值,例如;到期日;在IAP收据中

Ios JSON解码器不返回与键编码键相关的值,例如;到期日;在IAP收据中,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,大约2个月前,我实施了自动续费订阅,而且效果良好 然而,当我现在回来在沙箱中测试它们时,我最终得到了没有键过期的值\u找到日期 我调试并打印了最新的收据信息,它显然是一个字符串。为什么会这样?我又看了一遍收据,苹果把一些钥匙改成了Int,但我的过期日期仍然保持不变。我哪里做错了 这是我的代码和收据。错误是 没有与键编码键关联的值(stringValue:\“expires\u date\”,intValue:nil)(“expires\u date\”) 最新收据 "latest_receipt

大约2个月前,我实施了
自动续费订阅,而且效果良好

然而,当我现在回来在沙箱中测试它们时,我最终得到了
没有键过期的值\u找到日期

我调试并打印了
最新的收据信息
,它显然是一个字符串。为什么会这样?我又看了一遍收据,苹果把一些钥匙改成了
Int
,但我的
过期日期仍然保持不变。我哪里做错了

这是我的代码和收据。错误是

没有与键编码键关联的值(stringValue:\“expires\u date\”,intValue:nil)(“expires\u date\”)

最新收据

"latest_receipt_info" =     (
                {
            "expires_date" = "2019-02-06 15:50:21 Etc/GMT";
            "expires_date_ms" = 1549468221000;
            "expires_date_pst" = "2019-02-06 07:50:21 America/Los_Angeles";
            "is_in_intro_offer_period" = false;
            "is_trial_period" = false;
            "original_purchase_date" = "2019-03-21 08:37:40 Etc/GMT";
            "original_purchase_date_ms" = 1553157460000;
            "original_purchase_date_pst" = "2019-03-21 01:37:40 America/Los_Angeles";
            "original_transaction_id" = 1000000495291060;
            "product_id" = "com.myApp.myApp.autoRenewableSubscription";
            "purchase_date" = "2019-02-06 15:45:21 Etc/GMT";
            "purchase_date_ms" = 1549467921000;
            "purchase_date_pst" = "2019-02-06 07:45:21 America/Los_Angeles";
            quantity = 1;
            "transaction_id" = 1000000512208509;
            "web_order_line_item_id" = 1000000042609485;
        }
收据信息

struct IAPReceiptInfo: Decodable {

    let expiresDate: String

    private enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
    }
}

struct IAPReceipt: Decodable {

    let latestReceipt: String
    let status: Int
    var receiptInfo = [IAPReceiptInfo]()

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: Codingkeys.self)
        self.latestReceipt = try container.decode(String.self, forKey: .latestReceipt)
        self.status = try container.decode(Int.self, forKey: .status)
        self.receiptInfo = try container.decode([IAPReceiptInfo].self, forKey: .latestInfos)
    }

    var latestInfo: IAPReceiptInfo? {
        return self.receiptInfo.last
    }

    var IAPLatestReceipt: String {
        return self.latestReceipt
    }

    private enum Codingkeys: String, CodingKey {
        case latestReceipt = "latest_receipt"
        case status
        case latestInfos = "latest_receipt_info"
    }
}
IAPReceiptAPI

    func sendReceiptForToServer(completion pCompletion: @escaping (([IAPReceiptInfo]?, Error?) -> Void)) {
         let receiptData = self.getReceipt?.base64EncodedString()
         let requestReceiptDict = ["receipt": receiptData]
        if receiptData == nil {
            let error = NSError(domain: "No Rec", code: 0, userInfo: nil)
            pCompletion(nil, error)
        }
        do {
            let data = try requestReceiptDict.vyEncode()
            guard let validationUrl = URL(string: "https://us-central1-myApp-a8e27.cloudfunctions.net/receiptValidation") else { return }
            let session = URLSession(configuration: .default)
            var request = URLRequest(url: validationUrl, cachePolicy: .reloadIgnoringLocalCacheData)
            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            request.httpMethod = "POST"
            request.httpBody = data
            let task = session.uploadTask(with:request, from: data) { (data, response, error) in
                guard let data = data, error == nil else { return }
                do {
                    let receipt = try IAPReceipt.vyDecode(data: data)
                    if let receiptLatestInfo = receipt.latestInfo {
                        pCompletion([receiptLatestInfo], nil)
                    }
                } catch let error {
                    pCompletion(nil, error)
                }
            }
            task.resume()
        } catch let error {
            pCompletion(nil, error)
        }
    }
}

刚刚发现
expires\u date
已更改,在某些情况下可能会丢失,因此必须将其设置为
可选
,并立即工作

struct IAPReceiptInfo: Decodable {

    let expiresDate: String?

    private enum CodingKeys: String, CodingKey {
        case expiresDate = "expires_date"
    }
}

解决方案是:let expiresDate:String让expiresDate:IntIts不是
Int
。返回的
JSON
清楚地表明它是一个字符串。
date
怎么可能是
Int
?根据上面的错误,我认为日期是时间戳。这就是我告诉你整型的原因。