nativescript-plugin-firebase-updated
火. 基. Firebase!
npm i --save nativescript-plugin-firebase-updated

NativeScript Firebase 插件

Build Status NPM version Downloads TotalDownloads Twitter Follow

Firebase

插件版本 10.0.0 与 NativeScript 5.2+ 兼容,建议使用 6.1+。使用旧版本?坚持使用小于 10 的插件版本。

功能

先决条件

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

在 Google 控制台中打开您的 Firebase 项目,然后点击 '添加应用' 以添加 iOS 和/或 Android 应用。按照步骤操作(确保包标识符与 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

注意:有关为开发和生产环境使用不同版本文件的说明,请参阅 本部分

安装

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

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

tns plugin add nativescript-plugin-firebase

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

想使用此插件与 外部推送通知提供商 并且 使用任何 Firebase 功能?只需回答第一个问题“是”即可跳过其中大部分,然后 转到推送通知。在此情况下不要运行插件的 .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 的演示项目,请查看这个项目 链接,如果您想使用 Realtime DB 的,请查看这个项目 链接

iOS (Cocoapods)

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

Google Play Services 版本

插件默认使用 这个版本的 Android play-services-base SDK。如果您需要更改版本(例如更改到最新版本),您可以在 app/App_Resources/Android/app.gradle 中添加一个项目扩展属性 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 Services,否则您在认证过程中可能会遇到错误。

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"
}
}

带有名称 [DEFAULT] 的 FirebaseApp 不存在

另一个可能错误是 "带有名称 [DEFAULT] 的 FirebaseApp 不存在。",这可以通过将 google-services.json 放置到 platforms/android/google-services.json(见上文)并修改 build.gradle 中提到的更改来解决。

关于 API 级别 26.0.0 的错误

更新您的本地 Android SDK

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

找到了 play-services:A.C.D,但需要版本 B.X.Y

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

include.gradle:应用插件时失败 .. 对于输入字符串: "+"

可能您还有一个依赖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版本

  • 如果使用--release--env.prod--env.production标志运行,将选择prod
  • 如果没有使用上述任何标志,将选择dev

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