RocketSim: Enhancing the iOS Simulator for productivity

RocketSim is released and available from the Mac App Store as of today. It all started with building a productivity tool to improve my own workflow and it ended up in releasing my very first Mac App.

I have been developing other apps of my own but this is the first one I really think adds value to others too. After a few months of trying it out myself, it’s time to share it with you.

Of course, the date is set to Tuesday, January 9th, 2007, with the time set to 9:41 AM so all your recordings are aligned with Apple Standards

With the idea of this being only the beginning I can’t wait to receive your valuable feedback and get insights into how others will use the app. To get you excited to try it out I’ll go over the problems RocketSim solves and how it helps me to share and develop features.

If you can’t wait to try it out, you can get RocketSim from the Mac App Store

Sharing progress to designers with Simulator recordings

In my day to day job, I’m developing a lot of new features into the Collect by WeTransfer app. These features are often based on designs that are delivered in Figma. However, the final implementation details might bring up questions that I have to discuss with the team or the designers.

I could share my screen or I could use simctl to record a video of the feature. However, this is not always that easy and takes me out of my development flow.

Recording the Xcode iOS Simulator

RocketSim solves this problem by making it super easy to record the iOS simulator from its status bar menu.

Use RocketSim to create a recording of the iOS Simulator
Use RocketSim to create a recording of the iOS Simulator

It uses the focused simulator and starts recording directly after clicking “Start recording” from the menu. Of course, the date is set to Tuesday, January 9th, 2007, with the time set to 9:41 AM so all your recordings are aligned with Apple Standards.

Recordings are automatically saved into a RocketSim subfolder of your Movies folder and the file is opened in Finder after the recording is stopped from the menu.

The only thing left is to copy and paste the video to share the problem, feature, or impressive animation with your team!

Note: At the moment of writing this blog post, the update containing the recording functionality is still in review. If this is not yet available to you, it will be very soon!

Testing Universal Links

Universal Links make it possible to open content directly in your app. Transfer links get opened directly in the Collect App, location URLs in Apple Maps, and GitHub repositories inside the GitHub app. Those are examples of implementations that rely on universal linking.

Universal links, also known as deeplinks, can be hard to test. You have to manage all types of universal links and make it easy to open them in the simulator. Before RocketSim, I was keeping a list of links in notes, which I would copy into Safari on the simulator so I could open them with the Smart App Banner.

Right now, I’ve created groups for both staging and production so I can easily access them from the RocketSim menu. Those testing links are private but a similar group for Apple Maps could look as follows:

Testing universal links with RocketSim
Testing universal links with RocketSim

The greatest thing is that you can set a shortcut to re-run the latest launched deeplink. The shortcuts only work when the simulator is active so they don’t override other app shortcuts (I couldn’t use CMD+SHIFT+D for sending emails anymore, eat your own dog food!).

Last but not least, you can directly execute deeplinks from the clipboard. This helped me to quickly open a transfer that was shared with me to reproduce certain specific bugs. If you often have to test universal links in your app, this will be a great productivity booster.

The road to releasing RocketSim

My first commit dates back to August 2019. It was one of my first experiences with developing macOS apps and resulted in a lot of frustration. Known issues like setting the background color on a UIView, eeeeh, NSView all passed by. Several shout outs on Twitter, messages to developers like Benedikt Terhechte, Rui Aureliano, Boy van Amstel, all helped me to become more experienced on this platform.

8 Months later while being busier than ever due to moving to a new house, I found myself more than ever focused on delivering this tool to other developers. While we have to work from home, I’m saving myself time as I don’t have to commute to the office! This time is used wisely!

Sandbox enabled and shared in the Mac App Store

One of the things that slowed down the process (and motivation) has been deciding to go for the Mac App Store or not. I’m building a developer tool which is most of the time a lot easier to build without the restriction of Sandboxing.

Therefore, I started by developing functionalities that I would otherwise get for free. I implemented an update mechanism using Sparkle and explored Gumroad for distribution. Although those tools work great, they did take some time as I was less familiar with them compared to working with the App Store.

After 2 months of losing motivation to continue with RocketSim, I decided to go with the challenge of making the same functionality work within a Sandbox enabled app. Once it turned out to be possible I found back my motivation and developed lots of hours for a few days in a row. The end result is that you can download RocketSim from a trusted source with updates delivered right inside the Mac App Store.

