ios - 从 iPhone 中删除我的帐户时,应用内购买是否有效?
问题描述
我在我的应用程序中使用自动续订订阅应用内购买。我想知道当我在 iPhone 中购买后删除我的苹果帐户时发生了什么。应用内购买是否有效?我正在使用沙盒环境。
如果不是这样,如何知道应用内苹果帐户已被删除?
我尝试验证收据并检查应用内购买的是否过期,但删除苹果帐户后,我总是收到收据响应为真。
这是我的收据请求代码:
@objc func loadreceipt() {
if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
FileManager.default.fileExists(atPath: appStoreReceiptURL.path) {
if UD.getS(receiptdata).isEmpty == false {
Api.inAppPurchasecall(.receiptVarify(rdata: UD.getS(receiptdata), excludeInclude: true)) { response, error in
if error == nil {
self.checkresponse(response: response as! Map)
}else{
print(error)
}
}
}else{
do {
let receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped)
let receiptString = receiptData.base64EncodedString(options: [])
Api.inAppPurchasecall(.receiptVarify(rdata: receiptString, excludeInclude: true)) { response, error in
if error == nil {
self.checkresponse(response: response as! Map)
}else{
print(error)
}
}
}
catch { print("Couldn't read receipt data with error: " + error.localizedDescription) }
}
}else{
requestrefreshreceipt = SKReceiptRefreshRequest()
requestrefreshreceipt?.delegate = self
requestrefreshreceipt?.start()
}
}
收据响应码:
func checkresponse(response : Map) {
if let rdata = response["latest_receipt"] as? String {
UD.setS(receiptdata, rdata)
}
if let latestreceiptinfo = response["latest_receipt_info"] as? [Map] {
if let lastinfo = latestreceiptinfo.first {
if let expiredate = lastinfo["expires_date"] as? String, let edate = Formatter.customDate.date(from: expiredate) {
if let strEdate = gmtToLocal(date: edate) {
self.nextBillingDate = strEdate
}
}
if let expiredate = lastinfo["purchase_date"] as? String, let edate = Formatter.customDate.date(from: expiredate) {
if let strEdate = gmtToLocal(date: edate) {
self.lastBillingDate = strEdate
}
}
if let expiretime = lastinfo["expires_date_ms"] as? String, let doubleexpiretime = Double(expiretime) {
expireTimeStamp = doubleexpiretime/1000
let currenttimestamp = Date().timeIntervalSince1970
if let etimestamp = expireTimeStamp {
if etimestamp > currenttimestamp {
UD.setS(AppConst.SUBSCRIPTION_STATUS, "true")
NotificationCenter.default.post(name: NSNotification.Name(rawValue: kRefreshServices), object:nil)
}else{
UD.setS(AppConst.SUBSCRIPTION_STATUS, "false")
NotificationCenter.default.post(name: NSNotification.Name(rawValue: kRefreshServices), object:nil)
if let expiredate = lastinfo["expires_date"] as? String, let edate = Formatter.customDate.date(from: expiredate) {
if let root = APP_DELEGATE.window?.rootViewController {
if let strEdate = gmtToLocal(date: edate) {
}
}
}
}
}
}
}
}
}
解决方案
推荐阅读
- pivot - 您将如何转换具有可变 ID 位置数量的表,以使位置成为列?
- node.js - ERR_NAME_NOT_RESOLVED 使用 Docker 网络在后端容器和 React 容器之间进行通信
- flutter - 从 Flutter 的另一个屏幕调用 Future 函数
- python-3.x - 在多元线性回归中打印预测值时出错
- javascript - React 给我错误 TypeError: XXX.map is not a function
- teradata - 如何在 Teradata 中使用 Qualify 语句排除记录
- algorithm - 到达图中具有连通分量的每个节点的最短时间
- node.js - NodeJS,MongoDB - 从 GET 请求中的聚合返回 JSON 响应
- python - DataFrame 中按其他列值分组的出现次数
- c# - 一个类中的两个构造函数 C#