nativescript-plugin-firebase
火焰。基地。Firebase!
npm i --save nativescript-plugin-firebase

NativeScript Firebase 插件

Build Status NPM version Downloads TotalDownloads Twitter Follow

Firebase

插件版本 10.0.0 与 NativeScript 6.1+ 兼容。使用旧版本?请坚持使用版本 < 10。

为了与 NativeScript 7 兼容,请安装 @nativescript/firebase 版本 11+。

功能

先决条件

前往 https://console.firebase.google.com/ 并注册一个免费账户。您的第一个 'Firebase' 将自动创建并通过类似 https://n-plugin-test.firebaseio.com 的 URL 提供。

在 Google 控制台中打开您的 Firebase 项目,然后点击 '添加应用' 以添加 iOS 和 / 或 Android 应用。按照步骤操作(确保 bundle id 与 package.json 中的 nativescript.id 相同),然后您就可以下载

  • iOS: GoogleService-Info.plist,您将其添加到 NativeScript 项目的 app/App_Resources/iOS/GoogleService-Info.plist

  • Android: google-services.json,您将其添加到 NativeScript 项目的 app/App_Resources/Android/google-services.json

注意:有关为开发和生产环境使用不同版本的这些文件的信息,请参阅 本节

安装

如果您想观看一个(略过时)的视频来解释步骤,请查看此逐步指南 - 您还将了解如何将 iOS 和 Android 支持添加到 Firebase 控制台以及如何集成匿名身份验证:YouTube 演示

从命令提示符转到您的应用程序根目录,并执行

tns plugin add nativescript-plugin-firebase

或对于 NativeScript 7+

tns plugin add @nativescript/firebase

这将启动一个安装脚本,该脚本将引导您安装其他组件。查看上面的文档链接以了解有关信息。您以后总是可以更改您的选择。

想要使用此插件与 外部推送通知提供商 使用任何 Firebase 功能?只需回答第一个问题的 'y' 跳过大多数问题,然后转到 推送通知。在此情况下不要运行插件的 .init 函数!

使用 NativeScript SideKick?那么上述安装脚本将无法(或无法)运行。在这种情况下,运行 Android 应用将导致 此问题。要修复此问题,请参阅 此评论

配置

如果您选择在安装过程中保存配置,则支持选项可能已保存到应用程序根目录的 firebase.nativescript.json 中。这是为了确保您的应用程序可以往返源代码控制,并且 CI 安装时不会提示用户输入。

您可以通过进入 node_modules/nativescript-plugin-firebase 并运行 npm run config 来重新配置插件。

您还可以通过删除 firebase.nativescript.json 并重新安装插件来更改配置。

使用 Vue?

请更新您的 NativeScript-Vue 模板到 2.0,因为它与该插件(因为这个模板现在与常规 NativeScript 项目更为相似)完美匹配。

如果您想使用 Vue 和 Firestore 的演示,请查看这个项目 check out this project,如果您想要一个使用 Realtime DB 的,请查看这个 check out this one

iOS (Cocoapods)

Firebase iOS SDK 通过 Cocoapods 安装,因此从命令提示符(任何文件夹)运行 pod repo update 以确保您拥有最新的规范。

Google Play 服务版本

插件将默认使用 此版本的 Android play-services-base SDK。如果您需要更改版本(例如,更改到最新版本),您可以向 app/App_Resources/Android/app.gradle 添加一个项目 ext 属性 googlePlayServicesVersion

project.ext {
googlePlayServicesVersion = "+"
}

用法

演示应用程序

如果您想快速入门,请克隆存储库,然后

  • cd src.
  • npm i(对于任何提示,只需回答 'n',因为它们无论如何都会被忽略)。
  • npm run demo.iosnpm run demo.android(如果提示,再次回答 'n')。

启动时连接

您的应用程序启动时,我们需要做一些连接,因此打开 app.js 并在 application.start(); 之前添加此内容。

JavaScript
var firebase = require("nativescript-plugin-firebase");

firebase.init({
// Optionally pass in properties for database, authentication and cloud messaging,
// see their respective docs.
}).then(
function () {
console.log("firebase.init done");
},
function (error) {
console.log("firebase.init error: " + error);
}
);

TypeScript

const firebase = require("nativescript-plugin-firebase");

firebase.init({
// Optionally pass in properties for database, authentication and cloud messaging,
// see their respective docs.
}).then(
() => {
console.log("firebase.init done");
},
error => {
console.log(`firebase.init error: ${error}`);
}
);

Angular

由于 Angular 引导的具体情况,最好在 Angular 应用程序运行后初始化 Firebase。例如,您的主组件的 ngOnInit 方法

const firebase = require("nativescript-plugin-firebase");

@Component({
// ...
})
export class AppComponent implements OnInit {
ngOnInit() {
firebase.init({
// Optionally pass in properties for database, authentication and cloud messaging,
// see their respective docs.
}).then(
() => {
console.log("firebase.init done");
},
error => {
console.log(`firebase.init error: ${error}`);
}
);
}
}

