Аутентификация на Firebase и Parse
В первой и второй частях этой серии мы сравнили процесс создания приложения и интеграции фреймворков в ваш проект XCode, а также рассказали о том, как базы данных Firebase и Parse имеют схожие и различные функции, которые могут лучше подойти для вашего случая использования.
В этой третьей части мы начнем кодировать и оценим, сколько кода необходимо для того, чтобы процесс регистрации/входа в систему работал на обеих платформах.
Что мы будем строить
Поскольку обе платформы будут выполнять, по сути, одни и те же задачи, мы будем использовать абсолютно одинаковый дизайн контроллеров представления, а все элементы управления будут созданы аналогичным образом:
Главный контроллер представления будет выполнять переходы к контроллерам представления Sign-Up и Sign In, которые будут выполнять соответствующие действия.
Код Firebase
После установки Firebase SDK, как описано в первой части, нам нужно инициализировать его в нашем файле AppDelegate.swift:
import Firebase
Затем внутри метода application:didFinishLaunchingWithOptions мы должны инициализировать объект FirebaseApp, поместив следующую строку над оператором return true:
FirebaseApp.configure()
Теперь мы должны добавить код во все наши представления, которым нужна информация, приватная для подписавшегося пользователя, чтобы слушать объект FIRAuth, который будет вызываться каждый раз, когда состояние входа меняется.
Лучше всего поместить этот код в метод viewWillAppear, чтобы представление даже не загружало данные, если оно не авторизовано:
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
// Any other actions that happen upon state change can be written here
}
Также необходимо отсоединить слушателя перед тем, как мы покинем представление, поэтому в методе viewWillDisappear мы можем добавить этот код:
Auth.auth().removeStateDidChangeListener(handle!)
Регистрация новых пользователей будет осуществляться в нашем контроллере SignUpViewController, поэтому давайте добавим этот код в метод, который будет вызываться, когда пользователь нажмет кнопку Singn-Up:
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
// Code for error handling and other actions can be put here
}
Хорошая обработка ошибок для описанного выше метода выглядит следующим образом:
guard let user = authResult?.user, error == nil else {
print("ERROR CREATING USER \(user.email!).")
print(error!.localizedDescription)
return
}
print("\(user.email!) successfuly created.")
Регистрация пользователей будет осуществляться в нашем SignInViewController, когда пользователь нажмет на кнопку Sign In. Код для регистрации пользователя выглядит следующим образом:
Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
guard let strongSelf = self else { return }
// Aditional code for error handling and other actions can be put here
}
Затем мы можем получить данные пользователя после входа в систему, используя этот код:
if let user = user {
let uid = user.uid
let email = user.email
// Aditional properties can be retrieved here
}
Процесс выхода из системы осуществляется путем:
firebase.auth().signOut().then(function() {
// Sign-out successful.
}).catch(function(error) {
// An error happened.
});
Это довольно просто и понятно.
Давайте посмотрим на подход Parse:
Код Parse
Аналогично Firebase, мы начнем с установки Parse IOS SDK, как описано в части 1, затем нам нужно инициализировать его в нашем файле AppDelegate.swift:
import Parse
Поскольку Parse может быть размещен практически в любом месте, необходимо также задать App Id, ключ и URL для хоста Parse, который вы используете:
let configuration = ParseClientConfiguration {
$0.applicationId = "PASTE_YOUR_APPLICATION_ID_HERE"
$0.clientKey = "PASTE_YOUR_CLIENT_ID_HERE"
$0.server = "https://parseapi.back4app.com"
}
Parse.initialize(with: configuration)
В нашем методе viewDidAppear мы можем проверить, вошел ли пользователь в систему, чтобы отобразить данные:
let currentUser = PFUser.current()
if currentUser != nil {
// User is NOT logged in. Do not display data.
}
В нашем контроллере SignUpViewController добавим код для создания пользователя при нажатии кнопки Sign-UpController:
let user = PFUser()
user.username = signUpUsernameField.text
user.password = signUpPasswordField.text
user.signUpInBackground { (success, error) in
UIViewController.removeSpinner(spinner: sv)
if success{
// Success signing up. Display data for this user.
}else{
if let descrip = error?.localizedDescription{
// Error signing up. Do not display data and show error message.
}
}
}
Вход в систему осуществляется в нашем контроллере SignInViewController, когда пользователь нажимает кнопку Sign In:
PFUser.logInWithUsername(inBackground: signInUsernameField.text!, password: signInPasswordField.text!) { (user, error) in
if user != nil {
// User signed In. Display data.
}else{
if let descrip = error?.localizedDescription{
// User not signed in. Do not display data and show error message
}
}
}
Композицию Signing Out исполняют:
PFUser.logOutInBackground { (error: Error?) in
if (error == nil){
// Success logging out
}else{
// Error logging out. Display error message.
}
}
Заключение
Для регистрации и входа в Firebase требуется на несколько строк кода меньше, чем для Parse, но Parse может быть размещен практически в любом месте, что является огромным преимуществом, так как нет привязки к производителю.
Оба предлагают процессы регистрации, входа и выхода из системы с обработкой ошибок и простым управлением кодом.
Поэтому я не буду считать 3 или 4 строки кода преимуществом.
Я назову это ничьей.