2015-02-11 86 views
1

有些遊戲的某些動作與時間相關。例如,如果他玩過遊戲,每24小時用戶可獲得一筆積分......在我們關閉手機並在幾小時後回來後,計時器被正確設置。實現持久倒數計時器

這是如何完成的?必須有一些方法將當前時間寫入永久存儲器,然後從中讀取數據?

我只是猜測它是這樣的:

NSDate * now = [NSDate date]; 
NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; 
[outputFormatter setDateFormat:@"HH:mm:ss"]; 
NSString *newDateString = [outputFormatter stringFromDate:now]; 

然後就是其中newDateString被寫入持久存儲部分。

另外,如果這是一種方法,如果用戶在他的設備上手動更改時間會發生什麼?我們可以依靠這個還是有其他一些方法來追蹤遊戲中某些時刻之間的真實時間?

+1

也許定時器鏈接到服務器上的時鐘? – mti2935 2015-02-11 21:10:11

+0

我明白。但是,例如,如果沒有服務器,這是如何完成的?我已經在離線模式下玩過遊戲(也關閉了iCloud)並且定時器仍然有效......我不確定遊戲是依靠服務器時間還是系統時間來設置的...... – Whirlwind 2015-02-11 21:14:51

+0

將開始時間寫入NSUserDefaults當遊戲再次變爲活動時,處理時間已過。爲了防止用戶在設備上弄亂時間,您可能必須與服務器通信才能獲得準確的時間。 – sangony 2015-02-11 21:15:50

回答

2

您可以通過將下一個獎勵時間寫入NSUserDefaults並比較以前的值來做到這一點。

// Fetch previous "next award" time. 
NSNumber *previousTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"next_award_time"]; 
NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; 

// If we haven't yet scheduled a "next award" time, or if we've passed it.. 
if (!previousTime || [previousTime doubleValue] < now) { 
    // We had a previous value, so we've passed the time. 
    if (previousTime) { 
    // Award user. 
    } 
    // Set next award time. 
    NSTimeInterval nextTime = [[NSDate date] timeIntervalSince1970] + 60*60*24; 
    [[NSUserDefaults standardUserDefaults] setObject:@(nextTime) forKey:@"next_award_time"]; 
} 

至於擔心用戶改變他們自己的設備時,你需要做一個網絡請求,公正的第三方時鐘。這可能是您控制的服務器或着名的時間服務器。您可能想要查看this answer以獲取有關如何聯繫NTP的幫助。

+0

謝謝伊恩,我會讀它。 – Whirlwind 2015-02-11 21:31:51

+1

time.jsontest.com可能是在iOS應用程序中擁有遠程時間授權的最簡單方法。從URL中簡單地獲取數據,然後解析JSON。太好了。我不知道那件事。 – 2015-02-11 21:36:41