- 版本:2811.1.2
- GitHub:https://github.com/eddyverbruggen/nativescript-plugin-firebase
- NPM:https://npmjs.net.cn/package/nativescript-firebase-updated-new
- 下载量
- 昨天: 34
- 上周: 138
- 上个月: 299
NativeScript Firebase 插件
为与 NativeScript 7 兼容,请运行
tns plugin add @nativescript/firebase
。
为与 NativeScript 6.1+ 兼容,安装插件版本 10:
tns plugin add nativescript-plugin-firebase@10
。
对于 NativeScript 6.0 和更低版本,请坚持使用插件版本 < 10。
功能
- AdMob
- 分析
- 身份验证
- Cloud Firestore
- Cloud Functions
- Cloud Messaging / 非 Firebase 推送消息
- Crashlytics
- 应用内消息
- 动态链接
- ML Kit
- 性能监控
- 实时数据库
- 远程配置
- 存储
先决条件
前往 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 控制台以及如何集成匿名身份验证:
从命令提示符进入您应用程序的根文件夹,并执行此操作以 NativeScript 7+
tns plugin add @nativescript/firebase
或对于 NativeScript 6
tns plugin add nativescript-plugin-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的演示项目,请查看 这个项目;如果您想要一个使用实时数据库的,请查看 这个项目。
iOS (Cocoapods)
通过Cocoapods安装Firebase iOS SDK,因此从命令提示符(在任何文件夹中)运行 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.ios
或npm run demo.android
(如果提示,再次回答 'n')。
启动时的配置
当您的应用程序启动时,我们需要做一些配置,因此打开 app.js
并在 application.start();
之前添加以下内容
JavaScript
// NativeScript 7+
var firebase = require("@nativescript/firebase");
// NativeScript 6-
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
// NativeScript 7+
import { firebase } from "@nativescript/firebase";
// NativeScript 6-
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。例如,在您的main组件的 ngOnInit
方法中
// NativeScript 7+
import { firebase } from "@nativescript/firebase";
// NativeScript 6-
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服务(否则您在身份验证过程中可能会遇到错误)。
DexIndexOverflowException
com.android.dex.DexIndexOverflowException: method ID not in..
恭喜,您遇到了 这个问题,可以通过在您的 app/App_Resources/Android/app.gradle
中添加 multiDexEnabled true
来解决,使其类似如下
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)的插件。我们需要将特定版本的服务锁定,以便与其他服务兼容,因此打开 app/App_Resources/Android/app.gradle
并添加
android {
// other stuff here
project.ext {
googlePlayServicesVersion = "15.0.0"
}
}
其中 "15.0.0"
最好设置为与 此文件 中的 googlePlayServicesVersion
值相同的值。
环境分离
可以使用多个 GoogleService-Info.plist
和 google-services.json
文件,通过不同的开发和生产环境。
设置
-
创建两个单独的 Firebase 项目(例如
myproject
和myproject-dev
),并使用相同的包名配置它们 -
下载两个项目的
plist
和json
文件,并将它们放置在相关目录中,文件名后分别添加.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
- iOS
注意:如果您目前在 firebase.init()
中有 storageBucket
属性,则应将其删除(自本插件 6.5.0
版本起不再是强制性的),因此它将自动从相关的 google 服务 plist
和 json
文件中获取。
构建
此插件的构建钩子现在将根据您的构建方式选择您的 google 服务 plist
和 json
文件的 dev
或 prod
版本。
- 如果使用
--env.dev
、--env.development
或--env.staging
标志运行,则将选择dev
。 - 如果使用
--env.prod
或--env.production
运行,则将选择prod
。
注意:如果不使用上述任何标志而使用 --release
标志,则默认环境设置为生产。如果您需要使用 dev 环境创建发行版,则需要明确设置它。
注意:如果您没有放置 dev
和 prod
文件,则将使用常规的 GoogleService-Info.plist
和 google-services.json
文件。