从 Firebase.com 升级您的 iOS 应用

本文档将指导您从现有 Firebase.com 应用升级到新的 Firebase 控制台和 API。

升级过程分为四个步骤:

  1. 将您的项目升级到新 Firebase 控制台
  2. 安装新 Firebase SDK
  3. 更新数据库代码
  4. 更新身份验证代码

您可随时将自己的项目升级到新的 firebase.google.com 控制台。您的应用将会继续运行。当您准备在自己的应用中使用某些新 Firebase 功能时,您就可以更新自己的代码。

将您的项目导入新 Firebase 控制台

  • 转到 Firebase 控制台并在“Firebase.com 上的现有项目”下找到您的项目。
  • 针对您要升级的项目点击导入
    • 如果您的项目使用了 firebase.com 上的某种付费套餐,您将需要在新控制台中为该项目设置结算信息。您的结算信息不会自动迁移
    • 选择或创建一个结算帐号。在导入之后,此帐号会负责该项目的所有费用。
  • 系统会自动并即时将您的实时数据库和托管内容导入到 Firebase 控制台
  • 您的用户数据会自动迁移到新的身份验证后端。这一切都会在后台进行,您的用户可以在数据迁移时继续使用应用。用户注册和登录不会受到影响。当系统迁移用户帐号时,在 Firebase 控制台的“身份验证”标签中会显示旋转进度条。
  • 如果您有适用于 Firebase.com 应用的有效促销代码,请与我们联系

安装新 Firebase SDK

您不必立即更新应用的代码。现有数据库和身份验证代码仍然适用于您迁移的项目。但是,当您准备开始在应用中使用某些新 Firebase 功能时,可以安装新 Firebase SDK

请注意,当您开始使用新 SDK 时,系统会自动启用 Google Analytics for Firebase。默认情况下,您的 Firebase Analytics 数据将会用于改进其他 Firebase 功能和 Google 产品。您可以随时在设置中控制 Firebase Analytics 数据的共享方式。 了解详情

配置您的应用

您的应用现在是使用可从 Firebase 控制台下载的 GoogleService-Info.plist 文件进行配置的。要轻松将该配置添加至您的项目,请将下载的 GoogleService-Info.plist 拖动至您的 XCode 项目(务必选中“Copy items if needed”(必要时复制内容),以便将其添加至您的项目目录)。

GoogleService-Info.plist 文件是由 FIRApp 类进行处理的。在 AppDelegate 类的 application:didFinishLaunchingWithOptions: 方法中,添加以下调用:

Objective-C

[FIRApp configure];

Swift

FIRApp.configure()

更新数据库代码

更新您的 CocoaPod 依赖项

开始更新的最简单方法是更改您的 CocoaPod 依赖项。从 3.x 版开始,对于每个 API,Firebase pod 都有一个不同的 subspec:

升级前

pod 'Firebase', '>= 2.5.1'
升级后

pod 'Firebase/Core'
pod 'Firebase/Database'

运行 pod update 以获取新的 pod。如果 API 名称更改过,那么您的应用现在将很可能有许多编译错误或警告。本指南的其余部分将介绍如何修复这些问题。

首先,如果您使用的是 Objective-C,请替换您的 #import 行。(如果您使用的是 Swift,则不需要进行任何更改!)

升级前

#import <Firebase/Firebase.h>
升级后

@import Firebase

获取数据库引用

在 3.x SDK 中,Firebase 引用被替换为 FIRDatabaseReference,并且您可以使用 FIRDatabase 类来获取对您的数据库的初始引用。因此,在配置 FIRApp 之后,您可以在您的代码中获取数据库引用,如下所示:

升级前

Objective-C


Firebase *rootRef = [[Firebase alloc] initWithUrl:@"https://<YOUR-FIREBASE-APP>.firebaseio.com"];

Swift


var rootRef = Firebase(url:"https://<YOUR-FIREBASE-APP>.firebaseio.com")
升级后

Objective-C


FIRDatabaseReference *rootRef= [[FIRDatabase database] reference];

Swift


var rootRef = FIRDatabase.database().reference()

请注意,您的数据库网址是自动根据您的 GoogleService-Info.plist 文件确定的,因此您不需要指定该网址。

启用磁盘持久化

如果您的应用使用磁盘持久化,您现在可通过 FIRDatabase 对象启用此功能:

升级前

Objective-C


[Firebase defaultConfig].persistenceEnabled = YES;

Swift


Firebase.defaultConfig().persistenceEnabled = true
升级后

Objective-C


[FIRDatabase database].persistenceEnabled = YES;

Swift


FIRDatabase.database().persistenceEnabled = true

就像在 2.x SDK 中一样,您必须先启用磁盘持久化,然后才能对数据库进行任何其他调用。

更新类/方法的引用

为了与其他 API 保持一致,3.x SDK 中对几种数据库类型进行了重命名。下表显示您需要做出的一些常见更改。

升级前 升级后
Firebase FIRDatabaseReference
FDataSnapshot FIRDataSnapshot
FirebaseHandle FIRDatabaseHandle
FEventType FIRDataEventType
FQuery FIRDatabaseQuery
FMutableData FIRMutableData
FTransactionResult FIRTransactionResult
FConfig FIRDatabase
FirebaseApp FIRDatabase
kFirebaseServerValueTimestamp [FIRServerValue timestamp]

如果您找不到所需的类或方法,请查看数据库引用文档

更新您的身份验证代码

