- 版本:10.6.3
- GitHub:
- NPM: https://npmjs.net.cn/package/nativescript-plugin-firebase
- 下载
- 昨天: 14
- 上周: 300
- 上个月: 1098
NativeScript Firebase 插件
插件版本 10.0.0 与 NativeScript 6.1+ 兼容。使用旧版本?请坚持使用版本 < 10。
为了与 NativeScript 7 兼容,请安装
@nativescript/firebase
版本 11+。
功能
- 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 控制台以及如何集成匿名身份验证:
从命令提示符转到您的应用程序根目录,并执行
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.ios
或npm 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.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
文件。