Files
react-native-firebase/CHANGELOG.md
2019-06-04 13:13:24 +01:00

23 KiB

v6.0.0

This version is effectively a re-write with the goal of splitting every module into it's own package (simplifies maintenance for contributors and also installation for users) and bringing each Firebase module up to 100% testing coverage and 100% Firebase API Coverage.

Many of the manual native installation steps for Android & iOS have been removed / internally automated and most modules can now be used just by linking it (e.g. react-native link @react-native-firebase/analytics).

The following modules are completed and published to NPM on the alpha tag ready to be consumed:

Name Downloads Coverage
Analytics badge badge
App badge badge
App Invites badge badge
Cloud Functions badge badge
Cloud Storage badge badge
Crashlytics badge badge
In-app Messaging badge badge
Instance ID badge badge
ML Kit Natural Language badge badge
Performance Monitoring badge badge
Remote Config badge badge
Utils badge badge

The following modules are migration only for now (migrated from v5 to v6 with minimal changes), what this means:

  • no new work done on them (other than migrating to v6 internals)
  • no new tests added for them (but all existing tests pass)
  • flow types missing (but have TS types)

More work on these will be done in a later alpha release.

Name Downloads Coverage
Authentication badge badge

If a module you use is not yet listed above please refrain from using v6 for now - attempting to use v6 alongside v5 can cause issues with dependencies.

Please tag any GitHub issues regarding v6 with [v6] in the title.

Migrating from v4 & v5

With the size of the changes mentioned above, it's recommended that you remove all native code/changes previously added for react-native-firebase (except for firebase initialisation code (e.g. [FIRApp configure]; ios, apply plugin: 'com.google.gms.google-services' android).

Additionally, it's recommended to remove any native Firebase dependencies (the Firebase Android/iOS SDKs) in your iOS Podfile and your android/app/build.gradle file, e.g. pod 'Firebase/Core', '~> 5.15.0' or implementation "com.google.firebase:firebase-core:16., as we now manage these dependencies and their versions internally.

Once all the old native installation changes have been removed you can follow the install guide below.

If you're migrating from v4, please ensure you've read up on any breaking changes from v4 to v5 here.

Installing

  1. Install the @react-native-firebase/app NPM package (all modules have a hard dependency requirement on this package):
yarn add @react-native-firebase/app@alpha
react-native link @react-native-firebase/app
  1. Install the NPM packages for the Firebase services you'd like to use, e.g. for analytics install @react-native-firebase/analytics. Repeat this step for each Firebase service you require.
yarn add @react-native-firebase/analytics@alpha
react-native link @react-native-firebase/analytics
  1. Some Firebase services such as Performance Monitoring require some minor additional native code steps for Android or iOS that can't be abstracted away, e.g. Perf on Android requires the com.google.firebase.firebase-perf gradle plugin. Please see the readme for each module (see the table above for links) where these changes are documented; these will later be moved to the new documentation hub.

Usage Example

// import the app module
import firebase from '@react-native-firebase/app';

// import the modules you'd like to use
import '@react-native-firebase/analytics';
import '@react-native-firebase/functions';

// use them
await firebase.analytics().setUserId('12345678');

Optionally; you can also consume a module directly without needing the default export of @react-native-firebase/app, e.g.:

import { firebase } from '@react-native-firebase/analytics';

// use analytics
await firebase.analytics().setUserId('12345678');

// ---- OR ----
import analytics from '@react-native-firebase/analytics';

// use analytics
await analytics().setUserId('12345678');

All Modules

  • [INTERNAL] Improved error codes & handling for all Firebase services;
    • Standardised native error to JS conversion
    • [DEVEX] Native promise rejection errors now contain additional properties to aid debugging
  • [BUGFIX] All native events are now queued natively until a JS listener is registered. This fixes several race conditions for events like onMessage, onNotification, onLink etc where the event would trigger before JS was ready.
  • [NEW][🔥] In an effort to further reduce manual native code changes when integrating and configuring React Native Firebase; we have added support for configuring various Firebase services & features via a firebase.json file in your project root.
  • [NEW][ios] CocoaPods static framework support for all modules (you can use use_frameworks! without issues relating to this lib)
  • [NEW][ios] Implemented a CocoaPods Firebase React Native modules auto-loader script for your Podfile; you only need to change your Podfile once (to add the script); this script will then automatically include all React Native Firebase modules found in your node_modules directory as Pods, manage additional required build phases (e.g. auto adds the crashlytics build phase (/Fabric/Run)), and allows the firebase.json functionality to work. Example Podfile with script included and sample pod install logs: pod install image

App (app)

  • [NEW] Added appConfig & method support for setAutomaticDataCollectionEnabled & automaticResourceManagement
  • [NEW] Added app options support for gaTrackingId
  • [NEW] The [DEFAULT] Firebase app can now be safely initialised in JS, however this has some caveats;
    • Firebase services such as Performance Monitoring & Remote Config require the default app to be initialised through the plist/json file.
  • [BREAKING] Waiting for apps to init via .onReady() has been removed. initializeApp() now returns a promise to the same effect
  • [BREAKING] Trying to initialise the [DEFAULT] Firebase app in JS when it was already initialised natively will now throw an error (formerly warned)

