
Security News
vlt Launches "reproduce": A New Tool Challenging the Limits of Package Provenance
vlt's new "reproduce" tool verifies npm packages against their source code, outperforming traditional provenance adoption in the JavaScript ecosystem.
nativescript-plugin-firebase
Advanced tools
The leading realtime app platform (Database, Auth & Hosting). Docs here.
If you can spare 41 seconds, please check this video of the demo app in action:
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 a 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:
GoogleService-Info.plist
which you'll add to your NativeScript project at app/App_Resources/iOS/GoogleService-Info.plist
google-services.json
which you'll add to your NativeScript project at platforms/android/google-services.json
From the command prompt go to your app's root folder and execute:
tns plugin add nativescript-plugin-firebase
Installpackages Google Play Services and Google Repository in your Android SDK Manager
app/App_Resources/Android/app.gradle
applicationId "com.example.app"
to the defaultConfig
node (change the id to the same as in your app's package.json
), so it becomes:android {
...
defaultConfig {
applicationId "com.example.app"
...
}
}
platforms/android/build.gradle
classpath "com.google.gms:google-services:3.0.0"
so it becomes something like: dependencies {
classpath "com.android.tools.build:gradle:1.5.0"
classpath "com.google.gms:google-services:3.0.0"
}
apply plugin: "com.google.gms.google-services"
If you want a quickstart, clone our demo app (the one in the YouTube video). And here's the comprehensive list of supported functions:
var firebase = require("nativescript-plugin-firebase");
firebase.init({
persist: true, // Allow disk persistence. Default false.
onAuthStateChanged: function(data) { // optional but useful to immediately re-logon the user when he re-visits your app
console.log(data.loggedIn ? "Logged in to firebase" : "Logged out from firebase");
if (data.loggedIn) {
console.log("user's email address: " + (data.user.email ? data.user.email : "N/A"));
}
}
}).then(
function (instance) {
console.log("firebase.init done");
},
function (error) {
console.log("firebase.init error: " + error);
}
);
All further examples assume firebase
has been required.
Also, all functions support promises, but we're leaving out the .then()
stuff for brevity where it doesn't add value.
Data is stored as JSON data at a specific path (which is appended to the URL you passed to init
).
If you want to add data to a known path use this, otherwise use push
(see below).
The plugin will take care of serializing JSON data to native data structures.
// to store a JSON object
firebase.setValue(
'/companies',
{'foo':'bar'}
);
// to store an array of JSON objects
firebase.setValue(
'/companies',
[
{name: 'Telerik', country: 'Bulgaria'},
{name: 'Google', country: 'USA'}
]
);
This function will store a JSON object at path <Firebase URL>/users/<Generated Key>
firebase.push(
'/users',
{
'first': 'Eddy',
'last': 'Verbruggen',
'birthYear': 1977,
'isMale': true,
'address': {
'street': 'foostreet',
'number': 123
}
}
).then(
function (result) {
console.log("created key: " + result.key);
}
);
Firebase supports querying data and this plugin does too, since v2.0.0.
Let's say we have the structure as defined at setValue
, then use this query to retrieve the companies in country 'Bulgaria':
var onQueryEvent = function(result) {
// note that the query returns 1 match at a time
// in the order specified in the query
if (!result.error) {
console.log("Event type: " + result.type);
console.log("Key: " + result.key);
console.log("Value: " + JSON.stringify(result.value));
}
};
firebase.query(
onQueryEvent,
"/companies",
{
// set this to true if you want to check if the value exists or just want the event to fire once
// default false, so it listens continuously
singleEvent: true,
// order by company.country
orderBy: {
type: firebase.QueryOrderByType.CHILD,
value: 'country' // mandatory when type is 'child'
},
// but only companies named 'Telerik'
// (this range relates to the orderBy clause)
range: {
type: firebase.QueryRangeType.EQUAL_TO,
value: 'Bulgaria'
},
// only the first 2 matches
// (note that there's only 1 in this case anyway)
limit: {
type: firebase.QueryLimitType.LAST,
value: 2
}
}
);
For supported values of the orderBy/range/limit's type
properties, take a look at the firebase-common.d.ts
TypeScript definitions in this repo.
Changes the values of the keys specified in the dictionary without overwriting other keys at this location.
firebase.update(
'/companies',
{'foo':'baz'}
);
To listen for changes in your database you can pass in a listener callback function.
You get to control which path inside you database you want to listen to, by default it's /
which is the entire database.
The plugin will take care of serializing native data structures to JSON data.
var onChildEvent = function(result) {
console.log("Event type: " + result.type);
console.log("Key: " + result.key);
console.log("Value: " + JSON.stringify(result.value));
};
// listen to changes in the /users path
firebase.addChildEventListener(onChildEvent, "/users");
The difference with addChildEventListener
is explained here.
The link is for the iOS SDK, but it's the same for Android.
var onValueEvent = function(result) {
console.log("Event type: " + result.type);
console.log("Key: " + result.key);
console.log("Value: " + JSON.stringify(result.value));
};
// listen to changes in the /companies path
firebase.addValueEventListener(onValueEvent, "/companies");
You can remove the entire database content by passing in '/' as param, but if you only want to wipe everything at '/users', do this:
firebase.remove("/users");
v 1.1.0 of this plugin adds the capability to log your users in, either
You need to add support for those features in your Firebase instance at the 'Login & Auth' tab.
You can expect more login mechanisms to be added in the future.
As stated here
The recommended way to get the current user is by setting a listener on the Auth object
To listen to auth state changes you can register a listener like this (you may have done this already during init
(see above):
var listener = {
onAuthStateChanged: function(data) {
console.log(data.loggedIn ? "Logged in to firebase" : "Logged out from firebase");
if (data.loggedIn) {
console.log("User info", data.user);
}
},
thisArg: this
};
firebase.addAuthStateListener(listener);
To stop listening to auth state changed:
firebase.removeAuthStateListener(listener);
To check if already listening to auth state changes
hasAuthStateListener(listener);
firebase.login({
// note that you need to enable anonymous login in your firebase instance
type: firebase.LoginType.ANONYMOUS
}).then(
function (result) {
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token
JSON.stringify(result);
},
function (errorMessage) {
console.log(errorMessage);
}
)
firebase.login({
// note that you need to enable email-password login in your firebase instance
type: firebase.LoginType.PASSWORD,
email: 'useraccount@provider.com',
password: 'theirpassword'
}).then(
function (result) {
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token
JSON.stringify(result);
},
function (errorMessage) {
console.log(errorMessage);
}
)
Use this login type to authenticate against firebase using a token generated by your own backend server. See these instructions on how to generate the authentication token.
firebase.login({
// note that you need to generate the login token in your existing backend server
type: firebase.LoginType.CUSTOM,
token: token
}).then(
function (result) {
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token
JSON.stringify(result);
},
function (errorMessage) {
console.log(errorMessage);
}
)
Use this login type to authenticate against firebase using a token generated by your own backend server. See these instructions on how to generate the authentication token.
firebase.login({
// note that you need to generate the login token in your existing backend server
type: firebase.LoginType.CUSTOM,
token: token
}).then(
function (result) {
// the result object has these properties: uid, provider, expiresAtUnixEpochSeconds, profileImageURL, token
JSON.stringify(result);
},
function (errorMessage) {
console.log(errorMessage);
}
)
On iOS this is rock solid, but on Android it's work in progress. If you want to use it for iOS open the Podfile
in the plugin's platforms/ios
folder and uncomment the Facebook line (you can't miss it).
firebase.login({
type: firebase.LoginType.FACEBOOK
}).then(
function (result) {
JSON.stringify(result);
},
function (errorMessage) {
console.log(errorMessage);
}
)
firebase.resetPassword({
email: 'useraccount@provider.com'
}).then(
function () {
// called when password reset was successful,
// you could now prompt the user to check his email
},
function (errorMessage) {
console.log(errorMessage);
}
)
firebase.changePassword({
email: 'useraccount@provider.com',
oldPassword: 'myOldPassword',
newPassword: 'myNewPassword'
}).then(
function () {
// called when password change was successful
},
function (errorMessage) {
console.log(errorMessage);
}
)
Shouldn't be more complicated than:
firebase.logout();
On Android you could run into an error like this:
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 "my.package.id"
multiDexEnabled true
generatedDensities = []
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
It's kinda cool to manipulate data while using multiple devices or your device and the Firebase Dashboard. You will instantly see the update on the other end. The Firebase Dashboard can be reached by simply loading your Firebase URL in a web browser.
tns emulate ios --device "iPhone 6s"
tns emulate android --geny "Nexus 6_23"
or start a geny emulator first and do: tns run android
removeEventListener
.The starting point for this plugin was this great Gist by John Bristowe.
3.1.0 (2016, June 17)
If version numbers changed, clean your platform folders to avoid build errors.
FAQs
Fire. Base. Firebase!
The npm package nativescript-plugin-firebase receives a total of 67 weekly downloads. As such, nativescript-plugin-firebase popularity was classified as not popular.
We found that nativescript-plugin-firebase demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
vlt's new "reproduce" tool verifies npm packages against their source code, outperforming traditional provenance adoption in the JavaScript ecosystem.
Research
Security News
Socket researchers uncovered a malicious PyPI package exploiting Deezer’s API to enable coordinated music piracy through API abuse and C2 server control.
Research
The Socket Research Team discovered a malicious npm package, '@ton-wallet/create', stealing cryptocurrency wallet keys from developers and users in the TON ecosystem.