
Firebas e是一个跨平台的实时移动数据库平台,它使编码人员可以专注于自己最擅长的事情-对应用程序进行编码-而不必担心服务器基础结构和数据库建模等DevOps问题。 在Google的支持下,Firebase消除了处理后端实时数据库,对用户进行身份验证以及使用脱机同步工作流的复杂性。
尽管有很多针对BaaS的解决方案,例如Realm(请在Envato Tuts +上查看我的Realm.io教程 ),但Firebase不需要任何先前的基础架构服务器配置,因为该平台负责托管,并且相应地公开了SDK 。
除了NoSQL实时数据库之外,借助Firebase,您还可以获得分析,崩溃报告,用户身份验证,云消息传递,推送通知等等。 在相关的费用 š规模也与您的项目,随着你的成长,你从一个免费增值模式移动到每个使用模型。
在本教程中,我将向您展示如何使用CocoaPods在iOS上设置Firebase,以及如何使用两种流行的方法对用户进行身份验证:电子邮件和密码,或通过带有SMS的电话。
您的第一个Firebase应用
先决条件
您将需要以下内容:
假设知识
本教程假定您具有iOS和Swift的工作知识,并且具有一些CocoaPods的基本经验。 如果您需要了解更多信息,请查看我们的Swift教程和CocoaPods教程 。
本教程的目标
在本教程结束时,您将开始使用基于Firebase的简单应用程序,该应用程序使用Firebase SDK通过电子邮件和密码以及SMS来对用户进行身份验证。 在此过程中,您将了解:
- 使用CocoaPods设置Firebase
- 设置应用程序代理以连接到Firebase
- 设置Text / SMS用户身份验证的配置权利
- 使用FirebaseUI轻松验证用户身份
在本系列的后续教程中,您将学习使用Firebase平台的其他方面,例如使用实时数据库存储应用程序数据。
设置项目
在本系列中,我们将构建一个名为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:
pod install
我们将使用FirebaseDo.xcworkspace而不是FirebaseDo.xccodeproj ,从而使我们能够使用在CocoaPods上设置的依赖库,因此继续打开工作区,然后切换到浏览器。
现在转到Firebase面板并创建一个新项目:

接下来,点击添加Firebase到您的iOS应用程序 ,然后它将逐步引导您完成在Firebase上注册应用程序的过程。

在某个时候,它将指示您将GoogleService-info.plist文件添加到您的Xcode项目中:

您已经通过CocoaPods添加了库,因此您可以跳过其余的说明并返回Firebase控制台。
验证用户
Firebase身份验证提供后端服务,易于使用的SDK和现成的UI库,以对您的应用程序的用户进行身份验证。 它支持使用密码,电话号码,流行的联合身份提供者(例如Google,Facebook和Twitter等)进行身份验证。 (来源: 火力地堡Authenticatio Ñ )
在演示如何使用FirebaseU I自动执行对用户的身份验证之前,我们将首先探讨Firebase作为FirebaseAuth Framework Reference AP I的一部分公开的SDK方法,以手动处理用户的创建和登录。
注册,登录和注销用户
要创建新用户,可以使用Auth.auth().createUser()
方法块,如下所示:
Auth.auth().createUser(withEmail: email, password: password) { (user, error) in
// ...
}
假设error
如果对象为nil,则不仅将成功注册用户,还将登录。要显式登录现有用户,您可以调用:
Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
// ...
}
注销用户就像调用try! FirebaseAuth.signOut()
一样简单try! FirebaseAuth.signOut()
try! FirebaseAuth.signOut()
:
do {
try firebaseAuth.signOut()
} catch let signOutError as NSError {
print ("Error signing out: %@", signOutError)
}
我们希望能够优雅地处理各种潜在的错误,以防身份验证调用误入歧途,并且当error
对象不为nil(或相反, user
对象为nil)时,发生了错误。 咨询火力地堡documentatio ñ所有常见的错误代码的列表。 在我们的代码中,我们将仅处理一些常规错误。
管理身份验证状态更改
在应用程序的整个生命周期中,身份验证状态都会改变,因此能够检测用户何时进行身份验证或会话已过期,对于确保用户无法访问不应访问的应用程序部分至关重要。
通过创建处理程序.addStateDidChangeListener
,您现在可以检测用户所处的状态并基于该状态触发特定的调用。
handle = Auth.auth().addStateDidChangeListener { (auth, user) in
// ...
}
管理用户
在用户进行身份验证之后,您可以访问user
对象并获取用户信息,例如用户的ID,电子邮件地址和头像(如果提供)。 以下方法还将断言该用户当前确实已通过不为nil的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
}
给用户发送电子邮件
Firebase为向用户发送电子邮件验证或密码重置请求电子邮件提供了出色的支持。
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还支持其他联合身份验证机制的方法。
到此为止,我们已经了解了Firebase提供的用于处理和验证用户的重要API方法。 尽管我向您展示的代码一点也不复杂,但是Firebase通过引入FirebaseU I使它比这更容易。 在本教程的后半部分,我们将向示例待办事项应用程序添加身份验证。
实施FirebaseUI
FirebaseU I提供了一种嵌入式身份验证解决方案,该解决方案可处理UI流程,以使用电子邮件地址和密码,电话号码以及流行的联合身份提供商(包括Google登录和Facebook登录)登录用户。
接下来,我们将演示如何使用FirebaseUI实现身份验证。
在Firebase控制台中,转到“ 身份验证”标签,然后启用以下身份验证模式:
- 电子邮件/密码
- 电话

