В магазине приложений находится несколько тысяч приложений, содержащих пользовательские данные. Вплоть до iOS 8 не было много способов обеспечить безопасность этих данных без использования опций, найденных в сторонних API.
Apple признала необходимость доступной и надежной безопасности в iOS, и начиная с появления iOS 7 и iPhone 5S Touch ID, она не только более безопасна, чем другие альтернативы, но и намного проще и удобнее для конечного пользователя.
Сегодня мы рассмотрим, как интегрировать Touch ID в ваше собственное приложение.
Локальная аутентификация
Touch ID и его API управляются платформой локальной аутентификации , которая была доступна в iOS 8. С ее помощью вы можете оценить конкретные политики безопасности для пользователя устройства. Прямо сейчас эта структура содержит только один открытый класс — LAContext
Как следует из названия, вся аутентификация строго зависит от устройства и его пользователя. Существует много сценариев, когда пользователь захочет пройти аутентификацию на устройстве. Обычное использование будет, когда пользователь пытается купить приложения в магазине приложений.
LAContext — движущая сила Touch ID
LAContext
Поддерживаемые типы аутентификации находятся внутри перечисления LAPolicy
DeviceOwnerAuthenticationWithBiometrics
Сохранение этого единственного значения в перечислении делает его масштабируемым, поэтому, возможно, Apple будет использовать его для будущих типов локальной аутентификации в дополнение к Touch ID.
В LAContext
LAError
Когда процесс аутентификации сталкивается с проблемой, это будет одна из ошибок, представленных внутри LAError
Давайте посмотрим, что это такое:
- AuthenticationFailed : неверные учетные данные.
- UserCancel : пользователь отменил аутентификацию.
- UserFallback : пользователь выбрал метод отката , т.е. введите пароль.
- SystemCancel : iOS отменила аутентификацию.
- PasscodeNotSet : пользователь не установил системный 4-значный пароль.
- TouchIDNotAvailable : устройство не поддерживает Touch ID.
- TouchIDNotEnrolled : пользователь не настроил Touch ID.
Рабочий процесс аутентификации
Теперь, когда мы знаем, какую инфраструктуру и объект использовать, давайте обсудим рабочий процесс аутентификации.
Первое, что нам нужно сделать, это выбрать политику для аутентификации. После этого мы спрашиваем iOS, можно ли оценить эту политику. Это обеспечивает предварительную проверку подлинности для повышения эффективности, поскольку нет причин продолжать ее, если у системы нет шансов на успешную проверку подлинности.
Далее происходит фактическая аутентификация. Независимо от результата, закрытие будет выполнено. Я покажу вам пример этого в ближайшее время. Если аутентификация не прошла, iOS сначала оценивает, может ли быть предпринята другая попытка. Например, это может произойти, если не удалось правильно прочитать отпечаток пальца и появилось сообщение «Попробуйте еще раз».
Если контекст аутентификации не допускает многократных попыток, объект NSError
Также будет установлено его свойство localizedDescription
LAError
Вы можете посмотреть на свойство code
LAError
Эта блок-схема суммирует весь рабочий процесс:
Настройка проекта
Откройте Xcode и создайте новый проект. Мы будем использовать шаблон приложения с одним представлением. На следующем экране обязательно выберите Swift в качестве языка программирования и соответствующим образом назовите проект.
Этот шаблон дает нам самое необходимое для запуска приложения. Мы будем иметь дело только с ViewController.swift
Main.storyboard
Мы начнем с создания простого пользовательского интерфейса, чтобы показать, была ли аутентификация успешной. Откройте раскадровку сейчас, чтобы начать.
Пользовательский интерфейс
Сначала мы вставим включенный контроллер представления в контроллер навигации. В инспекторе объектов перетащите «Контроллер навигации» и поместите его в раскадровку. Поместите это прямо под существующим контроллером представления.
Теперь выберите контроллер корневого представления в инспекторе документов и нажмите клавишу удаления. По умолчанию Xcode предоставляет нам контроллер табличного представления в качестве корневого контроллера представления. Мы просто хотим работать с пустым холстом для нашего пользовательского интерфейса.
Затем, Ctrl + перетащите контроллер навигации в контроллер представления по умолчанию и отпустите. Выберите «контроллер корневого представления», как показано ниже:
Наконец, убедитесь, что отправной точкой является наш недавно добавленный навигационный контроллер. Чтобы изменить его, щелкните контроллер навигации, откройте инспектор атрибутов и проверьте «Is Initial View Controller»:
Ваш навигационный контроллер должен иметь черную стрелку, указывающую на это так:
Затем нажмите «Элемент навигации» корневого контроллера представления в схеме документа. В инспекторе атрибутов измените заголовок на «Touch ID Demo»:
Настройка кнопок
С этого момента мы будем иметь дело только с контроллером корневого представления для пользовательского интерфейса.
Теперь перетащите кнопку на контроллер вида. Дважды щелкните по нему и измените его текст на «Аутентификация». Откройте инспектор размера и измените следующие значения на:
-X: 266
-Y: 189
-Ширина: 149
-Высота: 30
Настройка ярлыка
Затем перетащите метку под кнопку. Измените его текст на «Результат аутентификации», а его шрифт на стиль «Заголовок». При этом используется динамический текст, и хотя пользовательский интерфейс здесь не важен, хорошо бы начать привычку включать адаптивные методологии проектирования в ваш рабочий процесс.
Для его размера и координат используйте эти значения:
-X: 186
-Y: 273
-Ширина: 229
-Высота: 20
Теперь перетащите еще один ярлык. Поскольку это будет показывать результаты аутентификации, просто установите текст в пустую строку («») и его стиль шрифта в «Тело». Мы хотим, чтобы это располагалось прямо под меткой «Результат аутентификации», поэтому установите его размер и координаты следующим образом:
-X: 121
-Y: 312
-Ширина: 358
-Высота: 218
Что касается ограничений, мы позволим Xcode добавить их для нас. Выберите любую метку или кнопку на контроллере вида, нажмите кнопку «Resolve Auto Layout» внизу, а затем нажмите «Сбросить до рекомендованных ограничений» в разделе «Все виды в контроллере вида».
Аутлет-ауты и акции
Когда пользователь нажмет на кнопку, которую мы добавили ранее, мы начнем процесс аутентификации. Когда он закончится, пустая метка будет обновлена с результатом. Для этого нам понадобится IBAction
IBOutlet
Нажмите кнопку на раскадровке и включите помощник редактора. Ctrl + перетащите с кнопки в ViewController.swift
viewDidLoad
Настройте IBAction
Выполните те же шаги для пустой метки, вместо этого выберите «Outlet» для соединения и назовите его «lblAuthResult».
Выполнение аутентификации Touch ID
Как упоминалось ранее, нам нужно будет импортировать инфраструктуру локальной аутентификации, чтобы предоставить нам доступ к классу LAContext
Для этого откройте ViewController.swift и импортируйте его прямо под UIKit:
import LocalAuthentication
Далее мы напишем служебную функцию, которая позаботится об обновлении метки, к которой мы только что добавили розетку. Когда аутентификация завершена, эта метка будет отображать красный текст, если что-то пошло не так, и зеленый текст, если аутентификация прошла успешно. Добавьте следующий код в любом месте ViewController.swift
func writeOutAuthResult(authError:NSError?)
{
dispatch_async(dispatch_get_main_queue(), {() in
if let possibleError = authError
{
self.lblAuthResult.textColor = UIColor.redColor()
self.lblAuthResult.text = possibleError.localizedDescription
}
else
{
self.lblAuthResult.textColor = UIColor.greenColor()
self.lblAuthResult.text = "Authentication successful."
}
})
}
Эта функция довольно проста в использовании. Каждый раз, когда мы выполняем аутентификацию, мы вызываем эту функцию, чтобы сообщить пользователю, каков был результат. Если аутентификация не NSError
dispatch_async()
Если это не так, что-то пошло не так, и мы наполним ярлык ошибкой.
Одна вещь, на которую следует обратить внимание, это использование грандиозной центральной диспетчеризации . Поскольку любой код, выполняемый при успешной или неудачной аутентификации, будет находиться в другом потоке, мы продвигаем код внутри этой функции для запуска в основном потоке. Если вы удалите beginTouchIDCheck()
Теперь мы добавим логику аутентификации Touch ID в @IBAction func beginTouchIDAuthCheck()
{
let authContext:LAContext = LAContext()
var error:NSError?
//Is Touch ID hardware available & configured?
if(authContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error:&error))
{
//Perform Touch ID auth
authContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "Testing Touch ID", reply: {(wasSuccessful:Bool, error:NSError?) in
if(wasSuccessful)
{
//User authenticated
self.writeOutAuthResult(error)
}
else
{
//There are a few reasons why it can fail, we'll write them out to the user in the label
self.writeOutAuthResult(error)
}
})
}
else
{
//Missing the hardware or Touch ID isn't configured
self.writeOutAuthResult(error)
}
}
Добавьте этот код, и я объясню, как он работает дальше:
LAContext
Первое, что мы делаем, это получаем контекст аутентификации, инициализируя экземпляр NSError
Эта функция аутентификации будет ожидать указатель на error
canEvaluatePolicy
Затем мы вызываем функцию error
Знак «&» перед параметром evaluatePolicy
Это работает так же, как и в C #. Если возникает ошибка, объект ошибки будет инициализирован с соответствующей информацией.
Если мы можем оценить данную политику, вызывается метод definePolicy, и мы приводим причину, кратко объясняющую, почему мы просим выполнить аутентификацию. Закрытие, которое мы включили, — то, что будет называться, как только оценка будет завершена.
Отсюда вы хотите предпринять конкретные действия в зависимости от результата. Если это было успешно, как отмечено логическим параметром, вы, вероятно, позволили бы пользователю «продолжить» что-либо (то есть разблокировать файл, выполнить вход, удалить данные и т. Д.).
Если что-то пошло не так, скорее всего, вы предпримите определенные действия в зависимости от ошибки. В любом случае, в этом примере мы просто записываем результат на этикетку. Я добавил несколько подробных комментариев, чтобы показать, где вы хотели бы предпринять более конкретные действия.
Это завершает все кодирование, необходимое для интеграции Touch ID в ваше приложение. Если вам нужен полный исходный код для завершенного проекта, вы можете найти его на GitHub.
Вывод
Платформа локальной аутентификации чрезвычайно проста в использовании. Кроме того, если удовлетворяет очень важная потребность — обеспечить безопасность данных пользователя. Раньше разработчик полагался на создание выполнимой формы аутентификации для приложения, но теперь самый распространенный метод аутентификации во всей iOS доступен для любого разработчика, который хочет его использовать.
Для чего вы планируете использовать локальную аутентификацию? Социальный вход, доступ к данным или что-то более креативное? Обязательно сообщите нам об этом в комментариях ниже, и, как всегда, спасибо за чтение!