<feed xmlns="http://www.w3.org/2005/Atom"> <id>https://blog.martinp7r.com/</id><title>Martin's Tech Journal</title><subtitle>Mostly random posts about development and tooling in Swift, iOS, web and more</subtitle> <updated>2025-08-17T23:44:34+09:00</updated> <author> <name>Martin</name> <uri>https://blog.martinp7r.com/</uri> </author><link rel="self" type="application/atom+xml" href="https://blog.martinp7r.com/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://blog.martinp7r.com/"/> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2025 Martin </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title>Creating a tip jar with StoreKit 2, Xcode Previews, and remote assets</title><link href="https://blog.martinp7r.com/posts/creating-a-tip-jar-with-storekit-2/" rel="alternate" type="text/html" title="Creating a tip jar with StoreKit 2, Xcode Previews, and remote assets" /><published>2024-03-19T05:08:00+09:00</published> <updated>2024-03-19T05:21:59+09:00</updated> <id>https://blog.martinp7r.com/posts/creating-a-tip-jar-with-storekit-2/</id> <content src="https://blog.martinp7r.com/posts/creating-a-tip-jar-with-storekit-2/" /> <author> <name>Martin</name> </author> <category term="Articles" /> <category term="iOS" /> <summary> The new StoreKit 2 supports StoreKit configuration files for local development which means, among other things, that you can test your in-app purchases without a network connection and without even submitting them to the App Store. It also provides new SwiftUI views (StoreView, ProductView, and SubscriptionStoreView) which enable a low-code implementation of in-app purchases and paywalls with ... </summary> </entry> <entry><title>Modularized SwiftUI: Error Handling &amp; Alerts</title><link href="https://blog.martinp7r.com/posts/decoupled-error-handling-in-a-multi-module-app/" rel="alternate" type="text/html" title="Modularized SwiftUI: Error Handling &amp;amp; Alerts" /><published>2024-03-10T10:29:00+09:00</published> <updated>2025-05-26T07:39:35+09:00</updated> <id>https://blog.martinp7r.com/posts/decoupled-error-handling-in-a-multi-module-app/</id> <content src="https://blog.martinp7r.com/posts/decoupled-error-handling-in-a-multi-module-app/" /> <author> <name>Martin</name> </author> <category term="Articles" /> <category term="iOS" /> <summary> This is a second article in a short series about architecture concepts for apps with multiple small independent modules. You can find the previous article here: Decoupled stacked sheet navigation with multiple modals in SwiftUI. In this article, we focus on the consistent handling of errors across independent modules. And thereby enhancing the user experience and simplifying the development pr... </summary> </entry> <entry><title>Modularized SwiftUI: Stacked sheet navigation with multiple modals</title><link href="https://blog.martinp7r.com/posts/decoupled-stacked-sheet-navigation-with-multiple-modals-in-swiftui/" rel="alternate" type="text/html" title="Modularized SwiftUI: Stacked sheet navigation with multiple modals" /><published>2023-12-11T08:36:00+09:00</published> <updated>2024-03-10T13:36:20+09:00</updated> <id>https://blog.martinp7r.com/posts/decoupled-stacked-sheet-navigation-with-multiple-modals-in-swiftui/</id> <content src="https://blog.martinp7r.com/posts/decoupled-stacked-sheet-navigation-with-multiple-modals-in-swiftui/" /> <author> <name>Martin</name> </author> <category term="Articles" /> <category term="iOS" /> <summary> I don’t think this is a particularly rare use case, but recently I wanted to implement two modal sheets where the second one is displayed on top of the first one. ContentView() .sheet(isPresented: $showOnboarding) { OnboardingView() } .sheet(isPresented: $showDownloads) { DownloadView() } But when trying to present multiple sheets from a single root view as s... </summary> </entry> <entry><title>Newsletter Summaries Week 48 (2023)</title><link href="https://blog.martinp7r.com/posts/newsletter-summaries-week-48-2023/" rel="alternate" type="text/html" title="Newsletter Summaries Week 48 (2023)" /><published>2023-12-06T08:53:00+09:00</published> <updated>2023-12-06T08:53:00+09:00</updated> <id>https://blog.martinp7r.com/posts/newsletter-summaries-week-48-2023/</id> <content src="https://blog.martinp7r.com/posts/newsletter-summaries-week-48-2023/" /> <author> <name>Martin</name> </author> <category term="Newsletter" /> <summary> This week I haven’t had much time to read, so it’s mostly Mastodon posts. Yeah, I’ve finally found the time to get on that train as well. Far too late it seems. The iOS community on Mastodon seems very strong, though. Please feel free to connect with me at @MartinP7r@mastodon.social Pow Animation effects library open-sourced Pow – Beautiful Transitions for your iOS App A package with little ... </summary> </entry> <entry><title>Newsletter Summaries Week 47 (2023)</title><link href="https://blog.martinp7r.com/posts/newsletter-summaries-week-47-2023/" rel="alternate" type="text/html" title="Newsletter Summaries Week 47 (2023)" /><published>2023-11-30T09:04:00+09:00</published> <updated>2023-12-11T08:20:45+09:00</updated> <id>https://blog.martinp7r.com/posts/newsletter-summaries-week-47-2023/</id> <content src="https://blog.martinp7r.com/posts/newsletter-summaries-week-47-2023/" /> <author> <name>Martin</name> </author> <category term="Newsletter" /> <summary> SwiftData operations on background Source: SwiftData Background Tasks Use a custom ModelActor for the model to run operations on a background context. modelExecutor = DefaultSerialModelExecutor(modelContext: context) When passing objects between actors, we should use persistent identifiers, so there’s a convenience subscript on ModelActor func visit(identifiers: [Country.ID]) { for iden... </summary> </entry> </feed>
