Could you introduce your app in a few sentences?
MobiLinc X is a home automation app for the popular ISY-994i controller from Universal Devices. With MobiLinc X, users control their INSTEON and Z-Wave lights, thermostats, irrigation, garage door, etc from their iOS and Android devices. MobiLinc X is focused on the homeowner and making daily interactions with their home a seamless and simple experience for them and their family members.
What made you decide to use/switch to React Native?
Before MobiLinc X, I wrote the original MobiLinc Pro 10 years ago for the iPhone and expanded to Android in 2010 along with the iPad. Each of these versions of MobiLinc was native to the platform which resulted in multiple code bases with the ever-increasing complexity of code to maintain.
Any app that has survived as long as MobiLinc has, needs a new coat of paint every now and again. About a year ago I needed to decide what I wanted to do with MobiLinc and how I could solve my developer pain points with maintaining multiple apps and code bases. MobiLinc really needed a new design refresh that brought the app forward into a modern look and feel along with a number of other features like cross-app/platform syncing of settings for homes that use iOS and Android. Just updating the UI code of the existing MobiLinc apps wasn’t going to cut it since there was some serious work that needed to be done to support these new under the hood features.
Most of my backend servers and services are all written in Node. Having that JS background was a natural stepping stone into exploring React Native and how RN apps work and feel on devices. I briefly considered other cross-platform tools like Flutter, but the number of open source packages for RN/JS along with critical RN/JS SDK support for some of my backend syncing technology stack sealed RN for me to use in the rewrite.
How did you transition to React Native?
Most of my backend services are written in Node and I’m comfortable in the JS environment. My first step was to pick some of the key features I knew I needed to work and run a small proof of concept test to make sure that RN would support these. Once I proved out that my key features would be supported by RN, I spent several months working with the prototyping tool Framer, which incidentally, uses JS and RN concepts to build out UI components. Once I felt that the prototype met the needs of my rewrite goals and validated it with a select group of my users, I set out to write the new MobiLinc X app in RN.
Have your tried other cross platform technologies before using React Native?
I haven’t tried any other cross-platform tools. I use Parse Server to support a number of features I needed for the rewrite and at the time, RN was the only cross-platform tool supported by Parse Client.
What has your experience been working with React Native in terms of app performance, have you noticed any impacts?
Overall I’m pretty pleased with the performance of React Native, especially on the latest 0.59 RN release. My initial version was on 0.56 before the new JSI for Android was introduced and performance on Android was marginal at best. I’m happy that after upgrading to 0.59, overall Android performance mirrors iOS performance which is satisfactory for my app use case. There are a couple of things I have to be aware of like long-running JS threads. When these pop up, I have to break these down into smaller chunks to avoid locking up the UI thread. My only other pain point is AsyncStorage
for Android. AsyncStorage
for iOS works great, but on Android, it is broken. It was severely broken in RN 0.56 to the point where I just had to rewrite it for 0.56. In 0.59, AsyncStorage is maintained by the RN Community and on Android, the latest is still broken and I had to hack out parts to get it to work on Android: https://github.com/react-native-community/react-native-async-storage/issues/84
How has adopting React Native affected developer productivity?
The development speed boost I get using RN is unlike anything else I’ve experienced as a software developer. The upgrade process and the tooling needs some work, but once everything is working and in sync, I can focus on just the business logic side and make great things happen quickly which is a fun experience. I’ve been writing iOS apps since 2008 and I’ve never felt more productive than when I’m writing in RN.
Which tools, libraries and frameworks are part of your development process with React Native?
I use VSCode as the IDE and debugger and fall back to XCode and Android studio for build related issue or trying to debug something on the native side.
What resources have you used to learn React Native? Books, tutorials, courses etc. Anything you can recommend?
I didn’t use any resources aside from using Google to look up various errors I’d run into. Since my app is based on the remx package from the WIX team, experimenting with their demo app was probably the best resource for me in terms of getting started.
What are some things that you don’t like about React Native or that need to be improved?
The upgrade process and overall tooling really needs work. When things go south and the app won’t launch or run, you end up having to shut everything down, clear caches, reboot, etc to get it working again which can really derail the flow and productivity for the day.
Anything else you would like to mention?
I wrote about my experience in more detail over on Medium