从 Firebase.com 升级您的 Android 应用

本文档将指导您从现有 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(请确保下载新 google-services.json 文件并将 google-services 插件添加到 gradle 文件中)。

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

更新数据库代码

更新 Gradle 依赖项

开始更新的最简单方法是更改您的 Gradle 依赖项:

之前

dependencies {
  compile 'com.firebase:firebase-client-android:x.x.x'
}
之后

dependencies {
  compile "com.google.firebase:firebase-database:16.0.3"
}

修复类引用

由于类被重命名或移动过,因此您的应用现在将很可能有许多编译错误。其中很多问题都可以通过直接的替换来解决:

之前 之后
com.firebase.client com.google.firebase.database
FirebaseError DatabaseError
FirebaseException DatabaseException
Firebase.AuthStateListener FirebaseAuth.AuthStateListener
Firebase DatabaseReference

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

设置 Android 上下文并启用离线持久留存

在新 SDK 中,不再需要调用 Firebase.setAndroidContext(),因此您可以将其从代码中移除。

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

之前

Firebase.getDefaultConfig().setPersistenceEnabled(true);
之后

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

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

获取数据库引用

在新 SDK 中,Firebase 引用被替换成了 DatabaseReference,您可以使用 FirebaseDatabase 类来获取对数据库的初始引用。因此,您可以在代码中按如下方式获取数据库引用:

之前

Firebase rootRef = new Firebase("https://<your-app>.firebaseio.com/");
之后

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

请注意,您的数据库网址是根据您下载的 google-services.json 文件自动确定的,因此您不需要指定它。尽管这样,如果想指定它,您仍然可以指定(这可能有助于迁移):

之前

Firebase ref = new Firebase("https://<your-app>.firebaseio.com/path/to/data");
之后

DatabaseReference ref = FirebaseDatabase.getInstance()
    .getReferenceFromUrl("https://<your-app>.firebaseio.com/path/to/data");

更新 Java 模型对象

与 2.x SDK 一样,Firebase 数据库自动将传递给 DatabaseReference.setValue() 的 Java 对象转换为 JSON,并可以使用 DataSnapshot.getValue() 将 JSON 读入 Java 对象中。

在新 SDK 中,当用 DataSnapshot.getValue() 将 JSON 读入 Java 对象时,默认情况下此时会忽略 JSON 中的未知属性,所以您不再需要 @JsonIgnoreExtraProperties(ignoreUnknown=true)

为了在将 Java 对象写入 JSON 时排除 field/getter,注解此时称为 @Exclude 而不是 @JsonIgnore

之前

@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
   public String name;
   public String message;
   @JsonIgnore
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)
之后

public class ChatMessage {
   public String name;
   public String message;
   @Exclude
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

如果 JSON 中含有您的 Java 类中不存在的额外属性,日志文件中将显示以下警告:

W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage

您可以在类上添加 @IgnoreExtraProperties 注释来消除此警告。如果您希望 Firebase 数据库的行为与 2.x SDK 中相同,并在有未知属性时抛出异常,您可以在类上添加 @ThrowOnExtraProperties 注释。

更新身份验证代码

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

更新 Gradle 依赖项

由于身份验证现在有了其专属的模块,因此您首先需要为 build.gradle 添加依赖项:

dependencies {
  compile 'com.google.firebase:firebase-auth:16.0.4'
}

更新您的导入

之前

import com.firebase.client.AuthData;
之后

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

匿名登录一个用户

身份验证方法的工作方式与以前类似,但现在更换了名称且存在于 FirebaseAuth 对象上,AuthData 也被替换为了 FirebaseUser。例如,在 2.x API 和新 API 中匿名登录的方式如下所示:

之前

ref.authAnonymously(new Firebase.AuthResultHandler() {
   public void onAuthenticated(AuthData authData) { }
   public void onAuthenticationError(FirebaseError firebaseError) {
       throw firebaseError.toException();
   }
});
之后

FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signInAnonymously().addOnFailureListener(new OnFailureListener() {
   public void onFailure(Throwable throwable) {
       throw new RuntimeException(throwable);
   }
});

使用自定义令牌登录用户

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

之前

ref.authWithCustomToken(AUTH_TOKEN, new Firebase.AuthResultHandler() {
   public void onAuthenticated(AuthData authData) { }
   public void onAuthenticationError(FirebaseError firebaseError) {
       throw firebaseError.toException();
   }
});
之后

FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signInWithCustomToken(AUTH_TOKEN)
        .addOnCompleteListener(this, new OnCompleteListener() {
            @Override
            public void onComplete(@NonNull Task task) {
            }
        });

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

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

通过社交提供方登录用户

对于 Google、Facebook 或 Twitter 等社交提供方而言,变化较大。

社交提供方的流程与以前相同:您首先从提供方获取用户凭据,然后使用这些凭据与 Firebase 进行身份验证:

之前

ref.authWithOAuthToken(provider, token, authResultHandler);
之后

AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)

如需了解详情,请参阅有关如何通过 Firebase 进行 Facebook 身份验证通过 Firebase 进行 Google 身份验证的文档。

Twitter 身份验证仍然略有差异:

之前

Map options = new HashMap<>();
options.put("oauth_token", oauth_token);
options.put("oauth_token_secret", oauth_token_secret);
options.put("user_id", user_id);
ref.authWithOAuthToken(token.provider, options, authResultHandler);
之后

AuthCredential credential = TwitterAuthProvider.getCredential(token, secret);
mAuth.signInWithCredential(credential)

有关更多信息,请参阅使用 Twitter 进行身份验证

退出用户帐户

之前

ref.unauth()
之后

FirebaseAuth.getInstance().signOut();

监控身份验证状态

之前

ref.addAuthStateListener(new Firebase.AuthStateListener() {
   @Override
   public void onAuthStateChanged(final AuthData authData) {
       if (authData != null) {
           Log.i("AuthStateChanged", "User is signed in with uid: " + authData.getUid());
       } else {
           Log.i("AuthStateChanged", "No user is signed in.");
       }
   }
});
之后

FirebaseAuth auth = FirebaseAuth.getInstance();
auth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
   @Override
   public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
       final FirebaseUser user = firebaseAuth.getCurrentUser();
       if (user != null) {
           Log.i("AuthStateChanged", "User is signed in with uid: " + user.getUid());
       } else {
           Log.i("AuthStateChanged", "No user is signed in.");
       }
   }
});

迁移现有登录用户

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

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

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

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

更新 Firebase 库

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

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

发送以下问题的反馈:

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