iOS 客戶端與服務(wù)端做時(shí)間同步


需求

我們做客戶端的時(shí)候,有時(shí)會(huì)需要對(duì)客戶端與服務(wù)器的時(shí)間進(jìn)行同步,比如搶購(gòu)活動(dòng)、倒計(jì)時(shí)等。這時(shí)我們要考慮如何準(zhǔn)備地與服務(wù)器的時(shí)間進(jìn)行同步,同時(shí)防止用戶本地的時(shí)間有誤差時(shí)導(dǎo)致的問題。

分析

描述

為了實(shí)現(xiàn)以上需求,我們需要:

  1. 獲取服務(wù)器某一時(shí)刻 A 的時(shí)間;

  2. 記錄獲取到時(shí)刻 A 時(shí)的本地時(shí)間 B

  3. 需要用到時(shí)間時(shí),獲取當(dāng)前本地時(shí)間 C,當(dāng) C - B 作為時(shí)間間隔 D,則 A + D 則是當(dāng)前服務(wù)器的時(shí)間。

實(shí)現(xiàn)

  1. 從上面的步驟,我們可以得到,要消除用戶修改時(shí)間導(dǎo)致的影響,必須保證 BC 與系統(tǒng)時(shí)間無關(guān);

  2. iOS 中正好有提供這樣兩個(gè)接口:

  3. 獲取設(shè)備當(dāng)前時(shí)間 Now,該值受系統(tǒng)時(shí)間影響,用戶如果修改時(shí)間,值也會(huì)隨著變化;

  4. 獲取設(shè)備上次重啟的時(shí)間 BootTime,該值受系統(tǒng)時(shí)間影響,用戶如果修改時(shí)間,值也會(huì)隨著變化;;

  5. 由上面 iOS 提供的兩個(gè)接口,我們可以獲取本地時(shí)間 B、C:設(shè)備自上次重啟后運(yùn)行的時(shí)間(BootTime - Now),該值與系統(tǒng)時(shí)間無關(guān);

代碼實(shí)現(xiàn)

獲取當(dāng)前 Unix Time:

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

獲取設(shè)備上次重啟的 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
    }

時(shí)間校準(zhǔn):

// 接口獲取服務(wù)器時(shí)間處理
let serverTime = xxx                        // 獲取到的服務(wù)器時(shí)間
let runTime0 = now() - boottime()           // 當(dāng)前設(shè)備運(yùn)行時(shí)間

// 需要用到時(shí)間時(shí)
let runTime1 = now() - boottime()           // 當(dāng)前時(shí)刻設(shè)備運(yùn)行時(shí)間
let currentTime = serverTime + (runTime1 - runTime0)    // 當(dāng)前服務(wù)器時(shí)間

參考

iOS關(guān)于時(shí)間的處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,037評(píng)論 4 61
  • 風(fēng)有情 行萬余里 吹醒萬物 不問歸期 雨有情 飄浮不定 滋養(yǎng)大地 不計(jì)流失 只是 狂風(fēng)暴雨 不知何需 強(qiáng)大蠻橫 如...
    大清晨的小太陽閱讀 166評(píng)論 0 1
  • (1) 接到媽媽的電話是下午四點(diǎn)多。 我剛剛結(jié)束一場(chǎng)培訓(xùn),整個(gè)過程氣氛很好,臨場(chǎng)加入潛能激發(fā)的視頻,恰到好處地濕潤(rùn)...
    若聆閱讀 1,257評(píng)論 16 21
  • 本文系半撇私塾新媒體創(chuàng)意寫作項(xiàng)目里程碑作品一。 1、 小時(shí)候,媽媽總是喜歡一邊做事情的時(shí)候一邊跟我解釋這件事情是怎...
    桃花島主sue閱讀 271評(píng)論 1 0

友情鏈接更多精彩內(nèi)容