- 1.1. React Navigation
- 1.2. Splash Screen
- 1.3. Custom Fonts
- 1.4. Vector Icons
- 1.5 Pemissions
- 1.6 WebView
- 1.7 Network Info
- 1.8 QR Code Scanner
- 1.9 Redux
- 1.10 Firebase Core
- 1.11 Crashlytics
- 1.12 Analytics
- 1.13 Cloud Messaging
- 1.14 Notifications
- 1.15 Deep Linking
- 1.16 Maps
- 1.17 React Native Paper
Following are the installation steps for every features.
- Versions - react-native: 0.61.4 - react: 16.9.0
Note: Linking is Automatic in react native version > 0.60
Use react-native init "App_name" --version [email protected]
for creating a react-native app
Used for Navigating between screens
-
Version
4.0.10
-
Install
yarn add react-navigation
-
Dependencies
yarn add react-native-reanimated react-native-gesture-handler react-native-screens@^1.0.0-alpha.23
-
Android - To finalize installation of
react-native-screens
for Android, add the following two lines todependencies
section inandroid/app/build.gradle
:implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02' -
iOS
cd ios/ && pod install
-
Add-on packages
yarn add react-navigation-stack
- used for creating a stack navigatorcreateStackNavigator
-
Files implemented
- Router.js
Screen with app icon for performing mandatory events before app startup
-
Version
3.2.0
-
Install
yarn add react-native-splash-screen
-
Linking
-
Android:
- Automatic
-
iOS:
-
In XCode, in the project navigator, right click
Libraries
âžœAdd Files to [your project's name]
-
Go to
node_modules
âžœreact-native-splash-screen
and addSplashScreen.xcodeproj
-
In XCode, in the project navigator, select your project. Add
libSplashScreen.a
to your project'sBuild Phases
âžœLink Binary With Libraries
-
To fix
'RNSplashScreen.h' file not found
, you have to select your project → Build Settings → Search Paths → Header Search Paths to add:$(SRCROOT)/../node_modules/react-native-splash-screen/ios
-
-
-
Plugin Configuration
-
Android
Update the
MainActivity.java
to usereact-native-splash-screen
via the following changes:import android.os.Bundle; // here import com.facebook.react.ReactActivity; // react-native-splash-screen >= 0.3.1 import org.devio.rn.splashscreen.SplashScreen; // here // react-native-splash-screen < 0.3.1 import com.cboy.rn.splashscreen.SplashScreen; // here public class MainActivity extends ReactActivity { @Override protected void onCreate(Bundle savedInstanceState) { SplashScreen.show(this); // here super.onCreate(savedInstanceState); } // ...other code }
-
iOS:
Update
AppDelegate.m
with the following additions:#import "AppDelegate.h" #import <React/RCTBundleURLProvider.h> #import <React/RCTRootView.h> #import "RNSplashScreen.h" // here @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // ...other code [RNSplashScreen show]; // here // or //[RNSplashScreen showSplash:@"LaunchScreen" inRootView:rootView]; return YES; } @end
-
-
Usage
Import
react-native-splash-screen
in your JS file.import SplashScreen from 'react-native-splash-screen'
-
Android
Create a file called
launch_screen.xml
inapp/src/main/res/layout
(create thelayout
-folder if it doesn't exist). The contents of the file should be the following:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/launch_screen" android:scaleType="centerCrop" /> </RelativeLayout>
Customize your launch screen by creating a
launch_screen.png
-file and placing it in an appropriatedrawable
-folder. Android automatically scales drawable, so you do not necessarily need to provide images for all phone densities. You can create splash screens in the following folders:drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable-xxhdpi
drawable-xxxhdpi
Add a color called
primary_dark
inapp/src/main/res/values/colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="primary_dark">#000000</color> </resources>
Optional steps:
If you want the splash screen to be transparent, follow these steps.
Open
android/app/src/main/res/values/styles.xml
and add<item name="android:windowIsTranslucent">true</item>
to the file. It should look like this:<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="android:windowIsTranslucent">true</item> </style> </resources>
To learn more see examples
If you want to customize the color of the status bar when the splash screen is displayed:
Create
android/app/src/main/res/values/colors.xml
and add<?xml version="1.0" encoding="utf-8"?> <resources> <color name="status_bar_color"><!-- Colour of your status bar here --></color> </resources>
Create a style definition for this in
android/app/src/main/res/values/styles.xml
:<?xml version="1.0" encoding="utf-8"?> <resources> <style name="SplashScreenTheme" parent="SplashScreen_SplashTheme"> <item name="colorPrimaryDark">@color/status_bar_color</item> </style> </resources>
Change your
show
method to include your custom style:SplashScreen.show(this, R.style.SplashScreenTheme);
-
iOS
Customize your splash screen via
LaunchImage
orLaunchScreen.xib
,Learn more to see examples
-
-
Files implemented
- Splash.js
To use any font other than react-native provided fonts
-
Setup
-
Download the requried fonts and copy it to
./src/assets/fonts/
-
Create File
react-native.config.js
and add following code in root project and add following codemodule.exports = { project: { ios: {}, android: {}, // grouped into "project" }, assets: ['./src/assets/Fonts/'], };
-
use
react-native link
-
link command will links fonts in Info.plst for IOS and creates fonts directory
android/app/src/main/assets/fonts
for Android, where copies your fonts -
Use it as
fontFamily: "OpenSans-Bold"
in text style
-
-
Files implemented
- RNBaseText.js
Used for icons in application
refer https://oblador.github.io/react-native-vector-icons/ for icons catlog
-
Version
^6.6.0
-
Install
yarn add react-native-vector-icons
-
Android - To finalize installation of
react-native-vector-icons
for Android, add the following line at end of file inandroid/app/build.gradle
:apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
-
iOS
-
Add following lines in
ios/projectname/Info.plist
<key>UIAppFonts</key> <array> <string>AntDesign.ttf</string> <string>Entypo.ttf</string> <string>EvilIcons.ttf</string> <string>Feather.ttf</string> <string>FontAwesome.ttf</string> <string>FontAwesome5_Brands.ttf</string> <string>FontAwesome5_Regular.ttf</string> <string>FontAwesome5_Solid.ttf</string> <string>Foundation.ttf</string> <string>Ionicons.ttf</string> <string>MaterialCommunityIcons.ttf</string> <string>MaterialIcons.ttf</string> <string>Octicons.ttf</string> <string>SimpleLineIcons.ttf</string> <string>Zocial.ttf</string> </array>
-
-
Files implemented
- VectorIcons.js
Including Customs fonts in react native
-
Version
^6.6.0
-
Install
yarn add react-native-permissions
-
iOS
By default no permission handler is installed. Update your
Podfile
by choosing the ones you want to check or request, then runpod install
.# - Ensure that you have installed at least Cocoapods 1.5.0 # - Replace use_framework! with use_modular_headers! # (see http://blog.cocoapods.org/CocoaPods-1.5.0 for more details) target 'YourAwesomeProject' do # … permissions_path = '../node_modules/react-native-permissions/ios' pod 'Permission-BluetoothPeripheral', :path => "#{permissions_path}/BluetoothPeripheral.podspec" pod 'Permission-Calendars', :path => "#{permissions_path}/Calendars.podspec" pod 'Permission-Camera', :path => "#{permissions_path}/Camera.podspec" pod 'Permission-Contacts', :path => "#{permissions_path}/Contacts.podspec" pod 'Permission-FaceID', :path => "#{permissions_path}/FaceID.podspec" pod 'Permission-LocationAlways', :path => "#{permissions_path}/LocationAlways.podspec" pod 'Permission-LocationWhenInUse', :path => "#{permissions_path}/LocationWhenInUse.podspec" pod 'Permission-MediaLibrary', :path => "#{permissions_path}/MediaLibrary.podspec" pod 'Permission-Microphone', :path => "#{permissions_path}/Microphone.podspec" pod 'Permission-Motion', :path => "#{permissions_path}/Motion.podspec" pod 'Permission-Notifications', :path => "#{permissions_path}/Notifications.podspec" pod 'Permission-PhotoLibrary', :path => "#{permissions_path}/PhotoLibrary.podspec" pod 'Permission-Reminders', :path => "#{permissions_path}/Reminders.podspec" pod 'Permission-Siri', :path => "#{permissions_path}/Siri.podspec" pod 'Permission-SpeechRecognition', :path => "#{permissions_path}/SpeechRecognition.podspec" pod 'Permission-StoreKit', :path => "#{permissions_path}/StoreKit.podspec" end
If you encounter the error
Invalid RNPermission X. Should be one of: ()
, first check that you link at least one permission handler. If you did, try to cleanup Xcode junk data withnpx react-native-clean-project --remove-iOS-build --remove-iOS-pods
_Then update your
Info.plist
with wanted permissions usage descriptions:<?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> <!-- Keep only the permissions used in your app --> <key>NSAppleMusicUsageDescription</key> <string>YOUR TEXT</string> <key>NSBluetoothAlwaysUsageDescription</key> <string>YOUR TEXT</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>YOUR TEXT</string> <key>NSCalendarsUsageDescription</key> <string>YOUR TEXT</string> <key>NSCameraUsageDescription</key> <string>YOUR TEXT</string> <key>NSContactsUsageDescription</key> <string>YOUR TEXT</string> <key>NSFaceIDUsageDescription</key> <string>YOUR TEXT</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>YOUR TEXT</string> <key>NSLocationAlwaysUsageDescription</key> <string>YOUR TEXT</string> <key>NSLocationWhenInUseUsageDescription</key> <string>YOUR TEXT</string> <key>NSMicrophoneUsageDescription</key> <string>YOUR TEXT</string> <key>NSMotionUsageDescription</key> <string>YOUR TEXT</string> <key>NSPhotoLibraryUsageDescription</key> <string>YOUR TEXT</string> <key>NSRemindersUsageDescription</key> <string>YOUR TEXT</string> <key>NSSpeechRecognitionUsageDescription</key> <string>YOUR TEXT</string> <key>NSSiriUsageDescription</key> <string>YOUR TEXT</string> <!-- … --> </dict> </plist>
-
Android
Add all wanted permissions to your app
android/app/src/main/AndroidManifest.xml
file:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myawesomeapp"> <!-- Keep only the permissions used in your app --> <uses-permission android:name="android.permission.ACCEPT_HANDOVER" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.BODY_SENSORS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_MMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.USE_SIP" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALL_LOG" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" /> <!-- … --> </manifest>
-
Files implemented
- PermissionsUtils.js
Used for displaying web pages and local html content
-
Version
7.5.1
-
Install
yarn add react-native-webview
-
Android
- Automatic
-
iOS
cd ios/ && pod install
-
Files implemented
- WebView.js
Used for getting the network information.
-
Version
4.6.1
-
Install
yarn add @react-native-community/netinfo
-
Android
- Automatic
-
iOS
cd ios/ && pod install
-
Files implemented
- NetwrokInfo.js
To scan QR codes using mobile Camera
-
Version
1.3.1
-
Install
yarn add react-native-qrcode-scanner
-
Requirements
-
iOS
-
With iOS 10 and higher you need to add the "Privacy - Camera Usage Description" key to the info.plist of your project. This should be found in 'your_project/ios/your_project/Info.plist'. Add the following code:
<key>NSCameraUsageDescription</key> <string>Your message to user when the camera is accessed for the first time</string> <!-- Include this only if you are planning to use the camera roll --> <key>NSPhotoLibraryUsageDescription</key> <string>Your message to user when the photo library is accessed for the first time</string> <!-- Include this only if you are planning to use the microphone for video recording --> <key>NSMicrophoneUsageDescription</key> <string>Your message to user when the microsphone is accessed for the first time</string>
-
Android
With Android 7 and higher you need to add the "Vibration" permission to your AndroidManifest.xml of your project. This should be found in your
android/app/src/main/AndroidManifest.xml
Add the following:<uses-permission android:name="android.permission.VIBRATE"/>
-
-
Dependencies
-
Install
yarn install react-native-permissions
-
Install
yarn install react-native-camera
-
Android Insert the following lines in
android/app/build.gradle
:inside defaultConfig block insert:
android { ... defaultConfig { ... missingDimensionStrategy 'react-native-camera', 'general' <-- insert this line } }
-
iOS
-
Add the plugin dependency to your Podfile, pointing at the path where NPM installed it:
pod 'react-native-camera', path: '../node_modules/react-native-camera'
-
Run
pod install
Note: You might need to adjust your Podfile following the example below:
target 'yourTargetName' do # See http://facebook.github.io/react-native/docs/integration-with-existing-apps.html#configuring-cocoapods-dependencies pod 'React', :path => '../node_modules/react-native', :subspecs => [ 'Core', 'CxxBridge', # Include this for RN >= 0.47 'DevSupport', # Include this to enable In-App Devmenu if RN >= 0.43 'RCTText', 'RCTNetwork', 'RCTWebSocket', # Needed for debugging 'RCTAnimation', # Needed for FlatList and animations running on native UI thread # Add any other subspecs you want to use in your project ] # Explicitly include Yoga if you are using RN >= 0.42.0 pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga' # Third party deps podspec link pod 'react-native-camera', path: '../node_modules/react-native-camera' end post_install do |installer| installer.pods_project.targets.each do |target| if target.name == "React" target.remove_from_project end end end
-
-
-
Files implemented
- QRCodeScanner.js
Global state management tool
-
Version
4.0.4
-
Install
yarn add redux
-
Dependencies
- react-redux
- version
7.1.3
- install
yarn add react-redux
- version
- redux-logger
- version
3.0.6
- install
yarn add redux-logger
- version
- redux-persist
- version
1.0.2
- install
yarn add redux-persist
- version
- redux-thunk
- version
2.3.0
- install
yarn add redux-thunk
- version
- react-redux
-
Files implemented
- App.js
- Store.js
- ReduxDemo.js
Adding Project to Firebase for using firebase features
- Version
5.5.6
- Install
yarn add react-native-firebase
The first thing you'll need to have is an active Firebase project.
If you already have an existing project you can skip to the Platform Specific Installation section.
-
Creating a new project
-
Visit the Firebase console.
-
A dialog will appear as shown below
-
Enter your new project name and modify the project id and region if necessary
-
Click
Create Project
when finished -
Your project will now be created - this can take a few seconds
-
Once created click the
Continue
button -
Once created you'll be redirected to the project homepage as show below
-
Both Android and iOS require additional installation steps, please follow the platform specific guides bellow:
-
Android
-
Setup google-services.json
A google-services.json file contains all of the information required by the Firebase Android SDK to connect to your Firebase project. To automatically generate the json file, follow the instructions on the Firebase console to "Add Firebase to your app".
Once downloaded, place this file in the root of your project at
android/app/google-services.json
.The following instructions are also described on the Firebase console when going through the wizard.
In order for Android to parse this file, add the google-services gradle plugin as a dependency to your project in the project level
build.gradle
file:buildscript { // ... dependencies { // ... classpath 'com.google.gms:google-services:{{ android.gms.google-services }}' } }
To apply the plugin to your project, add the following to the VERY BOTTOM of your app
android/app/build.gradle
file:apply plugin: 'com.google.gms.google-services'
-
Add Firebase modules
The Firebase modules need to be installed as project dependencies. In the
android/app/build.gradle
file, add the following:dependencies { // This should be here already implementation project(':react-native-firebase') // Firebase dependencies implementation "com.google.android.gms:play-services-base:{{ android.gms.play-services-base }}" implementation "com.google.firebase:firebase-core:{{ android.firebase.core }}" ...
-
Update Gradle
Due to some breaking changes in v12+ of the Android Firebase libraries, you'll need to upgrade your Gradle version to at least v4.4 and make a few other tweaks as follows:
-
In
android/gradle/wrapper/gradle-wrapper.properties
, update the gradle URL togradle-4.4-all.zip
-
In
android/build.gradle
check that you havegoogle()
specified in the buildScript repositories section:buildscript { repositories { google() // <-- Check this line exists and is above jcenter jcenter() // ... } // ... }
-
In
android/build.gradle
update Android build tools to version{{ android.build.tools }}
:classpath 'com.android.tools.build:gradle:{{ android.build.tools }}'
-
In
android/app/build.gradle
update all yourcompile
statements to beimplementation
, e.g.implementation project(':react-native-firebase')
-
When running your app from within Android Studio, you may encounter
Missing Byte Code
errors. This is due to a known issue with version 3.1.x of the android tools plugin: here . You'll need to disable Instant Run to get past this error.
-
-
Update Google Play service maven repository
Google Play services from 11.2.0 onwards require their dependencies to be downloaded from Google's Maven respository so add the required reference to the repositories section of the project level
build.gradle
(android/build.gradle
):allprojects { repositories { mavenLocal() google() // <-- Add this line above jcenter jcenter() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } } } ```
-
-
iOS
1. Firebase Installation
-
1.1. Setup GoogleService-Info.plist
A
GoogleService-Info.plist
file contains all of the information required by the Firebase iOS SDK to connect to your Firebase project. To automatically generate the plist file, follow the instructions on the Firebase console to "Add Firebase to your app".Once downloaded, place the file in the root of your iOS app at
ios/[YOUR APP NAME]/GoogleService-Info.plist
.Make sure that the
GoogleService-Info.plist
file has been added to your project within XCode. -
1.2. Initialise Firebase
The following instructions are also described on the Firebase console when going through the wizard.
To initilize the native SDK in your app, add the following to your
ios/[YOUR APP NAME]/AppDelegate.m
file:A) At the top of the file:
#import <Firebase.h>
B) At the beginning of the
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
method add the following line:[FIRApp configure];
?> It is recommended to add the line within the method BEFORE creating the RCTRootView. Otherwise the initialization can occur after already being required in your JavaScript code - leading to
app not initialised
exceptions. -
1.3. Install Firebase Library
-
Option 1: Cocoapods (Recommended)
Firebase recommends using Cocoapods to install the Firebase SDK.
-
1.3.0. If you don't already have Cocoapods set up Follow the instructions to install Cocoapods and create your Podfile here.
The Podfile needs to be initialised in the
ios
directory of your project. Make sure to update cocoapods libs first by runningpod update
-
Troubleshooting
-
When running
pod install
you may encounter an error saying that atvOSTests
target is declared twice. This appears to be a bug withpod init
and the way that react native is set up.Resolution:
- Open your Podfile
- Remove the duplicate
tvOSTests
target nested within the main project target - Re-run
pod install
.
-
When running
pod install
you may encounter a number of warnings relating totarget overrides 'OTHER_LDFLAGS'
.Resolution:
- Open Xcode
- Select your project
- For each target:
-- Select the target
-- Click Build settings
-- Search for
other linker flags
-- Add$(inherited)
as the top line if it doesn't already exist - Re-run
pod install
-
When running
pod install
you may encounter a warning that a default iOS platform has been assigned. If you wish to specify a different minimum version:Resolution
- Open your Podfile
- Uncomment the
# platform :ios, '9.0'
line by removing the#
character - Change the version as required
-
After installation you encounter an error like
RNFirebase core module was not found natively on iOS
.Resolution
- It's most likely you did not run
pod update
to get the latest pod versions - Run
pod update
- You should see updated versions of your pods installed
- You may need to re-run
pod install
- It's most likely you did not run
-
-
1.3.1. Check the Podfile platform version
We recommend using a minimum platform version of at least 9.0 for your application to ensure that the correct version of the Firebase libraries are used. To do this, you need to uncomment or make sure the following line is present at the top of your
Podfile
:platform :ios, '9.0'
-
1.3.2. Add the required pods
Simply add the following to your
Podfile
either at the top level, or within the main project target:# Required by RNFirebase pod 'Firebase/Core', '~> {{ ios.firebase.core }}'
Run
pod install
.You need to use the
ios/[YOUR APP NAME].xcworkspace
instead of theios/[YOUR APP NAME].xcproj
file from now on.
-
-
-
Option 2: Manual frameworks (Not Recommended)
If for some reason you are unable to use Cocoapods, then you need to manually unzip the Firebase SDK to the
ios/Firebase
folder, and then drag all desired frameworks and Firebase.h to the project (as documented in the README), in order to be picked up by React Native Firebase.
-
-
Android
-
Add the Firebase Crashlytics dependency to
android/app/build.gradle
:dependencies { // ... implementation('com.crashlytics.sdk.android:crashlytics:{{ android.firebase.crashlytics }}@aar') { transitive = true } }
Crashlytics also requires the Fabric Gradle dependency. In your projects
android/build.gradle
file, add the plugin to your dependencies and also check that you have version {{ android.gms.google-services }} of the google-services plugin:buildscript { // ... dependencies { // ... classpath 'com.google.gms:google-services:{{ android.gms.google-services }}' classpath 'io.fabric.tools:gradle:{{ android.fabric.tools }}' } }
You need to add
maven { url 'https://maven.fabric.io/public' }
to yourandroid/build.gradle
as follows:buildscript { repositories { jcenter() maven { url 'https://maven.fabric.io/public' } } // ... }
At the top of your
android/app/build.gradle
file, below other plugins, apply theio.fabric
plugin:apply plugin: "com.android.application" apply plugin: "io.fabric"
-
Install the RNFirebase Crashlytics package
Add the
RNFirebaseCrashlyticsPackage
to yourandroid/app/src/main/java/com/[app name]/MainApplication.java
:// ... import com.facebook.react.ReactApplication; import io.invertase.firebase.fabric.crashlytics.RNFirebaseCrashlyticsPackage; // <-- Add this line public class MainApplication extends Application implements ReactApplication { // ... @Override protected List<ReactPackage> getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List<ReactPackage> packages = new PackageList(this).getPackages(); // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); packages.add(new RNFirebaseCrashlyticsPackage()); // <-- Add this line return packages; } }; // ... }
-
-
iOS
-
Pods (recommended)
-
Add the pods
Add the following to your
Podfile
:pod 'Fabric', '~> {{ ios.fabric.tools }}' pod 'Crashlytics', '~> {{ ios.firebase.crashlytics }}'
Run
pod update
. -
Add the Crashlytics run script
-
Open your project in Xcode and select its project file in the Navigator
-
Open the Build Phases tab.
-
Click + Add a new build phase, and select New Run Script Phase.
-
Add the following line to the Type a script.. text box:
"${PODS_ROOT}/Fabric/run"
-
-
-
Android
-
Add the
RNFirebaseAnalyticsPackage
to yourandroid/app/src/main/java/com/[app name]/MainApplication.java
:// ... import com.facebook.react.ReactApplication; import io.invertase.firebase.analytics.RNFirebaseAnalyticsPackage; // <-- Add this line public class MainApplication extends Application implements ReactApplication { // ... @Override protected List<ReactPackage> getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List<ReactPackage> packages = new PackageList(this).getPackages(); // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); packages.add(new RNFirebaseAnalyticsPackage()); // <-- Add this line return packages; } }; // ... }
-
-
iOS
-
Device Identification
If you would like to enable Firebase Analytics to generate automatic audience metrics for iOS (as it does by default in Android), you must link additional iOS libraries, as documented by the Google Firebase team. Specifically you need libAdIdAccess.a and AdSupport.framework
The way to do this using Cocoapods is to add this to your Podfile (though please use the most current Pod version supported by react-native-firebase):
pod 'GoogleIDFASupport', '~> 3.14.0'
-
-
Android
-
Add the dependency
Add the Firebase Cloud Messaging dependency and optional ShortcutBadger dependency to
android/app/build.gradle
:dependencies { // ... implementation "com.google.firebase:firebase-messaging:{{ android.firebase.messaging }}" implementation 'me.leolin:ShortcutBadger:1.1.21@aar' // <-- Add this line if you wish to use badge on Android }
-
Install the RNFirebase Messaging package
Add the
RNFirebaseMessagingPackage
to yourandroid/app/src/main/java/com/[app name]/MainApplication.java
:// ... import com.facebook.react.ReactApplication; import io.invertase.firebase.messaging.RNFirebaseMessagingPackage; // <-- Add this line public class MainApplication extends Application implements ReactApplication { // ... @Override protected List<ReactPackage> getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List<ReactPackage> packages = new PackageList(this).getPackages(); // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); packages.add(new RNFirebaseMessagingPackage()); // <-- Add this line return packages; } }; // ... }
-
Update Android Manifest
Add the following to
android/app/src/main/AndroidManifest.xml
:Within the application component, add the messaging service:
<application ...> <service android:name="io.invertase.firebase.messaging.RNFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application>
For RNFB versions less than 5.2.0 only; add the instance ID service:
<application ...> <service android:name="io.invertase.firebase.messaging.RNFirebaseInstanceIdService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> </application>
-
(Optional) Background Messages
If you want to be able to react to data-only messages when your app is in the background, e.g. to display a heads up notification, then you need to add the following to
android/app/src/main/AndroidManifest.xml
:<application ...> <service android:name="io.invertase.firebase.messaging.RNFirebaseBackgroundMessagingService" /> </application>
-
-
iOS
-
Add the pod
Add the following to your
Podfile
:pod 'Firebase/Messaging', '~> {{ ios.firebase.messaging }}'
Run
pod update
. -
Setup Certificates
Please follow the instructions on the Firebase docs on how to setup your APN certificates with FCM.
-
Enable Capabilities
In Xcode, enable the following capabilities:
- Push Notifications
- Background modes > Remote notifications
-
Debugging
If you're having problems with messages not being received, check out the following blog post for help:
https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html
-
-
Android
-
Add the
RNFirebaseNotificationsPackage
to yourandroid/app/src/main/java/com/[app name]/MainApplication.java
:// ... import com.facebook.react.ReactApplication; import io.invertase.firebase.notifications.RNFirebaseNotificationsPackage; // <-- Add this line public class MainApplication extends Application implements ReactApplication { // ... @Override protected List<ReactPackage> getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List<ReactPackage> packages = new PackageList(this).getPackages(); // Packages that cannot be autolinked yet can be added manually here, for example: // packages.add(new MyReactNativePackage()); packages.add(new RNFirebaseNotificationsPackage()); // <-- Add this line return packages; } }; // ... }
-
Update Android Manifest
Add the following to
android/app/src/main/AndroidManifest.xml
:Add permissions:
<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.VIBRATE" />
Set app launch mode inside activity props:
<activity ... android:launchMode="singleTop" >
-
Default icon and color (Optional)
Within the application component, add metadata elements to set a default notification icon and color. Android uses these values whenever incoming messages do not explicitly set icon or color.
<application ...> <!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" /> </application>
-
Notification channels (Optional)
From Android 8.0 (API level 26) and higher, notification channels are supported and recommended. FCM provides a default notification channel with basic settings. If you prefer to create and use your own default channel, set default_notification_channel_id to the ID of your notification channel object as shown; FCM will use this value whenever incoming messages do not explicitly set a notification channel.
<application ...> <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id"/> </application>
-
Scheduled Notifications (Optional)
If you would like to schedule local notifications then you also need to add the following to the application component of
android/app/src/main/AndroidManifest.xml
:<application ...> <receiver android:name="io.invertase.firebase.notifications.RNFirebaseNotificationReceiver"/> <receiver android:enabled="true" android:exported="true" android:name="io.invertase.firebase.notifications.RNFirebaseNotificationsRebootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON"/> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> </application>
-
-
iOS
-
Update
AppDelegate.m
Add the following import to the top of your
ios/[App Name]/AppDelegate.m
:#import "RNFirebaseNotifications.h"
Add the following to the
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
method, right after[FIRApp Configure]
:[RNFirebaseNotifications configure];
Add the following method:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { [[RNFirebaseNotifications instance] didReceiveLocalNotification:notification]; }
-
Remote Notifications (Optional)
If you would like to support Remote Notifications via FCM, also add the following import to the top of your
ios/[App Name]/AppDelegate.m
:#import "RNFirebaseMessaging.h"
Then add the following methods to your
ios/[App Name]/AppDelegate.m
:- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{ [[RNFirebaseNotifications instance] didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; } - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [[RNFirebaseMessaging instance] didRegisterUserNotificationSettings:notificationSettings]; }
-
-
Android
-
In your
android/app/src/main/AndroidManifest.xml
file, add a new intent filter to the activity that handles deep links for your app (for react-native this is usually the MainActivity), and specify the host and the scheme:<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="example.page.link" android:scheme="http"/> <data android:host="example.page.link" android:scheme="https"/> </intent-filter>
-
-
If you wish to receive the intent in an existing instance of MainActivity, you may set the launchMode of MainActivity to singleTask in AndroidManifest.xml. See activity documentation for more information.
<activity android:name=".MainActivity" android:launchMode="singleTask">
-
iOS
-
Add the pod
Add the following to your
Podfile
:pod 'Firebase/DynamicLinks', '~> {{ ios.firebase.links }}'
Run
pod update
. -
Configure XCode
-
In your Firebase console, open the Dynamic Links section.
-
Accept the terms of service if you are prompted to do so.
-
Take note of your project's Dynamic Links domain, which is displayed at the top of the Dynamic Links page. You need your project's Dynamic Links domain to programmatically create Dynamic Links. A Dynamic Links domain looks like app_code.page.link
-
-
Ensure that your app's App Store ID and your Apple Developer Team ID is specified in your app's settings. To view and edit your app's settings, go to your Firebase project's Settings page and select your iOS app. You can confirm that your Firebase project is properly configured to use Dynamic Links in your iOS app by opening the following URL:
https://example.page.link/apple-app-site-association
If your app is connected, the apple-app-site-association file contains a reference to your app's App Store ID and bundle ID. For example:
{"applinks":{"apps":[],"details":[{"appID":"1234567890.com.example.ios","paths":["/*"]}]}}
-
In the Info tab of your app's XCode project, create a new URL type to be used for Dynamic Links. Set the
Identifier
field to a unique value and the URL scheme field to either your bundle identifier or a unique value. -
In the Capabilities tab of your app's Xcode project, enable Associated Domains and add the following to the Associated Domains list:
applinks:app_code.page.link
whereapp_code
is your dynamic links domain application code as in step 1.2 above. -
Update your
AppDelegate.m
file:-
Import RN Firebase Links header file:
#import "RNFirebaseLinks.h"
-
Add the following to the
didFinishLaunchingWithOptions
method before[FIRApp Configure]
:[FIROptions defaultOptions].deepLinkURLScheme = CUSTOM_URL_SCHEME;
^-- where
CUSTOM_URL_SCHEME
is the custom URL scheme you defined in your Xcode project. -
Add the following inside the
@implementation AppDelegate
annotation:- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options { return [[RNFirebaseLinks instance] application:application openURL:url options:options]; } - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler { return [[RNFirebaseLinks instance] application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; }
You might run into situation when you need to handle more than one link configuration i.e. when using react native linking for deeplinks if that is the case you can perform check below
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { BOOL handled = [RCTLinkingManager application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; if (!handled) { handled = [[RNFirebaseLinks instance] application:application openURL:url options:options]; } return handled; } - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler { BOOL handled = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; if (!handled) { handled = [[RNFirebaseLinks instance] application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; } return handled; }
-
-
-
-
Install
yarn add react-native-maps -E
-
Android
-
If you've defined project-wide properties (recommended) in your root
build.gradle
, this library will detect the presence of the following properties:buildscript {...} allprojects {...} /** + Project-wide Gradle configuration properties */ ext { compileSdkVersion = xxx targetSdkVersion = xxx buildToolsVersion = "xxx" minSdkVersion = xxx supportLibVersion = "xxx" playServicesVersion = "xxx" // or set latest version androidMapsUtilsVersion = "xxx" }
or do
buildscript { ext { buildToolsVersion = "xxx" minSdkVersion = xxx compileSdkVersion = xxx targetSdkVersion = xxx supportLibVersion = "xxx" playServicesVersion = "xxx" // or set latest version androidMapsUtilsVersion = "xxx" } }
-
If you do not have project-wide properties defined and have a different play-services version than the one included in this library, use the following instead (switch 10.0.1 for the desired version):
... dependencies { ... implementation(project(':react-native-maps')){ exclude group: 'com.google.android.gms', module: 'play-services-base' exclude group: 'com.google.android.gms', module: 'play-services-maps' } implementation 'com.google.android.gms:play-services-base:10.0.1' implementation 'com.google.android.gms:play-services-maps:10.0.1' }
-
(React Native all versions) Specify your Google Maps API Key:
Add your API key to your manifest file (
android/app/src/main/AndroidManifest.xml
):<application> <!-- You will only need to add this meta-data tag, but make sure it's a child of application --> <meta-data android:name="com.google.android.geo.API_KEY" android:value="Your Google maps API Key Here"/> </application>
-
-
iOS
-
If you want to enable Google Maps on iOS, obtain the Google API key and edit your
AppDelegate.m
as follows:+ #import <GoogleMaps/GoogleMaps.h> @implementation AppDelegate ... - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GMSServices provideAPIKey:@"_YOUR_API_KEY_"]; // add this line using the api key obtained from Google Console ... ``` The `[GMSServices provideAPIKey]` should be the **first call** of the method.
-
Add the following to your Podfile above the
use_native_modules!
function and runpod install
in the ios folder:# React Native Maps dependencies rn_maps_path = '../node_modules/react-native-maps' pod 'react-native-google-maps', :path => rn_maps_path pod 'GoogleMaps' pod 'Google-Maps-iOS-Utils'
-
-
Setup
-
To get smaller bundle size by excluding modules you don't use, you can use our optional babel plugin. The plugin automatically rewrites the import statements so that only the modules you use are imported instead of the whole library. Add
react-native-paper/babel
to theplugins
section in yourbabel.config.js
for production environment. It should look like this:module.exports = { presets: ['module:metro-react-native-babel-preset'], env: { production: { plugins: ['react-native-paper/babel'], }, }, };
-
The
PaperProvider
component provides the theme to all the components in the framework. It also acts as a portal to components which need to be rendered at the top level.If you have another provider (such as
Redux
), wrap it outsidePaperProvider
so that the context is available to components rendered inside aModal
from the library:import * as React from 'react'; import {Provider as PaperProvider} from 'react-native-paper'; import {Provider as StoreProvider} from 'react-redux'; import App from './src/App'; import store from './store'; export default function Main() { return ( <StoreProvider store={store}> <PaperProvider> <App /> </PaperProvider> </StoreProvider> ); }
-