I also configured automatic cross-platform builds on Bitrise, a CI/CD provider that Very uses on some projects. That was mostly simple, except for code signing on iOS, which is "easy" assuming you don't run into trouble. Once you've "stepped in it" with code signing, though, I found it difficult to untangle.
Just deleting all my provisioning profiles and certificates, requesting an entirely new set from Apple Developer's website (completely outside Xcode), and then manually importing them did the trick. But I felt a little deflated that the only time I truly felt stuck in this whole enterprise was this step, and it felt so opaque to troubleshoot.
Once configured, a push to the main branch on GitHub would kick off a job on Bitrise to build new, versioned, signed releases for both iOS and Android, and also push them up to their respective app stores.
The Apple App Store offers a simple way to do invite-only beta tests with TestFlight. My first build was "reviewed" and released on TestFlight within 48 hours. From there, TestFlight on my iPhone started downloading the latest builds as they came in from Bitrise.
My road to the Google Play Console was rockier because a rough draft of my app description included the word "coronavirus stay-at-home orders" (as a reason climbers may opt to train at home). This triggered a round of higher scrutiny — I had not realized that the app description field would be reviewed for an invite-only alpha. Ultimately, with revised content in that field and an appeal to Google, my alpha was released through Google Play as well. I did like that invite-only alpha and public-beta releases are handled through Google Play’s primary store app, rather than requiring something separate.
Ultimately, I found App Store Connect to more clearly explain review status and drive next steps, and while TestFlight is another app to have testers install, it’s simple. On the other hand, Google Play Console offers much more robust release multitracking tools but suffers from conflicting messaging within the user interface that can lead to confusion about review status and blockers.
Recap and Roadmap
So that was fun. Having little to do while staying-at-home made it come together a lot faster. It is still "minimum viable prototype" as an app — but that's okay. It meets what I came for:
- Has a usable interval timer for my own hangboard adventures — shareable with friends.
- Gave me exposure to React Native, its fundamentals, tools, build techniques, as well as the nature, opportunities, and limitations of its cross-platform capabilities.
- First Play Console and App Store Connect process exposure so I can help guide my clients through this exciting but intimidating part of their launches.
Good Enough, but Not "Done" Done
A rough roadmap of things that are needed, in rough priority order:
- Being able to climb for real again...
- This desperately needs a code review for technique and macro-level best practices. There are many competing examples and practices on how to "properly" build in this stack, but it's all new and evolving quickly. Even within React Native's own documentation, there are big discrepancies.
- After a review for "do I know what I'm doing," I need to lint this code for its micro-level structure and syntactical transgressions, which I assume are many.
- I should learn more about functional exports versus classes, why object-oriented structures seem to have fallen out of favor, and more sustainable (DRY) ways to handle CSS-in-JS.
- And if I ever get it in my head to release this publicly, it needs better design and more circuits/content.
React Native did get me from “I wonder what it would be like to build a mobile app” to having a compiled app running on both major platforms on physical devices in my hands in record time. I can definitely see why this approach has gained traction so quickly when it’s well-suited. The intimidating part was the number of moving pieces through many levels of abstraction, but the community is active and documentation is evolving quickly to help with that.
Meanwhile, I’ve got my strength trainer hanging over the stairs and two phones to holler at me to use it every day (well, maybe just “often”). That might be it for a while.
Stay healthy, folks. We’ll be back together one day. I’m looking forward to it.