Google's realtime app platform (Database, Authentication, Configuration, Notifications) firebase.google.com
For readability the supported features have been moved to their own README's:
- Setup and troubleshooting (continue reading below)
- Realtime Database
- Authentication
- Remote Config
- Cloud Messaging
- Storage
- Crash Reporting
- Analytics
Please update to at least tns 2.1.0 to make plugin installation a little easier (otherwise you'll need to manually add an applicationId
to app/App_Resources/Android/app.gradle
).
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 atplatforms/android/google-services.json
If you rather watch a 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 guide you through installing additional components. Check the doc links above to see what's what. You can always change your choices later.
Do yourself a favor by adding TypeScript support to your nativeScript app:
tns install typescript
Then open references.d.ts
in the root of your project and add this line to get autocompletion and type-checking for this plugin:
/// <reference path="./node_modules/nativescript-plugin-firebase/firebase.d.ts" />
Install packages 'Google Play Services' and 'Google Repository' in your Android SDK Manager
We're trying to automate these steps, but for now:
- Near the top there's a dependencies section, add
classpath "com.google.gms:google-services:3.0.0"
so it becomes something like:
dependencies {
classpath "com.android.tools.build:gradle:X.X.X"
classpath "com.google.gms:google-services:3.0.0"
}
- Add the very bottom of the same file add
apply plugin: "com.google.gms.google-services"
If you want a quickstart, clone our demo app.
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);
}
);
import 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);
}
);
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.3.0) required by Podfile
,
then check issue 98 which perfectly explains how to update your local Pod spec repo, or first try
to tns platform remove ios && tns platform add ios
.
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.
And there's this one: "Could not find com.google.firebase:firebase-auth:9.4.0". That means
making sure you have the latest Google Repository bits installed.
Just run android
from a command prompt and install any pending updates.
Update your Android bits like the issue above and reinstall the android platform in your project.
- Add support for
removeEventListener
- Possibly add more login mechanisms
- Add other Firebase 3.x SDK features (there's already a few feature requests in the GitHub issue tracker
The starting point for this plugin was this great Gist by John Bristowe.