Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Firebase - это кросс-платформенная платформа мобильной базы данных в режиме реального времени, которая позволяет программисту сосредоточиться на том, что они лучше всего пишут в своих приложениях, - не беспокоясь о проблемах с DevOps, таких как инфраструктура сервера и моделирование базы данных. Firebase, опираясь на Google, берет на себя сложность в работе с базами данных реального времени, аутентификацией пользователей и работой с автономными рабочими процессами синхронизации.
Хотя для BaaS существует множество решений, таких как Realm (ознакомьтесь с моим руководством по Realm.io здесь, на Envato Tuts +). Firebase не требует настройки конфигурации сервера инфраструктуры, поскольку платформа заботится о хостинге и в свою очередь предоставляет SDK.
Помимо NoSQL базы данных в режиме реального времени, с Firebase вы получаете аналитику, отчеты о сбоях, аутентификацию пользователей, облачные сообщения, push-уведомления и многое другое. Связанные с этим затраты также зависят от вашего проекта: по мере роста вы переходите от модели freemium к модели для каждого использования.
В этом уроке я покажу вам, как настроить Firebase на iOS с помощью CocoaPods и как аутентифицировать пользователей, используя два популярных метода: электронную почту и пароль или через телефон с помощью SMS.
Чтобы узнать о Firebase для Android, ознакомьтесь с некоторыми нашими другими учебниками здесь, на Envato Tuts +.
Ваше первое приложение Firebase
Предпосылки
Вам понадобится следующее:
Предполагаемые знания
В этом учебнике предполагается, что у вас есть рабочее знание iOS и Swift, а также некоторый базовый опыт работы с CocoaPods. Если вам нужно узнать больше, ознакомьтесь с нашими учебниками Swift и учебниками CocoaPods.
Цели этого учебника
В конце этого урока вы начнете с простого приложения Firebase, которое использует Firebase SDK для аутентификации пользователей, используя электронную почту и пароль, а также через SMS. По пути вы узнаете о:
- Настройка Firebase с помощью CocoaPods
- Настройка делегата приложения для подключения к Firebase
- Настройка прав доступа для аутентификации пользователя Text/SMS
- Использование FirebaseUI для аутентификации пользователей
В будущих учебниках этой серии вы научитесь работать с другими аспектами платформы Firebase, такими как использование базы данных в реальном времени для хранения данных приложений.
Настройка проекта
В этой серии мы собираемся создать приложение to-do под названием FirebaseDo. Начнем с клонирования проекта с GitHub:
$ git@github.com:tutsplus/get-started-with-firebase-authentication-for-ios.git ... $ git fetch --all --tags ... $ git checkout tags/START
Затем мы собираемся инициализировать проект для создания нового PodFile следующим образом:
pod init
Вы должны увидеть новый файл под именем Podfile, расположенный в корневой директории вашего проекта. Этот файл в основном устанавливает библиотеки, которые мы хотим использовать в нашем проекте. Откройте его и добавьте следующие строки определения Firebase:
pod 'FirebaseUI' Pod 'Firebase'
Сохраните, а затем введите в своем терминале следующее:
pod install
Мы будем использовать FirebaseDo.xcworkspace вместо FirebaseDo.xccodeproj, позволяя нам работать с библиотеками зависимостей, которые мы настраиваем на CocoaPods, поэтому заходим и открываем рабочее пространство, а затем переключаемся в ваш браузер.
Теперь перейдите на панель Firebase и создайте новый проект:

Затем нажмите «Добавить Firebase» в приложение iOS, после чего вы будете шаг за шагом проходить процесс регистрации вашего приложения в Firebase.

В какой-то момент вас попросят добавить файл GoogleService-info.plist в ваш проект Xcode:

