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

WokerHead

使用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

谢谢!

牧羊人大卫

您只需要设置GMTTimeZone属性DateFormatter即可。

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

一般的建议是:不要使用Foundation在类型Swift,当本土Swift替代品可用,如ArrayDictionaryLocaleDate使用这些替代NSArrayNSDictionaryNSLocaleNSDate

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将Android设备转换为Web服务器

如何将Java Date对象转换为带时区的Matlab datetime数组

如何将LocalDateTime转换为Date忽略的时区?

如何将Blob URL转换为音频文件并将其保存到服务器

iOS服务器端验证-收据类型

如何将PostgreSQL 9.4 jsonb转换为没有功能/服务器端语言的对象

如何将日期转换为本地时区iOS Swift

PHP:如何将18位时间从窗口服务器转换为本地时间

Firebase Firestore + Cloud Function服务器端验证应用内购买收据(Swift + NodeJS)

如何将node.js快速服务器转换为AWS Lambda?

如何将控制台输出转换为txt文件(使用python flask服务器)

Oracle如何将任何时区的时间戳转换为数据库服务器时区的日期

如何将这个简单的Elixir回显服务器转换为简单的Web服务器?

如何将Lightailail服务器(基本帐户)域转换为https?

图像裁剪后如何将base 64转换为图像文件,并需要上传服务器

如何将无服务器应用程序模型(SAM)模板转换为Cloudformation?

如何将频道/服务器ID转换为其名称?

如何将服务器图像URL转换为Drawable Int

如何将本地DNS服务器转换为IP地址?

如何将MySQL服务器时区设置为UTC?

如何验证android计费收据服务器端

如何将Datasnap服务器从VCL应用程序转换为Windows服务

如何将 mvc c# 服务器错误 +number 转换为行号

如何将UTC时间转换为浏览器本地时区?

如何将 FetchXML 数据源转换为 SQL 服务器数据源?

使用时刻将服务器的默认时区转换为本地用户时间?

如何将 GMT 日期从服务器转换为当前用户的时区?

如何将本地服务器转换为在线服务器 Node.js

Websocket 8.5 将 `<Buffer>` 发送到服务器。如何将服务器上的数据转换为 JSON?