Updated October 5, 2016
Tools and Services used in a Production React Native + Meteor App
Originally publish on medium.com.
A common question (or series of questions) that I’ve had over the last few months is “what do you use for X?”. Today I’ll walk you through a few of the modules and services we’ve used in a production app that uses React Native (iOS & Android) and Meteor (backend).
Hosting
For hosting the Meteor app we use Galaxy. It’s super simple, built specifically for Meteor, fairly priced, and most importantly it’s been reliable.
Mobile Deployment
Our deployment process is still pretty simple and manual. To deploy to Meteor we’ve set up npm scripts so we can run npm run deploy-staging or npm run deploy-production which will the deploy it to the right environment. The scripts are simple, along the lines of
DEPLOY_HOSTNAME=galaxy.meteor.com meteor deploy --settings settings.json awesome-app.meteorapp.com
As for the mobile app we’ve got two options — since so much of a React Native app is written in Javascript we can ship code over-the-air (OTA) and the traditional way, through the respective app stores.
For our OTA updates we’re using CodePush, which is incredibly simple to use. Much like Meteor we’ve got an npm script that handles things, it’s very similar to
code-push release-react AwesomeApp ios
For iOS we’ve set up Fastlane, here’s a great article on setting it up within React Native. It takes out a few of the intermediary steps with Xcode & iTunes Connect.
Android is bare bones for us because it’s really simple to actually upload a new build. It’s one command to build the app and then we upload the apk to the play store. I wrote an article on how to prepare your React Native android app for production a while back.
Beta Testing
To handle Beta testing amongst the team and a small external group we’ve been using HockeyApp. It’s worked well and was simple to set up. We’re only using the beta distribution aspects, not any of the extra stuff.
Linting
To ensure consistent code quality we’ve been using ESLint with the Airbnb config. This helps us better stay in line with the Airbnb Javascript style guide, which we’ve adopted as our standard.
Push Notifications
To handle push notifications, a given for any mobile app now, we’ve used AWS SNS. It makes sense for us because it’s reliable, fits in with other parts of AWS we plan to use, and multiple people on the team are already familiar with AWS services.
Once you get it set up it’s easy, but setting it up can be a bit tricky — atleast the first time around.
Image Processing
Images can be a pain. To handle image transformations we’re using Cloudinary. It’s extremely powerful and a joy to use, though it can be a little pricey for high volumes.
Analytics
Right now our analytics are being handled by Mixpanel. It was mostly a choice given the team who is working off of the data so I haven’t had much experience with it. I have to say I was impressed by how much information about the device it automatically adds to a user’s “profile”, which makes debugging and user/device issues much easier.
Offline Storage
Our client app state is managed via Redux and we wanted to make sure that the user has a decent offline experience, should that instance arise. So we’ve chosen to use redux-storage to handle our offline state. There are other alternatives (like redux-persist), but I haven’t had any issues with redux-storage.
I hope that gives you some insight on what tools and services we use to build a React Native app, backed by Meteor, that’s been in production for a few months now. I’ve used this setup with a team of 2–4 developers. Have any further questions? Let me know!