home google funciona con buttons bar ios screen-lock parental-control

google - Detecta programáticamente si el código de acceso de iOS está habilitado o no



toolbar ios (3)

En lugar de crear un código de acceso directamente en mi aplicación y potencialmente requerir que el usuario ingrese un código de acceso dos veces (una vez para el dispositivo y otra vez para mi aplicación); Pensé que podría superarme y hacer algo como:

if (device has passcode) continue into my app else make user enter my app passcode

No quiero configurar el código de acceso del dispositivo, no quiero forzar el bloqueo de la pantalla, no cifrar nada. Lo único que quiero es una API para detectar si el código de acceso del dispositivo está vigente. Algo como:

BOOL notReally = [UIDevice isUserSlightlyMoreSecureBecauseTheySetDeviceLockOn];

O tal vez si me siento con suerte:

BOOL isPasscodeEnabled = [UIDevice isPasscodeEnabled]; BOOL isSimplePasscode = [UIDevice isSimplePasscode]; NSInteger minutes = [UIDevice requirePasscodeAfter];

Supongo que no se basa en esta pregunta (pero tiene algunos años) " compruebe programáticamente el Código de acceso del iPhone en el paquete de configuraciones " o esta podría ser la respuesta; " Lock Unlock events iphone ", que no es exactamente lo que quiero, pero podría funcionar "después del hecho".


Actualizar

A partir de iOS 9, puede lograrlo utilizando LocalAuthentication.framework . Si se dirige a iOS 9+, lea los comentarios here o mire esta respuesta .

Si todavía necesitas apuntar a iOS 8, continúa leyendo :)

A partir de iOS8, puedes!
He creado una categoría simple para verificar fácilmente el estado: https://github.com/liamnichols/UIDevice-PasscodeStatus

Cómo funciona

Esta categoría funciona mediante el uso de las nuevas funciones de accessControl agregadas a Security.Framework en iOS 8. Intenta agregar un elemento al llavero mediante el nivel de protección kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly .

La documentación establece lo siguiente:

Solo se puede acceder a los datos del elemento mientras el dispositivo está desbloqueado. Esta clase solo está disponible si se establece un código de acceso en el dispositivo. Se recomienda para los elementos que solo necesitan ser accesibles mientras la aplicación está en primer plano. Los elementos con este atributo nunca migrarán a un nuevo dispositivo, por lo tanto, después de que una copia de seguridad se restaure en un nuevo dispositivo, estos elementos faltarán. No se pueden almacenar artículos en esta clase en dispositivos sin un código de acceso. Al deshabilitar el código de acceso del dispositivo, se eliminarán todos los elementos de esta clase.

Debido a esto, se devuelve un error cuando intenta agregar o leer un elemento en el llavero con este nivel de accessControl. Si vemos este error, el passcodeStatus regresa como LNPasscodeStatusDisabled . Si podemos leer o escribir correctamente en el llavero con este nivel de accessControl, devolvemos LNPasscodeStatusEnabled .

Si el dispositivo no es compatible o si se devuelve un error no relacionado con el llavero, devolvemos LNPasscodeStatusUnknown .


No tengo conocimiento de ninguna forma de obtener esta información directamente, sin embargo, creo que probablemente pueda lograr el resultado que busca utilizando los efectos secundarios del soporte de Apple para el cifrado de discos. Consulte Protección de datos mediante el cifrado en disco para obtener más información.

Sin embargo, se trata de un comportamiento de pirateo en lugar de diseñado, y hay algunos casos de esquinas de los que no será consciente. Recomiendo hacer de esta característica algo que esté explícitamente bajo el control del usuario en lugar de algo que habilite con heurísticas.


Para iOS 9+, puede detectarlo utilizando la nueva clase LocalAuthentication , y funciona tanto en el simulador como en los dispositivos:

import LocalAuthentication private func devicePasscodeSet() -> Bool { //checks to see if devices (not apps) passcode has been set return LAContext().canEvaluatePolicy(.DeviceOwnerAuthentication, error: nil) }