Firebase 身份验证功能现在是通过自己的 FIRAuth 类发挥作用的,因此,现在身份验证操作是在 FIRAuth 实例上完成的,而不是通过 Firebase 引用完成。

更新您的 CocoaPod 依赖项

由于身份验证现在是在自己的模块中发挥作用的,因此,您首先需要向您的 Podfile 添加一种依赖项:

pod 'Firebase/Auth'

在添加该依赖项之后,您将需要再次运行 pod update

登录用户

身份验证方法的工作方式与以前类似,但现在是以 FIRAuth 对象上的方法存在的,拥有新的名称,FAuthData 现在被替换为 FIRUser。例如:

升级前

Objective-C


[ref authAnonymouslyWithCompletionBlock:^(NSError *error, FAuthData *authData) {
    if (error) {
        NSLog(@"Sign in failed: %@", error.localizedDescription);
    } else {
        NSLog(@"Signed in with uid: %@", authData.uid);
    }
}];

Swift


ref.authAnonymouslyWithCompletionBlock { error, authData in
    if let error = error {
        print("Sign in failed:", error.localizedDescription)
    } else {
        print("Signed in with uid:", authData.uid)
    }
}
升级后

Objective-C


[[FIRAuth auth] signInAnonymouslyWithCompletion:^(FIRUser *_Nullable user,
                                                  NSError *_Nullable error) {
    if (error) {
        NSLog(@"Sign in failed: %@", error.localizedDescription);
    } else {
        NSLog(@"Signed in with uid: %@", user.uid);
    }
}];

Swift


FIRAuth.auth()!.signInAnonymouslyWithCompletion() { (user, error) in
    if let error = error {
        print("Sign in failed:", error.localizedDescription)
    } else {
        print ("Signed in with uid:", user!.uid)
    }
}

如需有关其他身份验证提供方的文档,请参阅 FIRAuth 类Firebase 身份验证指南

使用自定义令牌登录用户

在客户端上通过自定义令牌进行身份验证的方式也与之前类似。下面介绍了在 2.x API 和新 API 中通过自定义令牌登录的方式:

升级前

Objective-C


[ref authWithCustomToken:AUTH_TOKEN
     withCompletionBlock:^(NSError *error, FAuthData *authData) {
    if (error) {
        NSLog(@"Login Failed! %@", error);
    } else {
        NSLog(@"Login succeeded! %@", authData);
    }
}];

Swift


ref.authWithCustomToken(AUTH_TOKEN, withCompletionBlock: { error, authData in
    if error != nil {
        println("Login failed! \(error)")
    } else {
        println("Login succeeded! \(authData)")
    }
})
升级后

Objective-C


[[FIRAuth auth] signInWithCustomToken:customToken
                           completion:^(FIRUser *_Nullable user,
                                        NSError *_Nullable error) {
                             // ...
                           }];

Swift


FIRAuth.auth()?.signIn(withCustomToken: customToken ?? "") { (user, error) in
  // ...
}

您在服务器上生成的自定义令牌有了一种新格式。您可以使用适用于 Node.js 和 Java 的 Firebase Admin SDK 来创建自定义令(与新 API 兼容的令牌),也可以用第三方 JWT 库创建自定义令牌

请注意,与 2.x API 的帮助程序库(默认情况下这些帮助程序库生成的令牌会在 24 小时之后过期)不同,Firebase Admin SDK 生成的自定义令牌会在 1 小时之后过期。

退出用户帐户

升级前

Objective-C


[ref unauth];

Swift


ref.unauth()
升级后

Objective-C


[[FIRAuth auth] signOut:nil];

Swift


try! FIRAuth.auth()!.signOut()

监控身份验证状态

升级前

Objective-C


[ref observeAuthEventWithBlock:^(FAuthData *authData) {
    if (authData) {
        NSLog(@"User is signed in with uid: %@", authData.uid);
    } else {
        NSLog(@"No user is signed in.");
    }
}];

Swift


ref.observeAuthEventWithBlock({ authData in
    if authData != nil {
        print("User is signed in with uid:", authData.uid)
    } else {
        print("No user is signed in.")
    }
})
升级后

Objective-C


[[FIRAuth auth] addAuthStateDidChangeListener:^(FIRAuth * _Nonnull auth, FIRUser * _Nullable user) {
    if (user) {
        NSLog(@"User is signed in with uid: %@", user.uid);
    } else {
        NSLog(@"No user is signed in.");
    }
  }];

Swift


FIRAuth.auth()!.addAuthStateDidChangeListener() { (auth, user) in
    if let user = user {
        print("User is signed in with uid:", user.uid)
    } else {
        print("No user is signed in.")
    }
}

FIRAuth 有许多新功能(帐号关联、更多身份验证提供商等)。如需了解更多详情,请参阅身份验证指南身份验证参考文档

迁移现有登录

如果用户已使用旧版 SDK 登录到应用中,那么您将需要编写一小段代码,通过新 SDK 让他们保持登录状态。否则,他们将不得不再次登录。您可在 Firebase 身份验证迁移帮助程序 GitHub 代码库中找到用于执行此操作的开放源示例代码。

对新的密码重置模板进行更新

如果您的应用允许用户通过电子邮件与密码身份验证机制登录,那么您可能还向这些用户提供了重置密码的选项。

您升级到新 SDK 后,这些密码重置电子邮件将使用在 Firebase 控制台中指定的新模板。请务必更新这些模板,以满足应用的需要。

更新 Firebase 库

如果您在使用下列任何库,则需要升级为最新版本。

支持的版本 资源
GeoFire 1.2.x Github

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面