- Realtime Database
- Firestore
- Authentication
- Remote Config
- Cloud Messaging
- Storage
- Crash Reporting
- Analytics
- Invites and Dynamic Links
- AdMob
Head on over to https://console.firebase.google.com/ and sign up for a free account.
Your first 'Firebase' will be automatically created and made available via an URL like https://n-plugin-test.firebaseio.com
.
Open your Firebase project at the Google console and click 'Add app' to add an iOS and / or Android app. Follow the steps (make sure the bundle id is the same as your nativescript.id
in package.json
and you'll be able to download:
-
iOS:
GoogleService-Info.plist
which you'll add to your NativeScript project atapp/App_Resources/iOS/GoogleService-Info.plist
-
Android:
google-services.json
which you'll add to your NativeScript project atapp/App_Resources/Android/google-services.json
If you rather watch a (slightly outdated) video explaining the steps then check out this step-by-step guide - you'll also learn how to add iOS and Android support to the Firebase console and how to integrate anonymous authentication:
From the command prompt go to your app's root folder and execute:
tns plugin add nativescript-plugin-firebase
This will launch an install script which will guide you through installing additional components. Check the doc links above to see what's what. You can always change your choices later.
If you choose to save your config during the installation, the supported options may be saved in the firebase.nativescript.json
at the root of your app.
This is to ensure your app may roundtrip source control and installation on CI won't prompt for user input during installation.
You can reconfigure the plugin by going to the node_modules/nativescript-plugin-firebase
and running npm run config
.
You can also change the configuration by deleting the firebase.nativescript.json
and reinstalling the plugin.
If you're using this template: vue-cli-template, then copy firebase.nativescript.json
to the template
folder. You could also symlink it: firebase.nativescript.json -> template/firebase.nativescript.json
.
And also, require
the plugin before Vue.start runs (probably in main.js
), but run firebase.init()
afterwards (although it may work before). You could wrap it in a timeout to make sure.
The Firebase iOS SDK is installed via Cocoapods, so run pod repo update
from the command prompt (in any folder) to ensure you have the latest spec.
The plugin will default to this version of the Android play-services-base
SDK.
If you need to change the version (to for instance the latest version), you can add a project ext property googlePlayServicesVersion
to app/App_Resources/Android/app.gradle
:
project.ext {
googlePlayServicesVersion = "+"
}
If you want a quickstart, clone the repo, cd src
, and npm run demo.ios
or npm run demo.android
.
We need to do some wiring when your app starts, so open app.js
and add this before application.start();
:
var firebase = require("nativescript-plugin-firebase");
firebase.init({
// Optionally pass in properties for database, authentication and cloud messaging,
// see their respective docs.
}).then(
function (instance) {
console.log("firebase.init done");
},
function (error) {
console.log("firebase.init error: " + error);
}
);
const firebase = require("nativescript-plugin-firebase");
firebase.init({
// Optionally pass in properties for database, authentication and cloud messaging,
// see their respective docs.
}).then(
instance => {
console.log("firebase.init done");
},
error => {
console.log(`firebase.init error: ${error}`);
}
);
Open or create App_Resources/iOS/<appname>.entitlements
and add these two keys with the value 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>
On the simulator you may see this message if you have more than one app with the Firebase SDK ever installed:
[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')
This is a known issue in the Firebase SDK. I always use a real device to avoid this problem, but you can pass an 'iOSEmulatorFlush' option to init.
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()
If you see an error like Unable to satisfy the following requirements: Firebase (~> 3.17.0) required by Podfile
,
then run pod repo update
on the command line to make sure you have the latest Podspec.
This could happen when updating the plugin to a new version. You'll want to tns platform remove ios && tns platform add ios
as well to clean out the old pod version.
You can use the awesome Genymotion emulator but you'll need to install Google Play Services on it or you'll run into errors during authentication.
com.android.dex.DexIndexOverflowException: method ID not in..
Congrats, you ran into this issue
which can be solved by adding multiDexEnabled true
to your app/App_Resources/Android/app.gradle
so it becomes something like this:
android {
defaultConfig {
applicationId = "__PACKAGE__"
multiDexEnabled true
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
Increase the Java Max Heap Size like this (the bit at the end):
android {
defaultConfig {
applicationId = "__PACKAGE__"
multiDexEnabled true
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
dexOptions {
javaMaxHeapSize "4g"
}
}
Another possible error is "FirebaseApp with name [DEFAULT] doesn't exist." which will be solved by
placing google-services.json
to platforms/android/google-services.json
(see above), and making
the changes to build.gradle
which are mentioned above as well.
Update your local Android SDKs:
Just run $ANDROID_HOME/tools/bin/sdkmanager --update
from a command prompt
or launch the SDK manager from Android Studio, expand Extras
and install any pending updates.
Update your Android bits like the issue above and reinstall the android platform in your project.
You probably have another plugin depending on Google Play Services (Google Maps, perhaps).
We need to pin to a specific play services version to play nice with others, so open app/App_Resources/Android/app.gradle
and add:
android {
// other stuff here
project.ext {
googlePlayServicesVersion = "11.8.0"
}
}
Where "11.8.0"
is best set to the same value as the firebaseVersion
value in this file.