[英]Programmatically detect whether iOS passcode is enabled or not
而不是直接在我的應用程序中構建密碼,並可能要求用戶輸入密碼兩次(一次用於設備,一次用於我的應用程序); 我想我可能會比自己聰明,並按照以下方式做一些事情:
if (device has passcode)
continue into my app
else
make user enter my app passcode
我不想設置設備密碼,我不想強制屏幕鎖定,不加密任何東西 - 我真正想要的只是一個 API 來檢測設備密碼是否有效。 就像是:
BOOL notReally = [UIDevice isUserSlightlyMoreSecureBecauseTheySetDeviceLockOn];
或者如果我感到幸運:
BOOL isPasscodeEnabled = [UIDevice isPasscodeEnabled];
BOOL isSimplePasscode = [UIDevice isSimplePasscode];
NSInteger minutes = [UIDevice requirePasscodeAfter];
我猜不是基於這個問題(而是幾年前的)“ 在設置包中以編程方式檢查 iPhone 的密碼”或者這可能是答案; “ Lock Unlock events iphone ” 這不是我想要的,但“事后”可能會起作用。
對於 iOS 9+,您可以使用新的LocalAuthentication
類來檢測它,它適用於模擬器和設備:
import LocalAuthentication
private func devicePasscodeSet() -> Bool {
//checks to see if devices (not apps) passcode has been set
return LAContext().canEvaluatePolicy(.deviceOwnerAuthentication, error: nil)
}
從 iOS 9 開始,您可以使用LocalAuthentication.framework
實現這LocalAuthentication.framework
。 如果針對 iOS 9+,請閱讀此處的評論或查看此答案。
如果您仍然需要針對 iOS 8,請繼續閱讀 :)
從iOS8開始,你可以!
我整理了一個簡單的類別來輕松檢查狀態: https : //github.com/liamnichols/UIDevice-PasscodeStatus
此類別通過使用添加到 iOS 8 中的 Security.Framework 的新 accessControl 功能來工作。它嘗試使用kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
保護級別將項目添加到鑰匙串。
文檔說明如下:
物品數據只能在設備解鎖時訪問。 此類僅在設備上設置了密碼時可用。 建議僅在應用程序處於前台時才需要訪問的項目。 具有此屬性的項目永遠不會遷移到新設備,因此在將備份恢復到新設備后,這些項目將丟失。 在沒有密碼的設備上,不能在此類中存儲任何項目。 禁用設備密碼將導致該類中的所有項目被刪除。
因此,當您嘗試使用此訪問控制級別添加或讀取鑰匙串中的項目時,將返回錯誤。 如果我們看到此錯誤,則passcodeStatus
返回LNPasscodeStatusDisabled
。 如果我們可以使用此級別的 accessControl 成功讀取或寫入鑰匙串,那么我們將返回LNPasscodeStatusEnabled
。
如果設備不受支持或返回與鑰匙串無關的錯誤,我們將返回LNPasscodeStatusUnknown
。
我不知道有什么方法可以直接獲取此信息,但是我認為您可以通過使用 Apple 支持磁盤加密的副作用來實現您所追求的結果。 有關詳細信息,請參閱使用磁盤加密保護數據。
然而,這是一種黑客行為而不是設計行為,並且存在一些它不會意識到的極端情況。 我建議將此功能設置為明確受用戶控制的內容,而不是您通過啟發式啟用的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.