iOS 上已知的问题

在模拟器上运行时出现问题

打开或创建 App_Resources/iOS/<appname>.entitlements 并添加这两个键,其值为 true

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.keystore.access-keychain-keys</key>
<true/>
<key>com.apple.keystore.device</key>
<true/>
</dict>
</plist>

认证失败:无效令牌

在模拟器上,如果您安装了多个带有 Firebase SDK 的应用程序,您可能会看到此消息。

[FirebaseDatabase] Authentication failed: invalid_token (Invalid claim 'aud' in auth token.)
or
[FirebaseDatabase] Authentication failed: invalid_token (audience was project 'firegroceries-904d0' but should have been project 'your-firebase-project')

这是 Firebase SDK 中的一个已知问题。我始终使用真实设备以避免此问题,但您可以在初始化时传递一个 'iOSEmulatorFlush' 选项。

firebase.init({
// Optionally pass in properties for database, authentication and cloud messaging,
// see their respective docs and 'iOSEmulatorFlush' to flush token before init.
iOSEmulatorFlush: true
}).then()

Pod 依赖错误

如果您看到类似 Unable to satisfy the following requirements: Firebase (~> 3.17.0) required by Podfile 的错误,请在命令行上运行 pod repo update 以确保您有最新的 Podspec。

这可能发生在更新插件到新版本时。您还需要运行 tns platform remove ios && tns platform add ios 以清除旧的 pod 版本。

Android 上已知的问题

Genymotion

您可以使用出色的 Genymotion 模拟器,但您需要在它上安装 Google Play 服务 or you'll run into errors during authentication

DexIndexOverflowException

com.android.dex.DexIndexOverflowException: method ID not in..

恭喜您遇到了 这个问题,可以通过将 multiDexEnabled true 添加到您的 app/App_Resources/Android/app.gradle 来解决,使其看起来像这样

android {  
defaultConfig {
applicationId = "__PACKAGE__"
multiDexEnabled true
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
}

java.lang.OutOfMemoryError: GC overhead limit exceeded

您可以像这样增加 Java 最大堆大小(末尾的位)

android {  
defaultConfig {
applicationId = "__PACKAGE__"
multiDexEnabled true
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
dexOptions {
javaMaxHeapSize "4g"
}
}

FirebaseApp with name [DEFAULT] doesn't exist

另一个可能出现的错误是 "FirebaseApp with name [DEFAULT] doesn't exist。",这可以通过将 google-services.json 放到 platforms/android/google-services.json(见上文),以及做出上述提到的对 build.gradle 的更改来解决。

关于 API 级别 26.0.0 的错误

更新您的本地 Android SDKs

只需从命令提示符运行 $ANDROID_HOME/tools/bin/sdkmanager --update 或从 Android Studio 启动 SDK 管理器,展开 Extras 并安装任何挂起的更新。

Found play-services:A.C.D, but version B.X.Y is needed..

更新您的 Android 位,如上述问题,并在您的项目中重新安装 android 平台。

include.gradle: Failed to apply plugin .. For input string: "+"

您可能还有其他依赖于Google Play服务的插件(例如Google Maps)。为了与其他插件良好协作,我们需要将版本锁定到特定的Play服务版本,因此打开app/App_Resources/Android/app.gradle文件,并添加以下内容:

android {  
// other stuff here

project.ext {
googlePlayServicesVersion = "15.0.0"
}
}

其中"15.0.0"最好设置为与此文件中的googlePlayServicesVersion值相同。

环境分离

可以通过使用多个GoogleService-Info.plistgoogle-services.json文件来使用不同的开发和生产环境。

设置

  1. 创建两个独立的Firebase项目(例如myprojectmyproject-dev),并使用相同的包名进行配置

  2. 下载两个项目的plistjson文件,并将它们放入相关目录中,文件名后分别添加.dev.prod,以便您有以下文件:

    • iOS
      • app/App_Resources/iOS/GoogleService-Info.plist.dev
      • app/App_Resources/iOS/GoogleService-Info.plist.prod
    • Android
      • app/App_Resources/Android/google-services.json.dev
      • app/App_Resources/Android/google-services.json.prod

注意:如果您在当前的firebase.init()中设置了storageBucket属性,则应将其删除(自本插件6.5.0版本起不再强制要求),这样它将自动从相关的Google服务plistjson文件中获取。

构建

此插件的构建钩子将根据您如何运行构建来选择您的Google服务plistjson文件的devprod版本。

  • 如果您使用--env.dev--env.development--env.staging标志运行,将选择dev
  • 如果您使用--env.prod--env.production标志运行,将选择prod

注意:如果不使用上述任何标志而使用--release标志,则默认环境设置为生产。如果您需要使用dev环境创建发布版本,则需要明确设置。

注意:如果您没有同时放置devprod文件,将使用常规的GoogleService-Info.plistgoogle-services.json文件。