If you spent any time building apps for the Enterprise or business space odds are you have turn into the requirement to check if the device has a passcode enabled.
Mobile Device Management (MDM) Solutions are full of tools that handle this for you. More often I’m finding that organizations are opting for lighter weight solutions to simplify their deployments.
The approach of checking for a passcode would easily become an anti-pattern in that the user at anytime can disable this feature. I would recommend keeping this in mind and implement the check as only one part of a larger more comprehensive security strategy.
I would call the approach of checking for a passcode somewhat of an anti-pattern in that the user could disable this feature at anytime. If you implement this approach I would highly recommend that this is only one part of your security strategy.
Starting in iOS 8 you could finally check, without jailbreaking, if the device had a passcode set. All you have to do is create a new Keychain entry using the new kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly access option.
Below is an example of using the Keychain to test if the device passcode is enabled.
Then in iOS 9 Apple introduced a much better way to perform this check. In the same way you check if Touch ID is enabled you can check if the device has a passcode.
Below is an example on how you can do this using canEvaluatePolicy.
The below PasscodeUtils.swift combines the two approaches to allow for you to support this functionality back to iOS 8.