Native development advantages
- Superior performance - Many hybrid frameworks assure that the applications written with their technology will have a performance as good as a native application. Simply put, that’s not the case - every native app will have direct access to the platform functionalities, resulting in better performance. Native apps are built with the framework that is native to the platform whereas hybrid applications depend on plugins and extensions to make use of any system functionality. The UI for hybrid platforms is based on a web, reducing the performance and customization capabilities.
- Better maintainability - Since hybrid applications are heavily dependent on plugins or native extensions to communicate with the native frameworks, the developers will have to be constantly checking library versions, issues and changes to maintain the application up to date and working properly. Hybrid applications have the same codebase for every platform. However, if the application has one or more extensions, the codebase forks to every platform where the application is deployed to.
- Hybrid not so hybrid - Some hybrid frameworks (i. e.: React Native) let developers create their own extensions in the native framework to make customizations using system functionalities. In these cases the developers will need to maintain code in different platforms, losing in part the advantages of going hybrid.
- Easier data protection - It is much easier to make a native application secure using the standards and functionalities of each native platform, without third-party libraries. For example, using biometric authentication (fingerprint, face unlock).
- Simplified development - Native applications will have the ability to connect to the device hardware, features, and databases. Moreover, in order to use these features, the native framework has built-in libraries, having smaller and not so heavily libraries/plugins dependent apps.
- More comprehension - The developers have much more documentation and information to work with - more comprehensive IDEs, detailed errors, which are easier to find, identify and fix. A native application developer is already aware of all the strengths and weaknesses of using well-established technologies rather than depending on third-party plugins with unknown bugs.
- Better user experience - With a better performance we have a better user experience - not only that but having native app developers can and will make the application compliant with the user experience expected for every platform. For instance, gestures, animations, specific UI elements, etc.
React Native’s advantages
- Time-saving - Perhaps the key advantage of React Native in mobile development is the amount of time and resources it enables to save due to the single codebase for both Android and iOS. So, in the case that you need to build and release an app on both App Store and Google Play in an extremely short time period, React Native is exactly what you need. Besides, it will not only save time but also human resources, because instead of having two people working on the same project for iOS and Android, you will be able to involve only one front end developer. However, keep in mind that due to the reasons mentioned above, native development might become necessary, so it’s better to at least have some native developers as consultants on any issues.
- Faster app-building - It is a well-known fact, that building an app using native instruments can be a long-lasting burden. It is especially exhausting when you need to rebuild an app with such insignificant changes implemented like different text color or label size. There is a great solution in React Native called “hot reloading” that works in an incremental way, therefore it enables us to inject and rebuild only the changed modules, and not all the code every time. In addition, there is a “live reloading” tool that automates the building process, so that you don’t need to do it manually every time — React Native will make a rebuild every time the code changes.
- Responsive UI/UX - React Native provides the developers with FlexBox — a tool that is already being successfully used in web development. FlexBox gives the necessary instruments for creating a nice responsive and intuitive UI. FlexBox is a good opponent to Android’s Constraint Layout and XML as well as iOS’ XIB and Storyboard. The only disadvantage, which has already been mentioned above, is the inability to use some native specific APIs like Camera, GPS or TouchID, tools for animation and complex UI. So if you need an app with sophisticated animations or complex interface components — it is better to take advantage of native programming.
React Native’s disadvantages:
- Poor documentation - The first and maybe one of the biggest disadvantages for React Native developers is the absence of adequate documentation. All the available info is mostly obsolete, and there is too little data about how to set up the testing environment. For those who are not acquainted with JavaScript, it will be very difficult to find out how it all works in a fast way.
- The need for native coding - For those who think that the knowledge of JavaScript only is enough to develop an app that will be more or less fine — throw this thought away. Well, of course, if you need a simple app without any platform-specific features or extremely difficult logic, then this disadvantage will probably pass you by. Otherwise, here is the bad news: you can’t build a good mobile app without the help of native coding since it doesn’t support all the native APIs. For example, these are things that can’t be made with React Native instruments only:
- Deep linking;
- Push notifications;
- Many specific UI elements.
So, if you are a web developer without any native mobile experience, you won’t be able to create, for example, photo-editors, players, Bluetooth-connected apps, AI, ML, social networks, and messengers using JavaScript only. Moreover, whenever there is an OS update, it takes some time for React Native to implement the support of these updates. Obviously, any native developer will easily find a way to link a native module or a library, while a pure “JavaScripter” will have to spend some extra time figuring out the working solution.
- UI difficulties - The same problem as the previous one: Android and iOS have their own design guidelines to follow, Material Design and Human Interface Guidelines accordingly. So, in this case, a single codebase doesn’t work. However, if it’s ok for a certain project that the apps look similar on both platforms, then surely using React Native will speed up the processes of development and maintenance at a great scale. Moreover, for iOS developers, it will be not that comfortable since React Native doesn’t have a visual interface editor; instead, it has a JSX-layout — which is an advantage for Android developers who are used to XML, that is pretty similar to JSX.
- Instability - Unlike mature native languages, React Native is a relatively young and constantly emerging platform. Therefore, it has a lot of glitches and bugs. Unfortunately, Facebook developers don’t really pay too much attention to fixing bugs and other issues, unless there is something directly connected to their Facebook apps. The framework doesn’t even have a 1.0 version yet. Moreover, no one can guarantee that Facebook developers won’t shut down React Native’s support at some point, as they did with their backend-as-a-service Parse platform all of a sudden. In this case, it can be concluded that React Native is not a good choice for long-term mobile development, that presupposes software maintenance and new features developed over time.
The Future
While native iOS and Android are here to stay, and they will remain with us in the foreseeable future, the future of React Native is uncertain. It is true that the React Native community is growing and expanding very quickly, but with the current React Native version still not being 1.0 (current version is 0.61), we are yet to see the best of React Native. It was developed by Facebook, so the React Native developers are at its mercy because it is possible that at some point Facebook decides to stop maintaining it. This has happened before with Parse, which shut down on 28 January 2017, forcing all current users to switch to a new service. The thought of this happening to React Native is scary indeed, but it could happen. Also, while React Native tends to keep up with the native trends, there will always be a time gap between some new features (Face ID, for example) emerging on the native platform and the same feature being included in React Native. This means that developing anything using fresh technology will take more time. Another thing worth noting is that Facebook regularly updates React Native, but they are not very interested in fixing bugs that don’t directly involve the Facebook app. The way React Native compiles XML to native code is a black box process. So, if there is some kind of error in a React Native component, you will either have to wait for Facebook to fix it, or fix it yourself, which requires going into native code.
Conclusions
In the end, is React Native worth it? The answer is: it depends on your project.
- Do you need to make an iOS-only or Android-only app? Go native.
- Do you have a small team with limited time and resources, and need to make an app for both platforms? Go React Native.
- Do you need to make a highly complex app that utilizes a large portion of platform-specific code? Go native.
- Do you want to take advantage of fast build time, and features such as hot reloading and live reloading? Go React Native.
- Do you plan to maintain the app over a long period of time, without fear of Facebook quitting React Native? Go native.
- Do your developers have a strong React/Web development background? Go React Native.
- Does your app need to support new mobile OS features as soon as they are released? Go native.
- Is your app going to look and behave the same on both platforms? Go React Native.
Based on our experience, we always recommend developing all mobile applications using the native implementation in order to avoid big problems in the future and reach a more stable version of the application at the end of the development.