我们刚刚看到了如何使用可用的Firebase SDK手动管理和验证用户。 现在,我们将看到如何让FirebaseU 我为我们完成所有繁重的工作。 在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?
接下来,让我们连接View Controller,以便在第一次加载View Controller时,我们连接一个侦听器以使用处理程序检测身份验证状态何时更改。 当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()
方法,该方法将在事件侦听器确定用户当前未通过身份验证的情况下调用。 在这种情况下,我们需要做的就是呈现authUI.authViewController
模态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)
}
如果我们要手动实施身份验证方法,则需要处理所有这些不同的情况,包括电子邮件密码重置等。
处理身份验证状态更改
最后,我们为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消息来验证其身份。
要获取Firebase服务器所需的APNs令牌,请在AppDelegate.swift文件中实施以下操作:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// Pass device token to auth
Auth.auth().setAPNSToken(deviceToken, type: .prod)
}
正如我们已经启用的电话号码登录在火力地堡控制台,我们的下一个任务是提供FirebaseDo接收APN 小号 ,如果你想在普遍支持推送通知,从火力地堡,任务也将尽。 但是,在这种情况下,Firebase会向设备发送静默推送通知,以验证电话号码登录请求。
您将无法通过Xcode Simulator测试此身份验证方法,而是需要连接iPhone以安装和运行该应用程序。
在Xcode中,转到“ 功能”并启用“ 推送通知” 。 该应用程序将自动设置并创建FirebaseDo.entitlements文件,如项目导航器中所示。

接下来,我们将创建一个Apple Push Notification身份验证密钥,以上传到Firebase。 在Apple Developer Porta l的 Keys下,填写项目名称,确保在APNs旁打勾。 下载生成的.p8文件,并记下密钥ID,因为我们很快需要输入它。

切换回Firebase控制台,然后在“ 项目设置” (齿轮图标)下,选择“ 云消息传递”选项卡。 在“ iOS应用程序配置和APNs身份验证密钥”下 ,选择“上载”按钮并上载.p8文件以及密钥ID和应用程序ID。 出现的设置屏幕应类似于以下内容:

测试应用
就是这样-我们不必为应用程序添加太多额外的代码即可对其进行设置,以实现完整的注册和登录身份验证工作流程。 让我们在Xcode中构建并运行该应用程序,以了解FirebaseUI的实际应用。 首次运行该应用程序时,不会进行身份验证,因此您将获得一个通用模板,其中包含在Firebase控制台中选择的身份验证选项。

它看起来有点乏味,但你可以自定义templat的几乎每一个方面 ê 。

输入新用户的电子邮件地址将按“ 创建帐户”屏幕,询问您的名称和密码。

填写此表格会将您注册为新用户(尽管我们的应用程序只会显示空白屏幕)。 要确认已创建新用户,您可以在Firebase控制台中转到“ 身份验证” >“ 用户” 。
测试每种身份验证方法,请记住您需要注销才能重新触发身份验证提示。 通过在超级调用之后在viewDidLoad()
的第一行中添加以下代码来重新触发身份验证:
try firebaseAuth.signOut()
这将迫使应用程序返回其初始状态,以便您可以通过电话SMS测试身份验证。 再次运行该应用程序,这次选择“ 使用手机登录” 。
结论
在本教程中,您介绍了如何将Firebase用作应用程序的后端平台,并了解了如何使用传统的电子邮件和密码组合以及通过电话和SMS验证用户身份,这种方法在应用程序中很流行像WhatsApp。
然后,我们开始构建简单的FirebaseDo应用程序,尽管该应用程序尚未执行任何实际的提醒类型功能,但我们将在下一个教程中开始进行操作。 但是仅几行,我们就完成了以下工作:
在本系列的其余部分中,您将了解Firebase的其他一些组件。
翻译自: https://code.tutsplus.com/tutorials/get-started-with-firebase-authentication-for-ios--cms-29227