However, this was not a simple challenge. RocketSim is trying to find out the front-most simulator so it executes its actions in the Simulator that’s currently used. Although this sounds relatively simple to do, it turned out that screen recording was required to make this really accurate.

Screen recording for such a simple thing

One of the things that surprised me on my journey was the fact that a simple thing like getting the precise name of a Simulator was not possible without Screen Recording Permissions.

It makes sense if you think about it, as you would otherwise be able to read the title of a Word document that could potentially contain private data. However, I was now getting “Simulator”, the name of the Simulator app, instead of “iPhone 11” and I could no longer find out which simulator was currently front-most. I needed this to open the universal links or perform recording in the currently focused Simulator.

I tried using Apple events with a temporary exception for sending events to the Simulator. This worked in a Sandbox enabled app and even got accepted into the Mac App Store! (Yes, I released a few weeks ago already to test some things out without having too many users downloading it). However, patch update 1.0.1 was reviewed by another reviewer and got rejected without having touched that code. I guess it’s the story of the difference in App Reviews strictness…

My journey restarted and I found out that Screen Recording permissions were my last resort to make this functionality really accurate. I decided to make this opt-in as I was sure to get back a lot of complaints if a developer tool would require screen recording permissions for launching a link in the simulator. As a backup, I’m comparing the Simulator window screen ratio to a list of device ratios I have hard-coded in the app. This, however, would fail if two Simulators with the same ratio are opened, like an iPhone 11 and an iPhone 11 Pro.

Nevertheless, I’m happy to be able to release to the Mac App Store, despite the fact that this feature isn’t working as great as it could without having Sandbox enabled. Improvements to the backup implementation are already planned and funny enough, trying to beat every puzzle to keep my app working with Sandbox enabled is somehow quite driving my motivation to improve RocketSim!

Supporting Catalina and up

Another thing I was not used to is testing a Mac app in different environments. There’s no macOS Mojave Simulator as far as I know and it really made it hard for me to fix a crash happening on that OS only.

I even tried using remote access on Bitrise to quickly build the Xcode project on macOS Mojave and see whether that could help me solve the issue. Of course, a virtual machine or external disk with an older OS is the way to go but I haven’t set this up yet.

I hope to find a better solution for testing RocketSim on older operating systems. If so, I’m happy to add support to Mojave as well.

Note: With the help of my friend Jordi Bruin I most likely found the solution to support Mojave as well. Keep an eye close to this issue for updates.

The future of RocketSim

The tricky part of releasing an app while you’re busy with lots of other things is deciding on what to add to your minimum viable product. You have to pick your battles and you can’t simply add everything! Well, you can, but in my case, that would mean that I will never release and lose my motivation again. I would probably end up doing nothing with the project.

It helped me to aim to release as soon as possible. It might mean that there are still a lot of things to make better but that’s absolutely for a reason. I want to get it out and I want to learn from others where the product should go. Therefore, I’m aiming to make it really easy for users to report bugs and request features.

Reporting bugs and feature requests

The project will not be open-sourced. Still, I decided to open a GitHub repository for managing bugs and feature requests. It allows me to develop in the open and get insights into what issues are most important for users to be fixed. Of course, it helps that I’m building a developer tool so I’m pretty sure that all my end users are familiar with GitHub.

Reporting a bug or requesting a feature is as simple as creating an issue in the RocketSim public repository. Now I only need to find a way to get a voting system for features!

Staying up to date on current development

I’ve opened a Twitter account not long ago at which I often show previews of features that are developed. I’ve also purchased rocketsim.app which for now simply redirects to the GitHub page. Obviously, the plan is to make this a quality product landing page.

Conclusion

It’s been a journey with ups and downs but I’m really happy to share my story. Developing an app for macOS is more fun than I thought but it’s definitely something different compared to building iOS apps. Hopefully, SwiftUI will make this a bit easier but up until now, I’m still learning!

You can get RocketSim from the Mac App Store and stay tuned for more valuable features that make you more productive as an iOS developer. Let me know if you have any feedback that can help me improve the quality of RocketSim.

Thanks!