Those Who Swift - Issue 290
Weekly note ✏️You add one more tool to your workflow. Then another. Your app works fine in testing, your build still completes, and nothing seems particularly wrong. Until one day, something takes twice as long or the app runs out of memory. This week, we’re looking at a few examples of costs that are easy to miss until they start causing trouble. Have a story of your own? Hit reply. I’m always interested in the bugs and performance issues that turned out to be more complicated than they first appeared. The AI Agent for Your RevenueCat DataMeet Rico, RevenueCat's embedded AI app growth advisor for subscription apps. Ask questions about churn, trials, pricing, paywalls, or retention and get answers using your app's real subscription data directly inside RevenueCat and Slack. Built to help iOS developers make smarter monetization decisions faster. The Budget You Didn’t Know You Were Spendingwith Divya Ravi — Technical Editor Every engineering team has something that started as a small, sensible addition and somehow became a problem nobody planned for. Maybe it’s a dependency nobody wants to remove. Maybe it’s a build step that adds a few seconds every time someone touches it. Or maybe it’s a perfectly good tool that turns out to be a lot more expensive than expected. This week’s three articles cover different versions of that problem. Antoine van der Lee compared Xcode 27.1’s built-in MCP with RocketSim’s CLI for controlling the iOS Simulator. One finding stood out: Xcode’s tool made the agent read roughly seven times more text per action. That’s a substantial difference. But Xcode also needed fewer calls and could build and launch the app. So, is RocketSim the better choice? Not necessarily. The answer depends on the task and the cost of the entire workflow, not just one number. It’s a good reminder that a tool can save you time in one place while spending more resources somewhere else. Natasha The Robot ran into a different version of this while managing her Claude setup. Skills, plugins, and MCP servers kept getting added because each one was useful. Eventually, the setup became harder to manage, with overlapping tools and conflicting instructions. If you’ve ever looked at your project’s dependency list and wondered how half of it got there, you know the feeling. The solution isn’t to stop using tools. It’s to review what you’ve accumulated and decide what still deserves a place. Then there’s the problem that shows up on the user’s device. Sai Ram Kotha explains why an on-device AI feature can work perfectly during a quick test and still crash during a longer session. As a conversation grows, its key-value (KV) cache consumes more memory. Eventually, iOS may terminate the app under memory pressure. The frustrating part is that your initial testing might show nothing wrong. Open the app, try a few prompts, check the result, and everything looks good. The problem only appears when someone keeps using the feature. Anyone who’s debugged a memory issue in a production app knows why this matters. A clean launch and a successful test aren’t the same as an app that stays healthy throughout a real session. The common thread here isn’t that these tools or features are poorly built. It’s that the conditions change as we use them. More context gets processed, more tools enter the workflow, and more memory is needed. If we only measure the beginning, we miss what happens next. Here’s a small challenge for this week: pick one thing in your workflow that you haven’t measured in a while. Compare the cost of two tools you use regularly. Run your app for an hour instead of five minutes. Look at the dependencies you’ve added over the past year and see which ones you still need. You might find nothing. That’s fine. You might also find that the thing you’ve been blaming for a slow build isn’t the thing slowing it down at all. Those are usually the more interesting investigations. What’s a problem you’ve found only after something had been running for a while? Hit reply and tell me about it. Bonus points if the fix turned out to be much smaller than the investigation. Related reading on this week's theme 📚Xcode 27 MCP: higher token costs when navigating the SimulatorAntoine van der Lee compares Xcode 27.1’s built-in MCP with RocketSim’s CLI for controlling the Simulator. Xcode’s approach uses roughly seven times more text per action, but needs fewer calls and can build and launch the app. A useful comparison if you’re deciding which tool fits your workflow. 📍Level: Intermediate My Claude Skills Setup Was Getting Out of Control...Natasha The Robot describes how her collection of skills, plugins, and MCP servers grew until it became difficult to manage. She covers organizing external skills, removing overlap, and keeping the tools she relies on up to date. Worth a read if your development setup has accumulated more moving parts than you intended. 📍Level: Intermediate Your On-Device AI Doesn't Crash in Minute One. It Crashes at Minute SixtySai Ram Kotha looks at memory growth in on-device AI features. As the conversation grows, so does the KV cache, potentially pushing the app into memory pressure and eventual termination by iOS. He covers jetsam reports, memory warnings, and ways to keep context growth under control. 📍Level: Advanced This Week in Those Who Swift 🗞️The latest across Swift, Apple, AI, and the community. Swift Around the Web 🌐When Apps Are No Longer Tied to a Specific Operating SystemThis week’s Swift Weekly looks at projects that run apps from one operating system on another, including Cutefish’s Reef compatibility layer, SimRun, and Mac Android Subsystem. It also rounds up links on haptics, audio ducking, SwiftUI and AppKit debugging, and Claude Code context usage. A good read if you’re interested in what’s happening beyond the usual Apple platform boundaries. 📍Level: Intermediate Coding 👨💻Hit targets you can't see aren't affordancesKou walks through five interaction bugs in the video editor VertiCut where the visible controls and their actual hit areas didn’t line up. One hit area behaved like an ellipse, and a keyframe button could be hit only about 4% of the time. The fixes involve snapping, step buttons, and larger grab areas. It’s a useful reminder that getting a view to look right is only half the job. The interaction needs to work just as well. 📍Level: Intermediate iOS 27 has some weird Dynamic Island behaviorChristian Selig found a layout issue in iOS 27 involving Live Activities with an empty trailing compact view and the Apple’s own apps appear to avoid the issue by using UIKit directly. Selig is asking Apple to restore the behavior that If you’ve ever spent an afternoon chasing a layout discrepancy that only appears on a particular OS version, this one will feel familiar. 📍Level: Advanced Pocket Casts on iPhone DuoAlexander Grebenyuk shares how Pocket Casts was adapted for iPhone Duo. The changes include a larger mini player with skip controls and progress, plus a Now Playing screen that puts transcripts alongside the playback controls. He also describes using AI agents to run simulators in parallel and capture screenshots. That process uncovered horizontal safe-area issues. It’s a good example of testing more device configurations without having to check every layout manually. 📍Level: Intermediate What Bazel Thinks Has ChangedAdin Ćebić shows how to inspect Bazel’s server log with There’s an important caveat: those files aren’t necessarily the ones that caused build actions to run again, and the log lists at most ten paths per event. Still, it’s a useful place to start when a build is doing more work than you expected. 📍Level: Advanced Apple 🍏Offer your subscriptions to businesses and schoolsApple is introducing volume purchasing for app subscriptions, allowing organizations and schools to buy multiple seats through a single In-App Purchase and use their existing device management tools. The feature is enabled by default in App Store Connect unless it has been turned off. Sandbox testing is expected to begin in November, with group purchases planned for the App Store this winter. AI & Tooling 🤖Xcode Projects for the Command Line and Coding AgentsArtem Novichkov covers creating and editing Xcode projects from the terminal using Apple’s He also looks at CI validation, merge conflicts, and ways to let coding agents modify project files safely. Worth exploring if you’re trying to automate project maintenance without making project-file changes harder to review. 📍Level: Advanced Design🎨Designing Apps for iPhone Duo: Lessons From Adapting Three AppsStephen Dixon shares lessons from adapting Naturalis, AteIQ, and Cascade for iPhone Duo’s foldable display. His recommendations include thinking about how people hold the device, using two-page layouts where they make sense, and keeping important controls away from the fold. The interesting part is how much the device changes the design decisions. A larger screen isn’t always a reason to stretch the existing layout. 📍Level: Intermediate Designing for iPhone DuoThe developer behind Pockity describes working through iPhone Duo’s different folding positions. The process involved a temporary toolbar fix, reusing existing colour-blending and gradient code for the unfolded display, and adding a dedicated layout for the tent pose. It’s a practical look at adapting an existing app to a new form factor without rebuilding everything from scratch. 📍Level: Intermediate Dynamic Type for Custom Fonts in SwiftUI - A 4-Line FixThe developer behind Pockity describes working through iPhone Duo’s different folding positions. The process involved a temporary toolbar fix, reusing existing colour-blending and gradient code for the unfolded display, and adding a dedicated layout for the tent pose. It’s a practical look at adapting an existing app to a new form factor without rebuilding everything from scratch. 📍Level: Beginner Tutorials 📒Adapting your app for iPhone DuoMajid Jabrayilov shows how to make a SwiftUI app adapt to Duo's folded and unfolded screens using size classes, a sidebar-adaptable 📍Level: Intermediate Testing callbacks with confirmations in Swift TestingNatascha Fadeeva shows how Swift Testing’s She explains when confirmations are useful and why an async continuation is often a better choice when a callback is expected to return a single result. 📍Level: Intermediate How to use layoutMarginsGuide in SwiftUISarun Wongpatcharapakorn explains why fixed 16-point padding can fall short on iPhone Duo, where the available margins differ on either side of the vertical fold. The article covers iOS 27.1’s 📍Level: Intermediate A/B testing App Store screenshots on a small appRoland Leth looks at running App Store Product Page Optimization tests when an app doesn’t get enough traffic to detect small differences reliably. His approach is to test three distinct messaging angles rather than make minor changes to the same screenshot. He also covers uploading test variations through the App Store Connect API with a script written using Claude Code. A useful example of applying automation to a fairly ordinary, but time-consuming, release task. 📍Level: Intermediate Video 🎥I turned iPhone Duo into a real-life notebookPhil Traut demos a Duo notebook app where you write anywhere in your own handwriting or one of 12 custom fonts, and reopening shows the latest note or the one saved nearest your location. A short, charming look at what an app built for the fold can feel like. Thanks for reading Those Who Swift! Subscribe for free to receive new posts. 👇
|


