Our iOS apps were originally implemented in Objective-C, but for a few years now, Apple has recommended writing all apps in their newest programming language, Swift. I’m working on a ground-up rewrite of our apps in Swift.
To try it out, go to this link:
Expect to reinstall the app quite a bit
You’ll likely need to uninstall and reinstall the app from time to time.
What’s new:
- 5.0.0
- Initial beta.
- Support for Liquid Glass on iOS 26.
- Lots of little animations everywhere.
- The iPad stats screen now appears on the right-hand side.
- There’s a new button on the Settings screen to “Download all games.” When you use it, all games will be available offline. It’ll take a few minutes to run; the next time you tap it, it will skip downloading games that are up to date; it should refresh in under a minute.
There are a lot of modes to test
I’m pretty sure the app kinda sorta works on iPhones and iPads, but there are a lot of different ways to use an iOS app:
- Different operating system versions: As of Sep 2025, this omnibus beta supports iOS 17, 18, and 26. (Users on iOS 16 and lower can continue to use the older version of the omnibus.)
- Offline: Test the app in airplane mode. (Once you’ve downloaded a game, you should be able to play it offline.)
- Dark Mode: Test the app in dark mode / light mode. Note that you can choose a color scheme on the Settings page; the app initially prefers to match you phone’s settings, but if you choose a color scheme in Settings, that setting will stick, even if you change your phone’s settings. (There’s no way to switch back to automatic mode, except to reinstall the app.)
- iPad: iPad is quite different from iPhone, especially when you hold your iPad in landscape mode, with the stats screen appearing on the side, updated live. In iPadOS 26, you can resize app windows to any size you want, and they should all work.
Accessibility modes
- Screen Reader: On iOS, this is called VoiceOver. How to Navigate your iPhone or iPad with VoiceOver | Apple Support
- Voice Control: How to use Voice Control on iPhone, iPad, and iPod touch | Apple Support
- Font Size: In your phone’s Accessibility settings, you can go to Display and Text Size → Larger Text to increase the font size very large. It won’t necessarily look great, but it should be legible; everything should work.
- Reduced Motion: This will disable animations, including the page curl animation in the game
- Controller: TODO You can plug a controller into your phone and play that way. (Doesn’t work yet as of Sep 22 2025.)
How the app works
I wrote these bullets to give you an idea for how you might think about testing the app, poking around in all the hidden-away corners that might not be obvious when you first open the app.
How the app works
Store Tab
The Store tab is the first tab you see as you launch the app. It has four or five sections:
- Recommended games (unlabeled): Top 5 games sorted by Bestselling (see below)
- Similar to [Last Played] (only visible if you’ve played a game)
- Bestselling
- New Releases
- Top Rated
Bestselling, New Releases, and Top Rated have “View All” links that take you to the Search tab.
How Bestselling sort works (Store Tab + Search Tab)
When sorting by bestselling, if there are any games/DLCs currently on sale (or temporarily free), we sort those to the top of the list. (Except, if you’ve already purchased the products that are currently discounted, we don’t sort those to the top.)
(Putting games on discount is not possible to test on TestFlight.)
Search Tab
- Search box: You can type stuff in it to search for games.
- Genre tags: Select any number of genres.
- “Free” is special: There’s also a special “Free” genre that applies only to games that are “free to win,” meaning that you don’t have to pay anything to enjoy the entire game.
- Sort order: Select a sort order (and click the arrow to reverse that sort order).
- Detail/Grid Switcher: Tap the round button on the right edge to switch between “grid view” and “detail view.” In Grid view, you see a compact grid of cover art images + titles. In detail view, we also show author, 80-character description, ratings, and price. (It’s particularly odd to search by price/ratings when that data isn’t visible in the search results.)
My Library Tab
Includes three sections:
- Last Played
- Favorites
- Purchased
Settings Tab
Here you can sign in/out. When signed in, you can click a link to delete your user profile (but it just takes you to our web site in Safari).
There are other settings here, too:
- Push notifications (see below)
- Font size
- Background color
- Animate between pages (i.e. curl animation)
- Enable touch slide controls
- Offline: There’s a button here to download all games
Game Details
- Free games: To play a Free game, you’ll have to watch a full-screen advertisement first.
- Cover art: Tap on a game and you’ll navigate to the Game Details screen. You can tap on the cover art to see the full-size cover art.
- Full description: Initially, we show the 155-character description, and the word “Loading…” but then we show the first paragraph of the full description, with a “Read more…” button.
- Game series: For games that are part of a series, we show the episode number, and link to the series on the Search tab.
- Authors: Each author is separately clickable, taking you to the Search Tab. (Some games include “additional content.” Those authors are clickable, too.)
- You can also click on the genre tags to find more games in that genre.
- Restart: Initially, the option to restart is hidden. Once you play a game and make at least one choice, you can return to the Game Details screen and restart.
- Delay Breaks: For Free games that include a delay break, you’re not allowed to restart until the delay break is finished. The restart button will appear, but it’ll just pop-up an alert if the timer’s not done yet.
- Restore purchases: You can login with a Choice of Games account to restore purchases. (We also refresh your purchase history with Apple when you click “Restore purchases.”) We display an alert message if you restore the game but thu current game is not yet purchased.
- Credits: There’s a link to read credits here, too.
Inside the game
- Stats Screen
- Layout
- On small screens (phones), you’ll start on the “main” screen with a “Show Stats” button in the toolbar.
- On larger screens (iPad) in portrait, when you tap the “Show Stats” button, the stats will appear in a popover.
- On larger screens (iPad) in landscape, the stats appear automatically on the right-hand side of the main screen; they’ll automatically update as you change stuff in the main game. You can tap the “sidebar” icon in the upper right to hide the Stats screen sidebar.
- Restoring a checkpoint from the Stats screen: When you restore a checkpoint on the Stats screen, it will affect the main game screen.
- *finish on the Stats screen: When you reach a *finish command on the Stats screen, it will close the Stats screen. On phones, you’ll navigate back to the main screen; on iPad, the stats screen will close/hide.
- Some games modify stats on the stats screen, e.g. for settings (Storyteller mode) or for cheats. Those changes only kick in when you tap "Next back in the main game.
- Layout
- Achievements
- Layout
- On phones, when you tap “Show Stats,” if the current game includes achievements, you can tap “Achievements” to see the list of achievements you have/haven’t achieved.
- On portrait iPad, there’s an Achievements button on the main game screen.
- On landscape iPad, tap the “…” button to reveal the Achievements menu.
- Restarting the game does not undo achievements. (Reinstalling the app does undo achievements.)
- Layout
- You’ll see a banner ad if you haven’t purchased the game.
- For Free games, you’ll eventually hit a delay timer.
- During the timer, you won’t be allowed to restart the game.
- If you’re signed up for push notifications (see below), the timer will send you a push notification when it’s finished.
- At the end of the timer, you’ll have to watch a full-screen advertisement to continue.
- At the end of the game, you’ll have some special menu options.
- Review this game: If you rate a game 9 or 10, we’ll prompt you to review the app on the app store.
- Share with friends: We’ll pop up a little sharing sheet, inviting you to send the link to someone via one of the apps you have installed.
- Subscribe: We’ll prompt you to send an email to subscribe@choiceofgames.com, which will sign you up for our mailing list. (This even works offline; the email will eventually get sent when you get back online.)
Push notifications
To send push notifications, we have to prompt the user. But, if we prompt the user and they say no, we’re not allowed to prompt the user again in-app, even if they tap a “please notify me” button. So, we have to be very careful about how/when we prompt for notifications.
We have a red notification reminder banner that appears at the top of the Store, Search, and My Library tabs, but we don’t show it when you first launch the app. We only show the red banner once you’ve started playing one of our games (i.e. when “Last Played” is not empty) and only when you’re not signed up for push notifications.
You can trigger the notification prompt by tapping on the banner or on the “Notify me” switch on the Settings tab. But, if you decline the prompt, we can’t prompt you again until you reinstall the app.
If you decline the prompt, and you tap the notification banner or the “Notify me” switch again, we’ll prompt you to send you to the Settings app, where you can tap on a switch to enable notifications.
Test notifications with a Free game’s delay breaks
Search for the Free genre and you’ll turn up some games that are free to win. All of them include delay break, where you have to wait a few seconds/minutes to continue. If you’re signed up for push notifications, you’ll receive a push notification when the timer runs down.
Known bugs
General
- “Restore Purchases” on Free games opens an ad
- If you try to load the Credits page without playing the game once, it won’t load.
- If you’re offline when you try to download and play a game for the first time, it will fail without showing an error message.
- On iOS 26, if you’re on the My Library or Settings tab, and you tap the Search tab, it will take you to the Store tab. You then have to tap the Search tab again to actually load the Search tab.
- When you watch a full-screen advertisement, it messes up the status bar, showing the back button overlaid on top of the current time.
- The old app used a fancy fuzzy search engine when you type stuff in the box. The current search is very strict, and has no way to sort by relevance.
- The full description on the game detail screen won’t load when you’re offline, even if you’ve already downloaded the game.
Visual glitches
- When scrolling the Store page sections, the scroll bar overlaps the bottom row of the grid; it looks kinda ugly.
- On iPad, when you tap on a game, the game detail screen appears and then shifts up by a quarter inch as the tab bar at the top disappears.
- On iPad, when you go to the Search tab and tap the grid/detail switcher, it’s stretched really wide across the screen, which doesn’t look good.
- Rotating the screen to/from portrait/landscape inside a game can make the font look weirdly large/small. (I’m not 100% sure what makes this happen/not happen.)
- On the Search tab, selecting a genre should make all the other genres animate to squeeze in, but sometimes the animation doesn’t happen. (I’m not 100% sure what makes this happen/not happen.)
Dark Mode
- When you first install the app, you’ll see a flash of a white background the first time you launch a game. (I think this can happen under other circumstances, too.)
- There are light borders around the advertisements.
- There are light borders when holding the iPhone in landscape.
- When rotating the iPad app from portrait to landscape and vice versa, you can see a flash of a light background.
- When you tap “Sign in” on the Settings page, the login screen is always in light mode.
Accessibilty → Display & Text Size → Larger Font
- On the game detail screen, there’s a bunch of blank space after the author, then rating stars, then a bunch more blank space, and finally the Try Now / Purchase buttons.
- At the largest font size, on the Store screen, the “g” in ratings can get clipped off.
- The “View All” links on the Store screen should wrap to the next line, instead of crowding the header.
- The “Order by” options on the Search screen should wrap to multiple lines, instead of getting crowded in.
Accessibility
- In Voice Control, in the game, when you Show Numbers or Show Names, it flags both the radio button and the option text as options to select, which clutters the screen.
- In VoiceOver, we should autofocus on the first paragraph on the screen when the game loads for the first time.
- In VoiceOver, when you swipe right from the “Search” heading, we should navigate you to the “Search by genre” heading, but we just navigate to the first genre on the list. (There are a huge number of search genres. You can skip past them by using the rotor and navigating by headings, but that’s not very easy to discover unless we reveal some kind of heading before the options.)
- In VoiceOver, the genre links on the Game Details page are treated as one big block; you can’t navigate to individual links.
Features Coming Soon
- Porting the updated app to Android. (It’s written in a way that it can automatically transpile to Android, but we’re focusing on iOS right now.)
- Heart’s Choice. Need to add search filters for Spice Level and Gender Options.
- Controller support
- Make it easier to find our Free games on the Store tab. (I might just include the genre list there…?)
- Splash screen as you launch the app
- Font selector, allowing you to pick between serif, sans-serif, and dyslexia friendly fonts
- More control over which games you download and keep downloaded. The old iOS app would download games into a “cache” folder; iOS was allowed to delete any downloaded games there if you got low on disk space. Now, we download games into an “application support” folder, which never gets cleaned up. Maybe there would be a setting to allow iOS to autodelete some games but not others.