I hear more and more people these days talking about React Native. So I decided to share my thoughts from a native developer's point of view.
It's not the first time there was a technology that promised to write code once and deploy it anywhere. It's already been done with web apps and cross platform development tools like Xamarin or Titanium which all have problems of their own. But as I said, let's take a look at React Native here.
develop once, run anywhere
As I said before, React Native allows you to develop once and run the end result on iOS and Android. Hence development efforts along with associated costs are in theory cut in half compared to writing one native iOS and Android app
Live Reload / Hot Module Reload
React Native has a sound development environment with its most prominent features being Hot Module Reload and Live Reload. These enable developers to see the result of any code change nearly instantaneous without the need to recompile the app. This again cuts down on development time and costs.
Not so much a disadvantage at this point any more but still worth noting were issues around its licensing terms. Facebook clarified and this doesn't seem to be a problem any more for companies willing to adopt React Native. It nonetheless led the Apache Software Foundation to ban its use.
As a native developer you are depending on Apple's good grace to let your app into the App Store. With React Native there is just one more dependency in the form of Facebook not changing their licensing terms to your disadvantage.
React Native was born out of hackathon some two and a half years ago. Will React Native still be supported in a year or two? Developers putting all their money, time and effort on React Native should be aware that Facebook never committed to a roadmap. Facebook's decision to support it now doesn't mean they are going to do so in the future. Who knows what comes next? We are living in fast changing times where the next hot framework is just a hackathon away.
rapid development cycles
Rapid development cycles cause APIs to change quickly. Until now there have been some 50 React Native stable releases. Do you remember the pain going from Swift 2.x to Swift 3. You basically have two choices here: Either you update every 2-3 weeks to a stable release and go through a minor regression or you do it every once in a while but then need to put aside 1-2 days to update your app along with a major regression. The choice is yours.
Every software has bugs and so does React Native. At the time of this writing React Native has more than 500 issues and quite a few of these issues are crashes. With React Native there is one more component that can crash your app.
Apple Developer Program License Agreement
"Except as set forth in the next paragraph, an Application may not download or install executable code. Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS."
So far only React Native's code-push feature was affected by this. The way I see it, it only takes one major incident for Apple to revise their policy in regards to React Native Apps.
scalability and maintenance
I understand that a lot of web and Titanium developers are attracted by it since it uses the very language they are familiar with. If I was in their shoes, I probably would do it as well since it broadens the portfolio of apps I'd be able to support. But that aside, considering all the disadvantages, it doesn't make any sense to base your next app on it.
A company that only has limited development budget should not do it since the inherent risk of it being deprecated soon is just too big. A company that already has an iOS and Android app should not do it either since the cost of writing something new is always greater than maintaining something e.g. what about all those unit tests? There is also the option of using one app, iOS or Android, and gradually add React Native support to it. This can of course be done but I can't imagine an outcome of which there isn't a big mess of unstructured code at the end of the transition.