swift - 快速获取在线时间
问题描述
我的应用程序要求用户在线并尝试获取服务器时间,即使用户更改了日期。我找到了这段代码,它仅在我第一次运行该应用程序时才有效。然后下次它冻结,我必须更改网站。每次我更改网站时,它都会立即获得日期和时间,之后我会一直获得相同的确切时间。
代码:
func getTimeFromServer(completionHandler:@escaping (_ getResDate: Date?) -> Void){
let url = URL(string: "https://www.apple.com")
let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in
let httpResponse = response as? HTTPURLResponse
if let contentType = httpResponse!.allHeaderFields["Date"] as? String {
//print(httpResponse)
let dFormatter = DateFormatter()
dFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
let serverTime = dFormatter.date(from: contentType)
completionHandler(serverTime)
}
}
task.resume()
}
解决方案
使用 NTP 服务器仍然更好,但请尝试使用以下内容,这将忽略缓存:
func getTimeFromServer(completionHandler:@escaping (_ getResDate: Date?) -> Void){
let url = URL(string: "https://www.apple.com")
let urlRequest = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 20)
let task = URLSession.shared.dataTask(with: urlRequest) {(data, response, error) in
let httpResponse = response as? HTTPURLResponse
if let contentType = httpResponse!.allHeaderFields["Date"] as? String {
//print(httpResponse)
let dFormatter = DateFormatter()
dFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z"
let serverTime = dFormatter.date(from: contentType)
completionHandler(serverTime)
}
}
task.resume()
}
推荐阅读
- mongodb - Mongodb Mongoose 在运行时更改收集
- react-native - 在反应原生导航中从 Tab 屏幕打开堆栈屏幕
- save - 注销时丢失书签
- c++ - 在 C++ 中的 noexcept 函数中抛出异常的编译器和运行时行为是什么?
- visual-studio-code - 有没有办法在不设置全局变量的情况下通过 vscode 使用 minGW g++ 编译 c++ 源文件?
- geoserver - 恢复地理服务器默认图层
- java - Hibernate NullPOinter / 无法创建到服务器的连接
- unit-testing - 在 spring + Mockito 中模拟传递的功能接口
- google-play - 如何在没有 productId/sku 的情况下使用 Google 订阅 linkedPurchaseToken?
- python - 当前路径 imgupload/imageprocess 与其中任何一个都不匹配