2011-05-31 78 views
18

由於我的應用程序將處理用戶的敏感數據,我想知道是否有方法可以從我的應用程序中檢查是否在iOS中設置了密碼鎖。以編程方式檢查是否設置密碼鎖

我需要檢查這個的原因是因爲如果用戶在應用程序中有一些信息,然後將它保存在桌子上並且出去幾分鐘。 iPad/iPhone默認進入待機模式。如果設置了密碼鎖,只有當輸入正確的密碼時,任何人都可以使用ipad。這將提供額外的安全措施,以防止任何過路人從應用中查看敏感數據。

所以基本上,我想我的應用程序檢查密碼鎖是否設置,如果不提示用戶這樣做。

這可能嗎?

+0

我不認爲這是可能的。爲什麼不給應用程序添加鎖定機制,以便用戶可以鎖定而不鎖定整個iPad? – ughoavgfhw 2011-05-31 18:20:12

+0

我需要它的情況下,當用戶保持ipad關閉,並在緊急情況或某事時消失了一段時間,ipad會自動鎖定一段時間後(由於其默認行爲)...所以爲了防止除了用戶以外的任何人解開ipad並查看應用程序中的敏感數據,我需要檢查是否爲ipad設置了密碼鎖,如果沒有,請提示用戶設置密碼鎖。 。 – learner2010 2011-05-31 20:01:09

回答

3

看看The Application Runtime Environment上的文件保護部分。文件保護要求用戶啓用密碼鎖定設置並設置有效的密碼。如果您的應用程序寫入/創建並存檔,請使用NSDataWritingFileProtectionComplete選項。如果您的應用程序不使用任何文件,則創建一個虛擬文件並啓用保護。

+1

如果密碼鎖被禁用,該怎麼辦?你是否仍然可以手動執行這個文件保護鎖定?我曾經觀看過關於安全應用程序數據的wwdc 2010,但它假設您已經設置了密碼鎖定。你如何執行這個? – fes 2011-07-14 01:08:50

+1

這不再適用。周圍的閱讀表明,它至少從iOS 5起並沒有工作。 – Simon 2014-04-02 10:07:48

9

使用iOS 8,現在有一種方法可以檢查用戶是否設置了密碼。 該代碼會崩潰在iOS 7

的Objective-C:

-(BOOL) deviceHasPasscode { 
    NSData* secret = [@"Device has passcode set?" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSDictionary *attributes = @{ (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService: @"LocalDeviceServices", (__bridge id)kSecAttrAccount: @"NoAccount", (__bridge id)kSecValueData: secret, (__bridge id)kSecAttrAccessible: (__bridge id)kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly }; 

    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL); 
    if (status == errSecSuccess) { // item added okay, passcode has been set    
     SecItemDelete((__bridge CFDictionaryRef)attributes); 

     return true; 
    } 

    return false; 
} 

斯威夫特:

func deviceHasPasscode() -> Bool { 
    let secret = "Device has passcode set?".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
    let attributes = [kSecClass as String:kSecClassGenericPassword, kSecAttrService as String:"LocalDeviceServices", kSecAttrAccount as String:"NoAccount", kSecValueData as String:secret!, kSecAttrAccessible as String:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly] 

    let status = SecItemAdd(attributes, nil) 
    if status == 0 { 
     SecItemDelete(attributes) 
     return true 
    } 

    return false 
} 
+0

這是蘋果批准? – Nil 2014-10-17 07:03:21

+1

它應該沒問題,因爲它使用的是標準鑰匙串調用。 – 2014-10-17 18:34:18

2

Xamarin.iOS解決方案適用於iOS 8 ...注意我打電話SecKeyChain.Remove(secRecord)每檢查。我發現,如果我不包括這個我能得到的設備進入它試圖與每個呼叫的用戶進行身份驗證SecKeyChain.Add(secRecord)

private bool DetectIfPasscodeIsSet() 
{ 
    var secRecord = new SecRecord (SecKind.GenericPassword) { 
     Label = "Check if passcode is set", 
     Description = "Check if passcode is set", 
     Account = "Check if passcode is set", 
     Service = "Check if passcode is set", 
     Comment = "Check if passcode is set", 
     ValueData = NSData.FromString ("Check if passcode is set"), 
     Generic = NSData.FromString ("Check if passcode is set") 
    }; 
    SecKeyChain.Remove (secRecord); 
    secRecord.AccessControl = new SecAccessControl (SecAccessible.WhenPasscodeSetThisDeviceOnly); 
    var status = SecKeyChain.Add (secRecord); 
    if (SecStatusCode.Success == status) { 
     SecKeyChain.Remove (secRecord); 
     return true; 
    } 
    return false; 
} 
+0

謝謝。我需要這個! – HansElsen 2017-01-11 12:33:26

5

由於iOS 9一個奇怪的狀態,有一個標誌LAPolicyDeviceOwnerAuthentication在LocalAuthentication框架。

+ (BOOL)isPasscodeEnabled 
{ 
    NSError *error = nil; 
    LAContext *context = [[LAContext alloc] init]; 

    BOOL passcodeEnabled = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]; 

    if(passcodeEnabled) { 
     NSLog(@"Passcode enabled."); 
     return YES; 
    } 

    NSLog(@"Passcode NOT enabled: %@", error.localizedDescription); 
    return NO; 
} 

由於iOS 8已經有另一個標誌爲是否啓用TouchID檢查:

+ (BOOL)isTouchIdEnabled 
{ 
    NSError *error = nil; 
    LAContext *context = [[LAContext alloc] init]; 

    BOOL touchIDEnabled = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]; 

    if(touchIDEnabled) { 
     NSLog(@"TouchID enabled."); 
     return YES; 
    } 

    NSLog(@"TouchID NOT enabled: %@", error.localizedDescription); 
    return NO; 
} 
相關問題