簡體   English   中英

以編程方式檢測 iOS 密碼是否啟用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM