日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 客户端与服务端做时间同步

發布時間:2023/12/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 客户端与服务端做时间同步 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需求

我們做客戶端的時候,有時會需要對客戶端與服務器的時間進行同步,比如搶購活動、倒計時等。這時我們要考慮如何準備地與服務器的時間進行同步,同時防止用戶本地的時間有誤差時導致的問題。

分析

描述

為了實現以上需求,我們需要:

  • 獲取服務器某一時刻 A 的時間;

  • 記錄獲取到時刻 A 時的本地時間 B;

  • 需要用到時間時,獲取當前本地時間 C,當 C - B 作為時間間隔 D,則 A + D 則是當前服務器的時間。

  • 實現

  • 從上面的步驟,我們可以得到,要消除用戶修改時間導致的影響,必須保證 B 和 C 與系統時間無關;

  • iOS 中正好有提供這樣兩個接口:

  • 獲取設備當前時間 Now,該值受系統時間影響,用戶如果修改時間,值也會隨著變化;

  • 獲取設備上次重啟的時間 BootTime,該值受系統時間影響,用戶如果修改時間,值也會隨著變化;;

  • 由上面 iOS 提供的兩個接口,我們可以獲取本地時間 B、C:設備自上次重啟后運行的時間(BootTime - Now),該值與系統時間無關;

  • 代碼實現

    獲取當前 Unix Time:

    static func now() -> Int {var now = timeval()var tz = timezone()gettimeofday(&now, &tz)return now.tv_sec} 復制代碼

    獲取設備上次重啟的 Unix Time:

    func boottime() -> Int {var mid = [CTL_KERN, KERN_BOOTTIME]var boottime = timeval()var size = MemoryLayout.size(ofValue: boottime)if sysctl(&mid, 2, &boottime, &size, nil, 0) != -1 {return boottime.tv_sec}return 0} 復制代碼

    時間校準:

    // 接口獲取服務器時間處理 let serverTime = xxx // 獲取到的服務器時間 let runTime0 = now() - boottime() // 當前設備運行時間// 需要用到時間時 let runTime1 = now() - boottime() // 當前時刻設備運行時間 let currentTime = serverTime + (runTime1 - runTime0) // 當前服務器時間 復制代碼

    參考

    iOS關于時間的處理

    總結

    以上是生活随笔為你收集整理的iOS 客户端与服务端做时间同步的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。