ios - Swift:如何将Date()转换为苹果服务器的时区以验证收据?

标签 ios swift datetime in-app-purchase storekit

使用Swift 3

当我调用此代码时,它显示为我的时区

let date = Date()
let todayDate = formatter.string(from: date)
print(todayDate)

我从StoreKit收据调用了JSON响应,以检查original_purchase_dateexpires_date以将其与todayDate进行比较以验证收据。

例如我想做什么
if (todayDate > expires_date ) {
    cancel subscription
}

如果Apple的purchase_date和expires_date在GMT时区中,而todayDate在用户所在的时区中,则我无法匹配日期。

因此,我只需要在调用Date()时转换用户所在的时区,并将其转换为Apple服务器之类的GMT即可,这样我就可以检查todayDate是否通过了Auto Renewable订阅上的过期数据。

此外,这是防止应用内黑客入侵的好方法吗?我使用php从服务器上收到了收据,该收据从Apple进行了验证。
if parseJSON["status"] as? Int == 0 {

print("Status Code for Receipt = 0!")

// Checking "latest_receipt_info"
if let receiptInfo: NSArray = parseJSON["latest_receipt_info"] as? NSArray {
    let lastReceipt = receiptInfo.lastObject as! NSDictionary

    // Get last receipt
    print("\nLAST RECEIPT INFORMATION: \n", lastReceipt)

    // Format date
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV"
    formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale!

    // Get "original_purchase_date" as NSDate
    let subscriptionBoughtDate: NSDate = formatter.date(from: lastReceipt["original_purchase_date"] as! String) as NSDate!
    print("\n   - DATE BOUGHT SUBSCRIPTION = \(subscriptionBoughtDate)\n")

    // Get "expires_date" as NSDate
    let subscriptionExpirationDate: NSDate = formatter.date(from: lastReceipt["expires_date"] as! String) as NSDate!
    print("\n   - DATE SUBSCRIPTION EXPIRES = \(subscriptionExpirationDate)\n")

    // Get Todays Date
    let date = Date()
    let todayDate = formatter.string(from: date)
    print("\n   - DATE TODAY = \(todayDate)\n")

    // See if current date has passed expired date
}

JSON回应
LAST RECEIPT INFORMATION: 
{
"expires_date" = "2017-08-03 04:50:08 Etc/GMT";
"expires_date_ms" = 1501735808000;
"expires_date_pst" = "2017-08-02 21:50:08 America/Los_Angeles";
"is_trial_period" = false;
"original_purchase_date" = "2017-08-02 15:27:27 Etc/GMT";
"original_purchase_date_ms" = 1501687647000;
"original_purchase_date_pst" = "2017-08-02 08:27:27 America/Los_Angeles";
"original_transaction_id" = 1000000552288255;
"product_id" = "com.example.gg.month";
"purchase_date" = "2017-08-03 04:45:08 Etc/GMT";
"purchase_date_ms" = 1501735508000;
"purchase_date_pst" = "2017-08-02 21:45:08 America/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000568853433;
"web_order_line_item_id" = 1000000055887122;
}

- DATE BOUGHT SUBSCRIPTION = 2017-08-02 15:27:27 +0000


- DATE SUBSCRIPTION EXPIRES = 2017-08-03 04:50:08 +0000


- DATE TODAY = 2017-08-04 17:26:51 America/New_York

谢谢!

最佳答案

您只需要将TimeZoneDateFormatter属性设置为GMT即可。

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV"
formatter.timeZone = TimeZone(secondsFromGMT: 0)

一个一般性建议:在提供本地Foundation替代方案(例如SwiftSwiftArrayDictionary)时,不要在Locale中使用Date类型。使用这些代替NSArrayNSDictionaryNSLocaleNSDate

关于ios - Swift:如何将Date()转换为苹果服务器的时区以验证收据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45515971/

相关文章:

ios - iOS 如何知道用户来到了特定位置? [既不在后台也不在前景]

ios - 使用 MKLocalSearchCompleter 没有地标

c# - 将 DATETIME 从 C# 插入到 Oracle DB 时,格式代码出现两次错误

ios - 选项卡和 webView

ios - 错误域=NSCocoaErrorDomain 代码=512 "The operation couldn’ t be completed.The operation couldn't be completed.是一个目录

ios - 在展开可选内容时,将 Parse PFUser 信息快速加载到 View 中失败,并发现 nil

php - 使用 CDbMigration 将当前时间插入 MySQL 表

swift - 用于 Facebook 身份验证和数据库的 Firebase

swift - 您是否应该能够在不同的文件中声明两个具有相同名称的私有(private)变量?

MySQL:将日期时间插入其他日期时间字段