Profile avatar
jacobstechtavern.com
Dad building iOS apps in London startups. Every week, I'll send you ludicrously in-depth, sometimes funny, articles about iOS, Swift, tech, & indie projects. https://blog.jacobstechtavern.com
957 posts 304 followers 1,094 following
Regular Contributor
Active Commenter

I cracked #12 in the rising leaderboard this week! 🄳

I’m a scientist at heart. While measuring SwiftUI scroll performance, I am running all of these profiles on my iPhone 15 Pro, running iOS 18.3.2 to ensure a fair test. Since the system decides when to run at 120fps vs the regular 60, I couldn’t consistently get CADisplayLink to call back at 120Hz

Fitting Lapse into a 15MB app clip: Forking a dependency As part of our onboarding, we use PhoneNumberKit to help validate phone numbers and country codes. This library was useful, but pretty badly optimised—

When I launched, I started with the Substack default pricing of $8 per month. I tweaked it several times before landing on $7.50, because, y’know, impostor syndrome. But recently I have devised a business strategy to rival the army of MBAs at Netflix: Raising prices.

SwiftUI Map styling with MapStyle: There’s a few styles of map. Of course, you get the regular "standard" Apple Maps style by default. ļæ¼But my favourite is the hybrid view, that incorporates both satellite imagery with roads and points of interest.

Fitting Lapse into a 15MB app clip: Splitting Up The Rolls Module I always knew this was on the cards, but I put off this optimisation as long as possible: splitting our Rolls feature module into two. One for app-clip-only screens, then another for screens that only feature in the full app.

The 120FPS SwiftUI challenge: Scroll Architecture To test out optimal SwiftUI performance, we’re going to focus on scroll views, the most popular punching-bag of SwiftUI haters. Let’s try out some approaches to get an infinitely-scrolling view that runs at a cool 120fps.

I really enjoy writing in the format: ā€œHere’s how to use Framework X to perform Use Case Y.ā€ I find it a lot more fun to write than a generic tutorial since it’s pegged to a real-world usage (often something novel I’ve done myself). Let me know what you’d like to see more of in the replies!

SwiftUI is like magic. But, like all well-designed magic systems, it comes with a cost. What, you thought that beautiful declarative syntax and automatic data bindings come free? Think again.

Oh crap I forgot to check in on my Pregancy+ app!!

Sometimes we want to mark out parts of a map. Think vehicle navigation routes with green/orange/red traffic guides, a nature trail guide through a park, or marking out a target destination area.

Throwback to the day I finally got noticed by the RevenueCat CEO

Advanced app size optimisations: Swift Optimisation Mode Swift itself provides a way to reduce the size of our bundle: optimisation modes. While the default release build performs speed optimisations, we can set a flag to request the compiler optimises for a smaller binary size instead.

SwiftUI Map Annotations: total customisability The really interesting thing with SwiftUI Map annotations is that you can build any view—you have the freedom to use ANY animations and interactions that work in a SwiftUI view.

You know what, Swift? I don’t care anymore. Knock yourself out.

Using Claude to generate prompts which I then feed into ChatGPT has been quite a good workflow for tolerable blog post thumbnails that no longer make me cringe šŸ˜… though they'll obviously never be able to compete with @jacobstechtavern.com's ones. github.com/Oliver-Binns...

Advanced Swift Concurrency: Tasks vs Threads Threads and Task both help you manage processes in your Swift code, but live at different levels of abstraction. Thread, or NSThread (as it was known prior to the Grand Renameā„¢ of Swift 3), is an operating-system-level entity managed by the kernel.

I worked on a really cool challenge recently: how do we fit the experience of our social media app into a 15MB app clip, so users can download it via a QR code? Join me on the journey from low-hanging fruit to some truly ridiculous hacks to get over the line!

There’s one protocol you need to understand to really get to grips with AsyncAlgorithms: AsyncSequence.