Вы уже добавили библиотеки через CocoaPods, поэтому вы можете пропустить оставшиеся инструкции и вернуться в консоль Firebase.
Аутентификация пользователей
Firebase Authentication предоставляет базовые службы, простые в использовании SDK и готовые библиотеки пользовательского интерфейса для аутентификации пользователей в вашем приложении. Он поддерживает аутентификацию с использованием паролей, телефонных номеров, популярных провайдеров идентификации, таких как Google, Facebook и Twitter, и многое другое. (Источник: Аутентификация Firebase)
Прежде чем мы покажем, как использовать FirebaseUI для автоматизации аутентификации ваших пользователей, мы сначала рассмотрим методы SDK, которые Firebase предоставляет как часть API-интерфейсов FirebaseAuth Framework для управления созданием и входом пользователей вручную.
Зарегистрироваться, войти и выйти из системы
Чтобы создать нового пользователя, вы должны использовать блок метода Auth.auth().CreateUser()
следующим образом:
Auth.auth().createUser(withEmail: email, password: password) { (user, error) in // ... }
Предполагая, что объект error
равен нулю, пользователь будет не только успешно зарегистрирован, но и будет так же залогинен. Чтобы явно войти под существующим пользователем, вы должны вызвать:
Auth.auth().signIn(withEmail: email, password: password) { (user, error) in // ... }
Выйти из системы так же просто вызовите try! FirebaseAuth.signOut()
:
do { try firebaseAuth.signOut() } catch let signOutError as NSError { print ("Error signing out: %@", signOutError) }
Мы хотим иметь возможность изящно обрабатывать различные потенциальные ошибки, если вызовы аутентификации сбиваются с пути, а когда объект error
не равен нулю (или наоборот, объект user
равен нулю), произошла ошибка. Обратитесь к документации Firebase за списком всех распространенных кодов ошибок. В нашем коде мы рассмотрим лишь несколько общих ошибок.
Управление изменениями состояния аутентификации
На протяжении всего жизненного цикла приложения состояние аутентификации изменится, поэтому возможность обнаруживать, когда пользователь прошел аутентификацию или срок действия сессии, имеет важное значение для обеспечения того, чтобы пользователи не имели доступа к частям вашего приложения, к которым они не должны обращаться.
Создав обработчик, .addStateDidChangeListener
, вы теперь можете определить, в каком состоянии находится пользователь, и инициировать определенный вызов на основе этого.
handle = Auth.auth().addStateDidChangeListener { (auth, user) in // ... }
Управление пользователями
После аутентификации пользователя вы можете получить доступ к объекту user
и получить информацию о пользователе, такую как идентификатор пользователя, адрес электронной почты и аватар с фотографией (если предоставлено). Следующий метод также будет проверять, что пользователь действительно аутентифицирован, когда объект user
не равен нулю:
if Auth.auth().currentUser != nil { // User is signed in. let uid = user.uid let email = user.email let photoURL = user.photoURL // ... } else { // User is not signed in }
Отправка пользователям email
Firebase обеспечивает отличную поддержку для верификации по email или отправки запроса на сброс пароля на emai.
Auth.auth().currentUser?.sendEmailVerification { (error) in // ... } Auth.auth().sendPasswordReset(withEmail: email) { (error) in // ... }
Анонимные пользователи
Firebase также имеет возможность управлять анонимным рабочим процессом проверки подлинности, который по существу является временной учетной записью, которая может использоваться для аутентификации пользователей и предоставления им ограниченного доступа. Идея в том что в определенный момент времени, анонимные пользователи могут зарегистрироваться, и Firebase может предоставить мост для связывания своих анонимных учетных записей с их учетными данными без потери данных, сохраняющихся во время анонимных состояний. Чтобы войти как анонимный пользователь, вы должны вызвать:
Auth.auth().signInAnonymously() { (user, error) in // ... }
Чтобы перевести пользователя с анонимной учетной записи на аутентифицированную учетную запись (используя электронную почту и пароль), вы вызываете следующий метод в контроллере просмотра экрана регистрации, запрашиваете адрес электронной почты и пароль, а затем вызываете метод user.link()
.
let credential = EmailAuthProvider.credential(withEmail: email, password: password) user.link(with: credential) { (user, error) in // ... }
Firebase также поддерживает методы для других механизмов аутентификации.
Итак мы рассмотрели важные методы API, которые Firebase предоставили для обработки и проверки подлинности пользователей. Несмотря на то, что код, который я показал вам не выглядит особо сложным, Firebase делает его еще проще, чем при использовании FirebaseUI. Во второй половине этого урока мы добавим аутентификацию в наше пробное приложение.
Реализация FirebaseUI
FirebaseUI предоставляет автоматическое решение, которое обрабатывает потоки пользовательского интерфейса для входа пользователями с адресами электронной почты и паролями, номерами телефонов и с популярными поставщиками авторизации, включая вход в систему Google и вход в систему Facebook.
Затем мы продемонстрируем, как реализовать аутентификацию с помощью FirebaseUI.
В консоли Firebase перейдите на вкладку «Аутентификация» и включите следующие способы аутентификации:
- Пароль от электронной почты
- Телефон

Мы только что видели, как управлять и аутентифицировать пользователей вручную, используя доступные Firebase SDK. Теперь мы рассмотрим, как позволить FirebaseUI сделать всю тяжелую работу за нас. В HomeViewController.swift импортируйте следующие библиотеки:
import UIKit import Firebase import FirebaseAuthUI import FirebasePhoneAuthUI
В декларации UIViewController.swift
добавьте FUIAuthDelegate
:
class HomeViewController: UIViewController, FUIAuthDelegate { ...
Ниже этого объявления класса мы собираемся объявить три частные переменные, с которыми мы будем работать. Это позволит нам ссылаться на наш текущий объект аутентификации, экземпляр AuthUI и наши слушатели аутентификации, соответственно:
fileprivate(set) var auth:Auth? fileprivate(set) var authUI: FUIAuth? //only set internally but get externally fileprivate(set) var authStateListenerHandle: AuthStateDidChangeListenerHandle?
Затем давайте подключим наш контроллер просмотра так, чтобы при первом загрузке мы подключили слушателя, чтобы с помощью обработчика определить, когда состояние аутентификации изменяется. Когда состояние auth изменяется, мы вызываем метод self.loginAction (sender: self)
, чтобы вызвать наш контроллер проверки подлинности FirebaseUI.
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.auth = Auth.auth() self.authUI = FUIAuth.defaultAuthUI() self.authUI?.delegate = self self.authUI?.providers = [FUIPhoneAuth(authUI: self.authUI!),] self.authStateListenerHandle = self.auth?.addStateDidChangeListener { (auth, user) in guard user != nil else { self.loginAction(sender: self) return } } }
В этом методе мы также устанавливаем приватные переменные, которые мы объявили ранее, установите делегат authUI
в наш собственный класс и, наконец, установите список других поставщиков, которые мы будем поддерживать, что в нашем случае будет FUIPhoneAuth
.
Если мы хотим поддерживать Google, Facebook или других сторонних поставщиков, мы можем добавить их в этот список. Также обратите внимание: нам не нужно явно указывать адрес электронной почты и пароль, поскольку он неявный, при условии, что он включен в консоли Firebase.
Отображение входа в систему
Затем мы обрабатываем метод loginAction()
, который вызывается в том случае, если слушатель событий определяет, что пользователь в настоящее время не аутентифицирован. Все, что нам нужно сделать в этом случае, представляет собой modhUI.authViewController
modal FirebaseUI, и он будет включать связанные поставщики аутентификации, которые мы объявили ранее.
Здесь начинается волшебство, так как FirebaseUI обрабатывает все: просит пользователя ввести свой адрес электронной почты, определяет, существует ли пользователь (в этом случае у пользователя будет запрошен пароль) или для нового пользователя, запросит их имя и назначение пароля.
@IBAction func loginAction(sender: AnyObject) { // Present the default login view controller provided by authUI let authViewController = authUI?.authViewController(); self.present(authViewController!, animated: true, completion: nil) }
Если бы мы вручную применяли методы аутентификации, нам нужно было бы обрабатывать все эти разные сценарии, включая сброс пароля электронной почты и т.д.
Обработка изменений состояния Auth
Наконец, мы реализуем требуемый протокол для нашего делегата FIRAuthUIDelegate
, который позволит нам прослушивать и обрабатывать состояния аутентификации. Этот метод будет действовать только в том случае, если ошибка действительно произошла, но мы можем даже обрабатывать успешные аутентификации.
// Implement the required protocol method for FIRAuthUIDelegate func authUI(_ authUI: FUIAuth, didSignInWith user: User?, error: Error?) { guard let authError = error else { return } let errorCode = UInt((authError as NSError).code) switch errorCode { case FUIAuthErrorCode.userCancelledSignIn.rawValue: print("User cancelled sign-in"); break default: let detailedError = (authError as NSError).userInfo[NSUnderlyingErrorKey] ?? authError print("Login error: \((detailedError as! NSError).localizedDescription)"); } }
Настройка аутентификации телефона
Прежде чем мы закончим приложение, нам нужно добавить еще несколько шагов, чтобы иметь возможность обрабатывать аутентификацию на основе телефона. Аутентификация телефона позволяет пользователям вводить свои номера телефонов и проверяет их личность посредством SMS-сообщения, которое включает одноразовый код.
Чтобы получить токен APN, необходимый серверу Firebase, выполните следующее в файле AppDelegate.swift:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // Pass device token to auth Auth.auth().setAPNSToken(deviceToken, type: .prod) }
Поскольку мы уже включили регистрацию номера телефона в консоли Firebase, наша следующая задача - предоставить FirebaseDo для получения APN из Firebase - задачи, которую вы также будете делать, если хотите поддерживать push-уведомления. В этом случае, однако, Firebase отправит на устройство тихое push-уведомление, чтобы подтвердить запрос на ввод номера телефона.
Вы не сможете протестировать этот метод аутентификации с помощью Xcode Simulator, скорее вам нужно будет подключить ваш iPhone для установки и запуска приложения.
В Xcode перейдите в «Возможности» и включите Push-уведомления. Приложение автоматически предоставит и создаст файл FirebaseDo.entitlements, как показано в навигаторе проекта.

Затем мы создадим ключ аутентификации Apple Push Notification для загрузки в Firebase. На портале разработчиков Apple в разделе «Ключи» введите название своего проекта, указав флажки APN. Загрузите полученный файл .p8 и обратите внимание на идентификатор ключа, который нам нужно будет ввести в ближайшее время.

Вернитесь в консоль Firebase и в разделе «Настройки проекта» (значок шестеренки) выберите вкладку «Облачные сообщения». В разделе «Конфигурация приложения App Store» и «APNs Authentication Key» выберите кнопку «Загрузить» и загрузите файл .p8 вместе с идентификатором ключа и идентификатором приложения. В результате экран настроек должен выглядеть следующим образом:

Тестирование приложения
И это все - нам не нужно было добавлять очень много дополнительного кода в наше приложение, чтобы настроить его для полного процесса регистрации и входа в систему. Давайте создадим и запустим приложение в Xcode, чтобы увидеть FirebaseUI в действии. При первом запуске приложения вы не будете аутентифицированы, поэтому вы получите шаблон общего назначения с параметрами проверки подлинности, которые вы выбрали в консоли Firebase.

Это выглядит слегка сыро, но вы можете настроить практически все аспекты шаблона.

Ввод нового адреса электронной почты пользователя приведет к экрану «Создать учетную запись», в котором будет указано ваше имя и пароль.

Заполнив эту форму, вы зарегистрируетесь как новый пользователь (хотя наше приложение будет отображать только пустой экран). Чтобы подтвердить, что новый пользователь был создан, вы можете перейти в «Аутентификация»> «Пользователи» в вашей Firebase Console.
Проверьте каждый из методов проверки подлинности, помня, что вам нужно будет выйти из системы, чтобы повторно запустить запрос проверки подлинности. Повторно активируйте auth, добавив следующий код в качестве первой строки в viewDidLoad()
после вызовите:
try firebaseAuth.signOut()
Это заставит приложение вернуться в исходное состояние, чтобы вы могли протестировать аутентификацию с помощью SMS. Запустите приложение еще раз, на этот раз выбрав «Войти с телефоном».
Заключение
В этом уроке вы познакомились с использованием Firebase в качестве базовой платформы для своего приложения, и вы узнали, как аутентифицировать пользователей, используя традиционную комбинацию электронной почты и пароля, а также через телефон и SMS, подход, ставший популярным благодаря таким приложениям Как WhatsApp.
Затем мы приступили к созданию нашего простого приложения FirebaseDo, и хотя оно еще не выполняет никаких функций напоминания, мы начнем работать над этим в следующем учебном пособии. Но всего за несколько строк нам удалось выполнить следующее:
- Встроенная Firebase для настройки механизма аутентификации для электронной почты и пароля
- Добавлена возможность аутентификации через SMS
- Отслеживаемые состояния аутентификации
- Грамотно обрабатывать ошибки
В оставшейся части серии вы познакомитесь с некоторыми другими компонентами Firebase.
И пока вы здесь, обязательно ознакомьтесь с некоторыми другими нашими статьями по разработке приложений для iOS!
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post