一鞍陨、作弊方法描述
一些游戲會(huì)在某些情況下讓玩家等待一段時(shí)間,例如candy crush中游戲失敗會(huì)消耗一點(diǎn)體力阻塑,體力不滿時(shí)蓝撇,會(huì)每隔30分鐘漲一點(diǎn)。體力耗盡時(shí)就無法再進(jìn)行游戲陈莽,此時(shí)玩家可以修改系統(tǒng)時(shí)間渤昌,調(diào)到未來的時(shí)間虽抄,再回到游戲中,體力就會(huì)漲滿了独柑。游戲的這種控制就失效了迈窟。 原理:當(dāng)消耗一點(diǎn)體力時(shí),游戲會(huì)記錄一個(gè)時(shí)刻t1忌栅,等到當(dāng)前時(shí)刻為t1+30分鐘時(shí)车酣,就會(huì)加上一點(diǎn)體力。如果把系統(tǒng)時(shí)間調(diào)后半個(gè)小時(shí)索绪,那就不需要等待直接回復(fù)體力了湖员。
二、解決思路
1瑞驱、通過開機(jī)運(yùn)行時(shí)間計(jì)算開機(jī)時(shí)刻
ios和android都提供了一個(gè)方法:獲取自開機(jī)到現(xiàn)在運(yùn)行時(shí)間破衔。就是利用這個(gè)方法來做時(shí)間校驗(yàn)。通過獲取當(dāng)前時(shí)間(有可能被修改)和開機(jī)運(yùn)行時(shí)間钱烟,可以計(jì)算出開機(jī)時(shí)刻(前者減后者),如果一直保持開機(jī)狀態(tài)嫡丙,那么這個(gè)開機(jī)時(shí)刻應(yīng)該是不變的拴袭。如果某次開機(jī)時(shí)刻算計(jì)算出來與上一次不同,那么就可以判斷計(jì)時(shí)器出錯(cuò)曙博。
2拥刻、記錄開機(jī)時(shí)刻
第一次運(yùn)行游戲時(shí)會(huì)把開機(jī)時(shí)刻記錄下來,用于之后計(jì)算的對(duì)比父泳。
3般哼、聯(lián)網(wǎng)時(shí)間修正
當(dāng)用戶時(shí)間異常,比如往后調(diào)了1個(gè)小時(shí)惠窄,計(jì)算出開機(jī)時(shí)刻與上次不同蒸眠,此時(shí)需要聯(lián)網(wǎng)修正時(shí)間。從網(wǎng)絡(luò)上取得正確的當(dāng)前時(shí)間杆融,對(duì)比用戶時(shí)間(有可能被修改)楞卡,計(jì)算出時(shí)間差1個(gè)小時(shí),記錄這個(gè)時(shí)間差脾歇。之后每次獲取用戶當(dāng)前時(shí)間的時(shí)候都要減去這個(gè)時(shí)間差蒋腮,結(jié)果可以能當(dāng)成正確的系統(tǒng)時(shí)間,再根據(jù)1的方法算出開機(jī)時(shí)刻就比較準(zhǔn)確了藕各。時(shí)間修正后會(huì)重設(shè)上次開機(jī)時(shí)刻做為新的參考值池摧。
三、示例
進(jìn)入游戲時(shí)激况,取得當(dāng)前系統(tǒng)時(shí)間8點(diǎn)作彤,獲得開機(jī)運(yùn)行3個(gè)小時(shí)膘魄,計(jì)算出開機(jī)時(shí)刻是5點(diǎn)。 游戲中在9點(diǎn)鐘觸發(fā)了一個(gè)30分鐘的計(jì)時(shí)器宦棺,應(yīng)該在9點(diǎn)半的時(shí)候完成瓣距。此時(shí)用戶切到設(shè)置中修改了系統(tǒng)時(shí)間到10點(diǎn)。 再回到游戲中代咸,會(huì)進(jìn)行計(jì)時(shí)器檢查蹈丸,系統(tǒng)時(shí)間是10點(diǎn),開機(jī)運(yùn)行4小時(shí)呐芥,計(jì)算出開機(jī)時(shí)刻是6點(diǎn)逻杖,與之前記錄的5點(diǎn)不一樣,判斷出計(jì)時(shí)器出錯(cuò)思瘟。如果用戶不進(jìn)行聯(lián)網(wǎng)校正荸百,那就無法繼續(xù)操作。 用戶聯(lián)網(wǎng)后滨攻,取出網(wǎng)絡(luò)真實(shí)時(shí)間9點(diǎn)够话,計(jì)算出用戶時(shí)間差1小時(shí)(10-9),重置上次開機(jī)時(shí)刻光绕,還是5點(diǎn)鐘沒變(如果是關(guān)機(jī)再開機(jī)這個(gè)值會(huì)變)女嘲。 校正完后讓計(jì)時(shí)器繼續(xù),取用戶時(shí)間會(huì)減去時(shí)間差诞帐,即可以得到真實(shí)時(shí)間欣尼,那么計(jì)時(shí)器就可以正常運(yùn)行了。 如果用戶保持聯(lián)網(wǎng)狀態(tài)停蕉,那么計(jì)時(shí)器出錯(cuò)就會(huì)瞬間被校正愕鼓。
四、缺陷
對(duì)于不作弊的用戶慧起,如果機(jī)關(guān)再開機(jī)菇晃,并且沒有聯(lián)網(wǎng),會(huì)判斷計(jì)時(shí)器出錯(cuò)無法繼續(xù)操作蚓挤。需要聯(lián)網(wǎng)校正谋旦。
獲取開機(jī)時(shí)間
NSProcessInfo *info = [NSProcessInfo processInfo];
NSLog(@"%f", info.systemUptime);
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSince1970];
NSLog(@"start time: %@", [AppDelegate getDateStrFromTimeStep:interval - info.systemUptime]);
+(NSString *)getDateStrFromTimeStep:(long long)timestep{
NSDate *timestepDate = [NSDate dateWithTimeIntervalSince1970:timestep];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSTimeZone* timeZone = [NSTimeZone systemTimeZone];
[formatter setTimeZone:timeZone];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
return [formatter stringFromDate:timestepDate];
}