2010-12-23 33 views
0

我有一個應用程序,需要我在一段時間後採取行動。例如,如果用戶在幾個星期內還沒有進入應用程序,那麼當用戶最終啓動應用程序時,我必須要求他們在安裝此應用程序時爲其提供特殊代碼。 (這是一個內部的應用程序,我被要求這樣做是出於安全考慮)iphone sdk系統時間vs用戶時間

我正在使用[NSDate date]方法檢索用戶登錄並將其保存到數據庫中的日期。我比較下次打開應用程序時的這個保存日期,看看它們上次登錄後的時間。問題在於[NSDate date]給出了時間設置的時間,用戶可以在本機設置應用程序中手動更改時間設置。正如你可能會說的那樣,這會給我的情況帶來很多問題。如果假設用戶在不活動3周後放入特殊代碼,他可以通過修改本機設置應用程序中的時間來顯示此屏幕,或者更糟糕的是,通過將時間設置爲上一個日期這將在他活動的3周內完成。

有沒有辦法讓「系統時間」而不是「用戶時間」?我查看了mach_absolute_time(),但是在設備重啓之後會重置。由於不活動的時間我會比較相當大,那麼設備將有可能重新啓動。我也想過使用網絡連接從應用程序之外的服務器獲取時間,但很多用戶在使用iPad時無法訪問WiFi。如果我找不到其他東西,那將是我最後的解決方案。由於它們在使用過程中的位置,我正嘗試使用設備本身的所有內容。

我可以忽略這裏簡單的東西嗎?這似乎太簡單的問題沒有答案。請引導我走向正確的方向。先謝謝你。

回答

0

爲什麼不在當時查詢遠程服務器 - 大量的NTP服務器或者只是在您自己的服務器上向php腳本發出一個簡單的HTTP請求。當然,如果你的應用程序可能永遠不會連接到互聯網可能是一個問題,但一旦你有第三方時間,很容易猜測用戶是否玩過時鐘。

+0

問題是網絡將無法一直使用。我不想依賴外部信息。不知何故蘋果能夠找出正確的時間,即使在飛機模式下,重新啓動設備等等。 – Bittu 2011-08-10 16:55:33

0

如果這是一個內部應用程序(因此您不受Apple審批流程的限制),您可以將您的應用程序標記爲做一些背景資料(voip或接收位置更新),以便該應用程序始終處於活動狀態,你可以更新某種「未使用」的計數器。設備重啓後,甚至可以通過操作系統重啓Voip應用程序。

但當然它會耗盡電池。

0

要麼:使實際時間成爲您的應用程序的基本功能。這樣用戶將需要保持設備的時間是最新的並且不能返回三週

或者:將代碼標記爲過期並在應用程序通知用戶之前保存這些信息。這會阻止大多數用戶設置時間。大多數人會嘗試一次或兩次,看到該應用程序保持禁用,並會放棄。

您還可以保存上次成功執行的時間戳,並且如果這個時間超過了未來的合理時間範圍(請記住夏令時/冬令時),請將其視爲「黑客攻擊」。在該時間戳上添加一個CRC校驗碼(或者你提出的任何不明確的想法)並保存,你將停止大量的腳本小子。

您永遠無法阻止頑固的黑客,他們會積極搜索您可能已經投入應用程序的每一個技巧。只關注「平均」用戶。