Give your simulator superpowers

RocketSim: An Essential Developer Tool
as recommended by Apple

Black Friday: 50% discount on RocketSim & Going Indie Course

It’s that time of year when once-a-year discounts are offered on all kinds of products, including RocketSim and my Going Indie course. It’s the best moment to increase your app development productivity and to kickstart your indie journey to make the most out of your side projects. Before sharing details on getting these discounts, I’d … 

 

Contingent pricing for in-app subscriptions

Contingent pricing for in-app subscriptions creates a new way to retain and attract customers by providing discounted subscription prices to those actively subscribed to a different subscription. It’s especially interesting because it allows you to pair up with another developer’s subscription and create a cross-app bundle offering. Apple announced contingent pricing in December 2023 and … 

 

MainActor usage in Swift explained to dispatch to the main thread

MainActor is a new attribute introduced in Swift 5.5 as a global actor providing an executor that performs its tasks on the main thread. When building apps, it’s essential to perform UI updating tasks on the main thread, which can sometimes be challenging when using several background threads. Using the @MainActor attribute will help ensure … 

 

How to Use URLSession with Async/Await for Network Requests in Swift

URLSession allows you to perform network requests and becomes even more powerful with its async/await APIs. You can request data from a given URL and parse it into a decoded structure before displaying its data in a view. Popular frameworks like Alamofire aim to make it easier to perform requests, but for many apps, you … 

 

Using the #require macro for Swift Testing

Swift Testing is Apple’s modern replacement library for XCTest and introduces new macros like #require. We’ve covered the #expect macro before and are about to dive into its companion to set requirements for a given test. Each #require macro needs to pass for a test to continue. It’s kind of an early guard not to … 

 

Vapor and Swift Testing: Running tests in parallel

Swift on the Server and Vapor go hand in hand, but using Swift Testing can be challenging initially. Tests run in parallel by default, and it’s likely that your tests are running against a localhost database, which requires serial execution of tests. Running tests in parallel drastically improves performance. The performance gains are significant but … 

 

Security-scoped bookmarks for URL access

Security-scoped bookmarks allow you to store access to a given user-selected URL. They are commonly used on macOS to store access information for a user-selected directory. Restoring the security-scoped bookmark data allows you to regain access to a folder previously selected by the user. I’ve been using this technique for years and recently discovered a … 

 

The Going Indie Podcast with Antoine van der Lee

After creating my course, “From Side Project to Going Indie”, I proudly announce a new podcast: “Going Indie with Antoine van der Lee”. In this podcast, I’ll be inviting Indie Creators who have already gone independent to let them share their story, experiences, challenges, and learnings. A new episode will be released in audio and … 

 

Using the #expect macro for Swift Testing

Swift Testing is Apple’s Swift framework for writing tests and introduces several macros, including the #expect macro. Where we had to use all kinds of XCAssert variations before, we can now rely on a powerful replacement that will help us debug tests more quickly. Before exploring this specific feature of Swift Testing, I encourage you … 

 

Indie Development: Full Course now Available

Many engineers dream of indie development, leaving a full-time job behind, embracing freedom, and solely focusing on personal apps. While it’s a dream, it’s also a difficult step to take, especially if you’re going indie cold turkey without having any sources of income yet. Therefore, after announcing my decision to go indie, I decided to …