App Invites (invites)

  • [NEW] Added createInvitation(title: string, message: string) method to replace construction an Invite from new firebase.invites.Invitation (this is still supported for now)
  • [WARNING] Deprecation notice printed when using Invites - it's now deprecated by Firebase and will be removed by January 2020 - the suggested migration path is switching to Dynamic Links and handling the sending of the link yourself.

Analytics (analytics)

  • [NEW] Added support for resetAnalyticsData()
  • [INTERNAL] setUserProperties now iterates properties natively (formerly 1 native call per property)
  • [BREAKING] all analytics methods now return a Promise, rather than formerly being 'fire and forget'

Crashlytics (crashlytics)

Blog post announcement: [Firebase Crashlytics for React Native]

  • [NEW] JavaScript stack traces now automatically captured and parsed js stack trace preview
  • [NEW] Optionally enable automatic reporting of JavaScript unhandled Promise rejections
  • [NEW] Added support for setUserName(userName: string)
  • [NEW] Added support for setUserEmail(userEmail: string)
  • [NEW] Added support for isCrashlyticsCollectionEnabled: boolean
  • [NEW][android] Added support for Crashlytics NDK reporting. This allows Crashlytics to capture Yoga related crashes generated from React Native.
  • [NEW][🔥] Added firebase.json support for crashlytics_ndk_enabled, this toggles NDK support as mentioned above, defaults to true
  • [NEW][🔥] Added firebase.json support for crashlytics_debug_enabled, this toggles Crashlytics native debug logging, defaults to false
  • [NEW][🔥] Added firebase.json support for crashlytics_auto_collection_enabled, this toggles Crashlytics error reporting, this is useful for user opt-in first flows, e.g. set to false and when your user agrees to opt-in then call setCrashlyticsCollectionEnabled(true) in your app, defaults to true
  • [BUGFIX][android] crash() now correctly crashes without being caught by React Native's RedBox
  • [BREAKING] setBoolValue, setFloatValue, setIntValue & setStringValue have been removed and replaced with two new methods (the Crashlytics SDK converted all these into strings internally anyway):
    • setAttribute(key: string, value: string): Promise<null> - set a singular key value to show alongside any subsequent crash reports
    • setAttributes(values: { [key: string]: string }): Promise<null> - set multiple key values to show alongside any subsequent crash reports
  • [BREAKING] all methods except crash, log & recordError now return a Promise that resolves when complete
  • [BREAKING] recordError(code: number, message: string)'s fn signature changed to recordError(error: Error) - now accepts a JS Error class instance
  • [BREAKING] setUserIdentifier() has been renamed to setUserId() to match analytics implementation
  • [BREAKING] enableCrashlyticsCollection()'s fn signature changed to setCrashlyticsCollectionEnabled(enabled: boolean)
    • This can be used in all scenarios (formerly only able to use this when automatic initialization of crashlytics was disabled)
    • Changes do not take effect until the next app startup
    • This persists between app restarts and only needs to be called once, can be used in conjunction with isCrashlyticsCollectionEnabled to reduce bridge startup traffic - though calling multiple times is still allowed

Functions (functions)

  • [BUGFIX] Fixed an issue where useFunctionsEmulator does not persist natively (Firebase iOS SDK requires chaining this method before other calls and does not modify the instance, Android however persists this)

In-App Messaging (fiam) - [NEW]

  • [NEW] Added support for firebase.fiam().isMessagesDisplaySuppressed: boolean;
  • [NEW] Added support for firebase.fiam().setMessagesDisplaySuppressed(enabled: boolean): Promise<null>;
  • [NEW] Added support for firebase.fiam().isAutomaticDataCollectionEnabled: boolean;
  • [NEW] Added support for firebase.fiam().setAutomaticDataCollectionEnabled(enabled: boolean): Promise<null>;

Instance Id (iid)

  • [NEW] Instance Id now supports multiple Firebase apps, e.g. firebase.app('fooApp').iid().get()

Performance Monitoring (perf)

The Performance Monitoring API has had a significant API change as originally highlighted would happen in the v5.x.x docs: image

  • [BREAKING] All Trace & HttpMetric methods (except for start & stop) are now synchronous and no longer return a Promise, extra attributes/metrics now only get sent to native when you call stop
  • [BREAKING] firebase.perf.Trace.incrementMetric will now create a metric if it could not be found
  • [BREAKING] firebase.perf.Trace.getMetric will now return 0 if a metric could not be found
  • [NEW] Added support for firebase.perf().isPerformanceCollectionEnabled: boolean
  • [NEW] Added firebase.perf().startTrace(identifier: string): Promise<Trace>; as a convenience method to create and immediately start a Trace

