iOS 8 (OS X Yosemite) führte eine neue API/Konstante ein, um festzustellen, ob das Gerät eines Benutzers über einen Passcode verfügt.
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
kann verwendet werden, um zu erkennen, ob auf dem Gerät ein Passcode festgelegt wurde.
Die Strömung ist:
- Versuch mit diesem Attribut ein neues Element auf dem Schlüsselbund zu speichern gesetzt
- Wenn es gelingt, dass anzeigt, dass ein Zugangscode zur Zeit
- aktiviert ist Wenn das Passwort nicht der Fall ist gespeichert werden, zeigt an, dass es keinen Passcode gibt
- Bereinigen Sie das Element, denn wenn es bereits auf dem Schlüsselbund ist, wird ein "Hinzufügen" fehlschlagen, es sieht so aus, als wäre der Passcode nicht gesetzt
Ich habe dies auf meinem iPhone 5S getestet, zuerst gab es true
zurück, dann deaktivierte ich den Passcode in den Einstellungen, und es gab false
zurück.Schließlich habe ich den Passcode erneut aktiviert und gibt true
zurück. Frühere Betriebssystemversionen geben false
zurück. Der Code funktioniert im Simulator und gibt true
auf einem Computer zurück, auf dem das OS X-Kennwort festgelegt ist (ich habe keine alternativen OS X-Szenarien getestet).
Auch hier sehen Beispielprojekt: https://github.com/project-imas/passcode-check/pull/5
Schließlich meines Wissens iOS 8 nicht über eine Einstellung des Datenschutzes zu deaktivieren, so dass ich davon ausgehen, das alles, was Sie brauchen, ist die Verschlüsselung zu gewährleisten.
BOOL isAPIAvailable = (&kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly != NULL);
// Not available prior to iOS 8 - safe to return false rather than crashing
if(isAPIAvailable) {
// From http://pastebin.com/T9YwEjnL
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
};
// Original code claimed to check if the item was already on the keychain
// but in reality you can't add duplicates so this will fail with errSecDuplicateItem
// if the item is already on the keychain (which could throw off our check if
// kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly was not set)
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL);
if (status == errSecSuccess) { // item added okay, passcode has been set
NSDictionary *query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: @"LocalDeviceServices",
(__bridge id)kSecAttrAccount: @"NoAccount"
};
status = SecItemDelete((__bridge CFDictionaryRef)query);
return true;
}
// errSecDecode seems to be the error thrown on a device with no passcode set
if (status == errSecDecode) {
return false;
}
}
return false;
P.S. Wie Apple in dem WWDC-Video (711 Keychain und Authentifizierung mit Touch ID) hervorhebt, haben sie den Passcode-Status nicht absichtlich direkt über die API verfügbar gemacht, um zu verhindern, dass Apps in Situationen kommen, die sie nicht sein sollten ("Hat dieses Gerät einen Passcode? Okay, großartig, ich werde diese privaten Informationen im Klartext speichern.") Es wäre viel besser, einen Verschlüsselungsschlüssel zu erstellen, ihn unter kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
zu speichern und diese Datei zu verschlüsseln, die nicht wiederhergestellt werden kann wenn ein Benutzer sich entscheidet, seinen Passcode zu deaktivieren).
Ich würde davon ausgehen, dass die Passcode-Sperre für die laufende Anwendung irrelevant ist, also denke ich, es ist nicht Teil des SDK. Wenn es wäre, wäre es wahrscheinlich Teil dieser API: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html –
Es ist extrem relevant für eine laufende Anwendung, weil Ohne Passwort sind Ihre Daten auf dem Gerät nicht geschützt. Es wäre ein großes Versehen von Apple, wenn es nicht möglich wäre zu sagen, ob Ihre Daten geschützt sind oder nicht. Es macht die neue iOS 4-Verschlüsselung für die meisten Unternehmensanwendungen, die über den App Store verkauft werden, ziemlich nutzlos. – Mike
Die meisten Unternehmen hätten (sollten) ein Bereitstellungsprofil, das an alle iPhones der Firma gesendet wird, um den Zugangscode zu verlangen. Dies ist kein Programmproblem, dies ist ein Managementproblem. Sie möchten wirklich eine Warnung ausgeben, die dem Benutzer sagt, dass er seinen Zugangscode aktivieren soll? Oder noch besser, weigere dich zu laufen, wenn es nicht läuft? Benutzer nehmen normalerweise nicht gut zu sagen, was mit ihren Geräten zu tun ist. –