業(yè)務(wù)風(fēng)險(xiǎn):
對于一些秒殺桐玻、簽到忧设、以時(shí)間為尺度做任務(wù)的業(yè)務(wù)需求對于時(shí)間的保真行和準(zhǔn)確性要求非常的高。但是客戶端的系統(tǒng)時(shí)間能夠被用戶修改,因而通過之前普通的方式進(jìn)行時(shí)間的獲取會(huì)存在很大風(fēng)險(xiǎn)彩扔。
因此我們要做一些措施來防止拿到的數(shù)據(jù)是被惡意修改的時(shí)間,減少對業(yè)務(wù)的損害僻爽。
思路:系統(tǒng)啟動(dòng)后到當(dāng)前的時(shí)間間隔是無法被外界修改的虫碉,因此我們可以把這個(gè)時(shí)間和服務(wù)器拿到的時(shí)間作為準(zhǔn)確的時(shí)間來計(jì)算要上傳到服務(wù)端的時(shí)間
uptime:系統(tǒng)重啟后到目前為止的時(shí)間間隔,這個(gè)時(shí)間級(jí)別是內(nèi)核時(shí)間胸梆。
1.先拿到服務(wù)器時(shí)間T0敦捧,此刻也取到當(dāng)前的uptimeT1
2.在要使用時(shí)間時(shí),獲取當(dāng)前的uptimeT2碰镜,則T2-T1就是最準(zhǔn)確的時(shí)間間隔兢卵,則與服務(wù)器時(shí)間對應(yīng)的時(shí)間應(yīng)該是T0 + T2-T1
這樣我們拿到的時(shí)間T0 + T2-T1 應(yīng)該算得上是非常準(zhǔn)確的數(shù)據(jù)了。
獲取uptime
? //uptimeh獲取系統(tǒng)重啟后的至今運(yùn)行的時(shí)間
? ? func uptime() ->time_t {
? ? ? ? var boottime =timeval()
? ? ? ? var mib: [Int32] = [CTL_KERN, KERN_BOOTTIME]
? ? ? ? var size =MemoryLayout.stride(ofValue:timeval())
? ? ? ? var now =time_t()
? ? ? ? var uptime:time_t=-1
?? ? ? ?time(&now)
? ? ? ? if(sysctl(&mib,2, &boottime, &size,nil,0) !=-1 && ?boottime.tv_sec!=0) {
? ? ? ? ? ? uptime = now - boottime.tv_sec
? ? ? ? }
? ? ? ? return uptime
? ? }