Remote Config (config)

The Remote Config API has had a significant API change as originally highlighted would happen in the v5.x.x docs: image

  • [BREAKING] All Remote Config values can now be accessed synchronously in JS, see getValue(key: string): ConfigValue & getAll(): ConfigValues below
    • [BREAKING] These replace all the original async methods: getValue, getValues, getKeysByPrefix
  • [BREAKING] setDefaultsFromResource now returns a Promise that resolves when completed, this will reject with code config/resouce_not_found if the file could not be found
  • [BREAKING] setDefaultsFromResource now expects a resource file name for Android to match iOS, formerly this required a resource id (something you would not have in RN as this was generated at build time by Android)
    • And example for both platforms can be found in the tests. We'll writeup up a guide for this at some point to show how to use the plist/xml defaults files on each platform.
  • [BREAKING] enableDeveloperMode has been removed, you can now use setConfigSettings({ isDeveloperModeEnabled: boolean }) instead
  • [BREAKING] setDefaults now returns a Promise that resolves when completed
  • [NEW] Added a new fetchAndActivate method - this fetches the config and activates it without the need to call activate() separately
  • [NEW] Added the following properties to firebase.config(); lastFetchTime, lastFetchStatus & isDeveloperModeEnabled
  • [NEW] Added a new setConfigSettings method - this allows setting isDeveloperModeEnabled, replaces the enableDeveloperMode method
    • This is a generic settings function to pre-emotively account for an upcoming future change to the native sdks - more settings to be added.
  • [NEW] All previous get* methods have been removed and replaced with 2 synchronous methods:
    • getValue(key: string): ConfigValue - returns a single configuration value { value, source }
    • getAll(): ConfigValues - returns all configuration values e.g. { some_key: { value, source }, other_key: { value, source } }

Note

: Multi-apps is not yet supported as the Firebase iOS SDK is missing support for it.

Storage (storage)

Blog post announcement (NOT LIVE YET): [Firebase Cloud Storage for React Native]

  • [NEW] Added support for put (Blob | ArrayBuffer | Uint8Array)
    • contentType mime type is automatically inferred from Blob
  • [NEW] Added support for putString and all StringFormat's (raw, base64, base64url & data_url)
    • contentType mime type is automatically inferred from data_url strings
  • [NEW] Added support multiple buckets, e.g. firebase.app().storage('gs://my-other-bucket')
  • [NEW] Added support pause(), resume() & cancel() for Upload & Download Storage tasks
  • [NEW] Added an error property to TaskSnapshot's for error state events - this is an instance of NativeFirebaseError (with code & message)
  • [BREAKING] Removed formerly deprecated UploadTaskSnapshot.downloadUrl property, use StorageReference.getDownloadURL(): Promise<string> instead
  • [BREAKING] StorageReference.downloadFile() is now deprecated and will be removed in a later release, please rename usages of this to getFile() - renamed to match Native SDKs
  • [BREAKING] firebase.storage.Native is now deprecated and will be removed in a later release, please rename usages of this to firebase.storage.Path
  • [BREAKING] firebase.storage.Native.* properties have been renamed and deprecated and will be removed in a later release, follow the in-app console warnings on how to migrate
  • [BUGFIX][android] Update/set metadata now correctly supports removing metadata values by passing a null property value in customMetadata
  • [BUGFIX][android] contentType mime type is now correctly determined in all scenarios, there was an edge case where it would just use the default value
  • [INTERNAL][android] downloadFile no longer uses a StreamDownloadTask, replaced with the newer FileDownloadTask

Messaging

MODULE STILL WIP

  • [NEW] Support setAutoInitEnabled(enabled: boolean) - this is useful for opt-in first flows

ML Kit Natural Language (mlKitLanguage) - [NEW]

  • [NEW] Implemented support for language identification APIs

Identify a single language:

const language = await firebase.mlKitLanguage().identifyLanguage('Hello there. General Kenobi.');
console.warn(language); // en

const unknownLanguage = await firebase.mlKitLanguage().identifyLanguage('foo bar baz', { confidenceThreshold: 0.9 });
console.warn(language); // und

Identify a multiple languages:

const identifiedLanguages = firebase.mlKitLanguage().identifyPossibleLanguages('hello world');
console.warn(identifiedLanguages[0].language); // en
const conversation = firebase.mlKitLanguage().newSmartReplyConversation();
conversation.addRemoteUserMessage('Hey, want to get lunch today?', Date.now(), 'jimBobTheGreat');
conversation.addLocalUserMessage('That sounds great!');
conversation.addRemoteUserMessage('Great, does 12pm work for you?', Date.now(), 'jimBobTheGreat');

const suggestedReplies = await conversation.getSuggestedReplies();
console.log(suggestedReplies); // [ { text: 'Sure' }, ...etc ]

ML Kit Translate APIs to come in a later release.

Utils

  • [NEW] Added support via isRunningInTestLab for checking if an Android application is running inside a Firebase Test Lab environment