<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The iOS Weekly Brief]]></title><description><![CDATA[No fluff. Just the most relevant iOS articles, tools, and code tips once a week.]]></description><link>https://iosweeklybrief.com</link><image><url>https://substackcdn.com/image/fetch/$s_!JCPn!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0ae3ee-7d3b-4f04-985e-0f3f88aab3c1_768x768.png</url><title>The iOS Weekly Brief</title><link>https://iosweeklybrief.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 21 May 2026 22:57:25 GMT</lastBuildDate><atom:link href="https://iosweeklybrief.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Vlad Khambir]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[vladkhambir@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[vladkhambir@substack.com]]></itunes:email><itunes:name><![CDATA[Vlad Khambir]]></itunes:name></itunes:owner><itunes:author><![CDATA[Vlad Khambir]]></itunes:author><googleplay:owner><![CDATA[vladkhambir@substack.com]]></googleplay:owner><googleplay:email><![CDATA[vladkhambir@substack.com]]></googleplay:email><googleplay:author><![CDATA[Vlad Khambir]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The iOS Weekly Brief – Issue #60]]></title><description><![CDATA[Rosetta sunset is official, iOS rendering pipeline from touch to pixels, SwiftUI formatting deep dive, and a free open-source ASO tool]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-60</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-60</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 15 May 2026 12:31:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qAZu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qAZu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qAZu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qAZu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg" width="1400" height="788" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:788,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qAZu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/hello/may26">May 2026 - Hello Developer</a></strong></p><p>Apple dropped the May edition of Hello Developer, and there's a lot to unpack. Rosetta is officially getting a sunset date, macOS 27 will be the last release to support it, so if you're still shipping Intel-only builds, the clock is ticking. Also worth checking: new Foundation Models technotes on managing the on-device context window, and WWDC26 details are starting to come in.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05112026n">Xcode 26.5</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05112026a">iOS 26.5</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://blog.jacobstechtavern.com/p/ui-pipeline-internals">Touch to Pixels: UI Pipeline Internals on iOS</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jacob Bartlett&quot;,&quot;id&quot;:126930235,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!s80e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab1e065-dffc-4096-ad9e-826ddda8a6cd_1304x1304.png&quot;,&quot;uuid&quot;:&quot;39a54fdd-8e16-41d1-854d-19940ad4a422&quot;}" data-component-name="MentionToDOM"></span> failed an interview question about the iOS rendering pipeline and turned that into one of the best deep dives I&#8217;ve seen on the topic. The article walks you through the full journey: from your finger touching the capacitive screen, through the kernel, backboardd, Core Animation, the render server, all the way to pixels on the display. Most of us operate at a layer where all of this is abstracted away, but understanding what&#8217;s actually happening underneath makes you a better developer, not just a better interviewee.</p><p><strong><a href="https://serialcoder.dev/text-tutorials/swiftui/formatting-values-in-swiftui-text-and-textfield/">Formatting Values in SwiftUI Text and TextField</a></strong></p><p>Most of us reach for string interpolation by default, but SwiftUI&#8217;s <code>format</code> parameter does a lot more than that. This article covers the full range: numbers, percentages, currencies, dates, temperatures, distances, file sizes, person names, URLs, and more, all with locale-awareness built in. </p><p><strong><a href="https://antongubarenko.substack.com/p/swift-bits-scene-for-hosted-swiftui">Swift Bits: Scene for Hosted SwiftUI View</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Anton Gubarenko&quot;,&quot;id&quot;:123970311,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1eb672de-f6cd-47a2-98b2-6de3f5be6ffe_2316x3088.jpeg&quot;,&quot;uuid&quot;:&quot;c61f66bb-ec81-4446-a254-3fc25f1fa96c&quot;}" data-component-name="MentionToDOM"></span> dug into a subtle lifecycle trap that bites you when you embed SwiftUI views inside a UIKit app. <code>scenePhase</code> looks like it should work everywhere, and nothing obviously breaks, but in a <code>UIHostingController</code> setup it can silently misbehave. The fix is straightforward: use <code>UIApplication</code> or <code>UIScene</code> notifications instead, depending on how granular you need to be. </p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-5PSq5VvW_mM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;5PSq5VvW_mM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/5PSq5VvW_mM?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=5PSq5VvW_mM">How to Build an Infinite Scroll List Without Sacrificing Performance</a></strong></p><p>A practical walkthrough of building a paginated list in SwiftUI from scratch: when to trigger the next fetch, how to handle loading states with an enum-based state machine, and why fixed cell sizes matter more than you think for scroll performance. The part about <code>onScrollGeometryChange</code> as an alternative to <code>onAppear</code> is worth the watch alone. If you've ever shipped a list that jumps or stutters, this video explains exactly why that happens.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://openaso.thirdtechapps.com/">OpenASO: Free Open-Source ASO Tool</a></strong></p><p>ASO research is mostly tedious manual work: checking competitor keywords, digging through reviews, downloading screenshots one by one. OpenASO automates all of that. Give it an app, and it pulls competitor metadata, keyword rankings, reviews, and screenshots straight from Apple&#8217;s public iTunes Search API, no proprietary backend involved. Built as a local Mac app specifically to stay free, which is a smart call given how quickly web-based ASO tools turn into paid SaaS.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>29 new iOS positions this week  </strong><em>(-28% vs last week &#183; -41% vs last month)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 34% / 62% / 4%</p></li><li><p>Most wanted skills: SwiftUI 34% &#183; UIKit 21% &#183; MVVM 14%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Staff iOS Engineer (AI Native), Family AI Lab</strong> at <strong>Life360</strong> (Remote, US) &#8212; SwiftUI + Apple Foundation Model + App Intents on a zero-to-one AI team building the next generation of Life360's family intelligence layer; expects daily AI-native workflow (Claude Code, Cursor) and comfort with on-device Apple frameworks. $190K&#8211;$280K <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-ai-native-family-ai-lab-at-life360-4413153621">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer, Growth</strong> at <strong>Waymo</strong> (San Francisco, CA) &#8212; SwiftUI + Swift Concurrency in production, leading iOS platform architecture and engineering excellence for the Waymo One rideshare app. $213K&#8211;$263K <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-growth-at-waymo-4411003236">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://www.swiftdifferently.com/blog/swiftui/fixedsize-usecase">Finally found a use case for .fixedSize</a></strong></p><p>Most SwiftUI devs quietly file <code>.fixedSize</code> under "modifiers I'll never reach for." This article is about why that's a mistake. Concrete layout problem: cards in a horizontal ScrollView all need to match the tallest one's height, and it turns out <code>.fixedSize(horizontal: false, vertical: true)</code> is the cleanest solution by far.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:512774}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What do you use for networking in your iOS app?</p><p><strong>Top Answer:</strong> Custom URLSession layer</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">19&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #59]]></title><description><![CDATA[Swift's Networking Vision, ARC Internals, Background Tasks, Concurrency Traps, Scalable Async Architecture, a Free Screenshot Tool, and Customizable Toolbars]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-59</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-59</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 08 May 2026 12:31:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JkLv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JkLv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JkLv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 424w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 848w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1272w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JkLv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1587702,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://iosweeklybrief.com/i/196829218?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JkLv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 424w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 848w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1272w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-april-2026/">What&#8217;s new in Swift: April 2026 Edition</a></strong></p><p>April was a busy month for Swift. Swift Evolution accepted a Vision for Networking, basically a plan to rebuild Swift's networking stack from scratch with proper HTTP client and server APIs, which should make things cleaner for everyone. Lots more in the full digest, worth a read.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05042026i">Xcode 26.5 RC (17F42)</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05042026a">iOS 26.5 RC (23F75)</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://nilcoalescing.com/blog/SchedulingAndHandlingBackgroundAppRefreshInSwiftUI/">Scheduling and handling background app refresh in SwiftUI</a></strong></p><p>Background tasks are one of those things you set up once, forget how it works, and then spend an hour figuring it out again next time. This article is a clean, practical walkthrough from enabling the capability in Xcode to scheduling the task and handling it with the SwiftUI <code>backgroundTask</code> modifier. </p><blockquote><p>The debugging tip: there's a console command that simulates a background launch without having to wait for the system to decide it's ready.</p></blockquote><p><strong><a href="https://www.avanderlee.com/concurrency/unexpected-task-suspension-points-in-swift-concurrency/">Unexpected Task suspension points in Swift Concurrency</a></strong></p><p>If you've ever wondered why your UI slows down under load even though you're using async/await correctly, this one might explain it. Antoine shows how tasks that inherit Main Actor isolation can cause unexpected "thread hopping" - your task starts on the main thread, immediately suspends to do actual work elsewhere, then waits to come back.</p><p><strong><a href="https://livsycode.com/swift/swift-arc-from-zombie-objects-to-side-tables/">Swift ARC: From Zombie Objects to Side Tables</a></strong></p><p>Most of us know the basics of ARC, but this article goes much deeper into how Swift actually manages memory under the hood. It covers the evolution from "zombie objects" in early Swift to the current side table model, and explains exactly what happens at the bit level when you create a weak or unowned reference. The practical section at the end ties it all together with clear rules on when to actually reach for <code>unowned</code> (spoiler: less often than most codebases assume).</p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-M5ZUGBeugP4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;M5ZUGBeugP4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/M5ZUGBeugP4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=M5ZUGBeugP4">Production SwiftUI: Scalable Networking Architecture with Async Await</a></strong></p><p>A solid walkthrough of how to build a networking layer that doesn't turn into a mess as your app grows. The video covers the full stack from URL construction to error handling, and makes a strong case for using an endpoint protocol instead of a giant enum. The part about swapping real and mock services for previews is especially practical if you've ever found yourself fighting with previews that need live network calls.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://ezscreenshots.com/app">ezscreenshots</a></strong></p><p>A solo dev got tired of bloated screenshot tools, sent one prompt to Claude, and shipped a free web app at ezscreenshots.com. Drop your screenshot, edit the headline, export a clean PNG - that's it. No sign-up, no 50 buttons, no design suite you have to learn just to make App Store images.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>40 new iOS positions this week  </strong><em>(+54% vs last week &#183; -9% vs last month)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 35% / 65% / 0%</p></li><li><p>Most wanted skills: SwiftUI 40% &#183; MVVM 22% &#183; UIKit 20% &#183; Core Data 18%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Senior Software Engineer, iOS</strong> at <strong>Roblox</strong> (San Mateo, CA) &#8212; SwiftUI + Swift Concurrency on the Consumer Platform team powering tens of millions of daily players; you'll lead architecture across a large Swift codebase and drive multi-quarter platform initiatives <strong><a href="https://www.linkedin.com/jobs/view/senior-software-engineer-ios-at-roblox-4409986969">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer (SwiftUI)</strong> at <strong>Homes.com</strong> (Irvine, CA) &#8212; SwiftUI-first role at CoStar Group (S&amp;P 500, NASDAQ 100) building one of the fastest-growing real estate portals; direct impact on a product used by millions of homebuyers <strong><a href="https://www.linkedin.com/jobs/view/homes-com-senior-ios-engineer-swiftui-at-homes-com-4410796543">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer</strong> at <strong>Intuit</strong> (San Diego, CA) &#8212; Swift + SwiftUI + TDD at an AI-native product shop (TurboTax, QuickBooks); the role focuses on integrating LLM-powered features into consumer financial apps at scale <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-at-intuit-4379235735">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://swiftdevjournal.com/posts/make-swiftui-toolbar-customizable/">Make a SwiftUI Toolbar Customizable</a></strong></p><p>A quick and practical tip: SwiftUI lets you make toolbar items user-customizable with just two things - an ID on the <code>.toolbar</code> modifier and an ID on each <code>ToolbarItem</code>. One gotcha to keep in mind: <code>ToolbarItemGroup</code> does not conform to <code>CustomizableToolbarContent</code>, so you have to wrap each item individually in <code>ToolbarItem</code> if you want the customization to work.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:508908}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>At what price would you seriously consider buying Vision Pro?</p><p><strong>Top Answer:</strong> Under $1,000</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>May</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">12&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #58]]></title><description><![CDATA[Vision Pro is over, URLSession explained from top to bottom, actors vs queues vs locks, and App Store gets a new subscription type]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-58</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-58</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 01 May 2026 12:32:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!i_W4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i_W4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i_W4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i_W4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i_W4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/04/29/apple-vision-pro-m5-flop/">Apple Has Given Up on the Vision Pro After M5 Refresh Flop</a></strong></p><p>The Vision Pro team has been disbanded. According to MacRumors and Mark Gurman, Apple has stopped work on the device and redistributed the team, mostly to Siri. New CEO John Ternus was apparently never a fan of the product and already killed the cheaper Vision Air last year. What&#8217;s interesting is that the most common reaction I&#8217;ve seen isn&#8217;t &#8220;the tech is bad&#8221; but &#8220;I would have bought one at $1,500.&#8221; The hardware impressed people, the price didn&#8217;t. As for what&#8217;s next, I&#8217;m actually a Ray-Ban Meta glasses fan, and honestly I&#8217;d love to see Apple take a real shot at this form factor. If they get it right, a proper wearable from Apple could be something special.</p><p><strong><a href="https://developer.apple.com/news/?id=agq42lxe">Now Available: Monthly Subscriptions with a 12-Month Commitment</a></strong></p><p>Apple is adding a new subscription type to the App Store: monthly payments with a 12-month commitment. Users can cancel anytime, but they stay on the hook for the remaining payments until the year is up. It&#8217;s a middle ground between monthly and annual pricing, which is actually a pretty useful option if you&#8217;re trying to lower the barrier to entry without giving up the annual revenue guarantee. Rolls out with iOS 26.5 in May, everywhere except the US and Singapore for now.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04272026a">iOS 26.5 beta 4</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04272026g">Xcode 26.5 beta 3</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://blog.jacobstechtavern.com/p/urlsession-to-electrons">URLSession to Electrons: How Networking Works on iOS</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jacob Bartlett&quot;,&quot;id&quot;:126930235,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!s80e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab1e065-dffc-4096-ad9e-826ddda8a6cd_1304x1304.png&quot;,&quot;uuid&quot;:&quot;bfd88027-b7c5-402f-85ab-00ab9ec1d3a9&quot;}" data-component-name="MentionToDOM"></span> wrote one of those articles that makes you feel slightly embarrassed you never asked the question before. We call <code>.resume()</code> hundreds of times and just trust that something happens. This piece follows that call all the way down to the physical world, and it&#8217;s a good reminder that &#8220;URLSession handles it&#8221; is just a polite way of saying &#8220;I have no idea what&#8217;s going on.&#8221; Not essential knowledge for shipping apps, but the kind of thing that quietly makes you better at debugging.</p><p><strong><a href="https://www.avanderlee.com/concurrency/immediate-tasks-in-swift-concurrency-explained/">Immediate Tasks in Swift Concurrency Explained</a></strong></p><p>Swift 6.2 adds <code>Task.immediate</code>, and this is a good walkthrough of when it actually makes sense to use it. TL;DR: a regular <code>Task</code> gets scheduled to run later, while an immediate task starts right on the caller&#8217;s executor before handing control back. It sounds like a small difference but it matters when you care about ordering, like updating actor-isolated state before the rest of your code continues. The main thing to watch out for is overhang. If you put expensive synchronous work inside an immediate task, you&#8217;re blocking the caller until the first real suspension point.</p><p><strong><a href="https://livsycode.com/best-practices/actors-vs-queues-vs-locks-in-swift/">Synchronization in Swift: Actors vs Queues vs Locks</a></strong></p><p>A lot of teams I know defaulted to actors for everything once Swift 6 came out. Makes sense, the compiler helps you and the ownership model is clear. But this article does a good job of showing why that&#8217;s not always the right call. Locks have lower overhead for small, synchronous operations. Queues give you more control over execution order. Atomics solve a very specific problem and not much else. The part I found most useful is the framing around cognitive load: the lower you go in abstraction, the more you&#8217;re responsible for maintaining the contract yourself, and the compiler won&#8217;t catch you when you get it wrong.</p><p><strong><a href="https://www.massicotte.org/step-by-step-designing-protocols/">Concurrency Step-by-Step: Designing Protocols</a></strong></p><p>If you&#8217;ve been running into weird compiler errors around protocol conformances in Swift 6, this article is probably why. The core insight is that designing a protocol now means thinking from two sides at once: how the protocol works, and what you&#8217;re asking of every type that will conform to it. The default actor isolation setting alone can completely change whether a conformance even compiles. One thing I didn&#8217;t think about before reading this: making a protocol requirement <code>async</code> dramatically relaxes the constraints on conforming types, because synchronous members can satisfy async requirements but not the other way around.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://apps.apple.com/us/app/screenshot-bro/id6760177675">Screenshot Bro</a></strong></p><p>A macOS app for creating and managing App Store screenshots. Handles device mockups, localization across multiple languages, templates, and direct upload to App Store Connect. If you&#8217;ve ever done ASO and had to keep screenshots in sync across 10 localizations in Figma, you know the pain this is trying to solve.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>26 new iOS positions this week  </strong><em>(-7% vs last week </em>&#183; +8% vs last month<em>)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 31% / 69% / 0%</p></li><li><p>Most wanted skills: SwiftUI 62% &#183; UIKit 35% &#183; MVVM 27%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Sr Software Engineer - iOS</strong> at <strong>PayPal</strong> (San Jose, CA) &#8212; UIKit + SwiftUI + CoreData + Combine stack with XCTest/Quick-Nimble testing; building payment experiences for hundreds of millions of users across 200 markets <strong><a href="https://www.linkedin.com/jobs/view/4408567405">&#8594; Apply</a></strong></p><p><strong>iOS Engineer</strong> at <strong>Ibotta</strong> (Denver, CO) &#8212; Swift + UIKit + SwiftUI + MVVM, one of the top-ranked shopping apps on the App Store with millions of MAUs; unit testing framework ownership + direct feature input <strong><a href="https://www.linkedin.com/jobs/view/4406229624">&#8594; Apply</a></strong></p><p><strong>iOS Developer</strong> at <strong>Charles Schwab</strong> (Southlake, TX) &#8212; TDD/ATDD-driven native iOS team building complex trading interfaces and financial visualizations; in-house development with high ownership on a high-visibility platform <strong><a href="https://www.linkedin.com/jobs/view/4406472963">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://livsycode.com/swiftui/when-swiftui-modifiers-hold-onto-memory-longer-than-expected/">When SwiftUI Modifiers Hold onto Memory Longer Than Expected</a></strong></p><p>You pop a screen, expect <code>deinit</code> to fire, and nothing happens. This article looks at exactly that, specifically with <code>onSubmit</code>, <code>searchable</code>, and <code>refreshable</code> inside <code>NavigationStack</code>. Some of it is classic retain cycles in closures, some of it is SwiftUI internal behavior that&#8217;s harder to reason about. The fix is usually a weak capture and making sure you&#8217;re using the right property wrapper for your view model.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:504925}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Have you ever paid for app installs?</p><p><strong>Top Answer:</strong> No, my app grows organically</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">5&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #57]]></title><description><![CDATA[Apple's new CEO, iOS releases, SwiftUI migration, associatedtype explained, refreshable task cancellation, Instruments with AI agents, odometer animation, XcodeBuildMCP, and Meta ads for indie devs]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-57</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-57</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 24 Apr 2026 12:31:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4nhp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4nhp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4nhp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4nhp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4nhp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.apple.com/newsroom/2026/04/tim-cook-to-become-apple-executive-chairman-john-ternus-to-become-apple-ceo/">Tim Cook to Become Executive Chairman, John Ternus to Become Apple CEO</a></strong></p><p>Apple announced that Tim Cook will step down as CEO on September 1, 2026, moving to an Executive Chairman role, with John Ternus taking over as the next CEO. </p><p>Ternus has spent 25 years at Apple leading Hardware Engineering, and his fingerprints are on basically everything good in recent hardware: Apple Silicon Macs, AirPods, the current iPhone lineup. </p><p>I&#8217;m happy it&#8217;s a product and engineering guy taking the top job, not someone from finance or operations. The big question now is whether he can bring that same hardware polish to Apple&#8217;s software, which has had a rough couple of years.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04202026a">iOS 26.5 beta 3</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04222026a">iOS 26.4.2</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04222026c">iOS 18.7.8</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://livsycode.com/swiftui/how-i-migrated-300-screens-to-swiftui-and-what-i-learned/">How I Migrated 300 Screens to SwiftUI and What I Learned</a></strong></p><p>We used the exact same approach on my current and previous projects, navigation stays in UIKit, SwiftUI handles layout and view composition. It's becoming a pretty common pattern, and honestly it makes a lot of sense. This write-up is one of the better breakdowns of why that split works and what to watch out for along the way.  They also drew a clear line on performance, scroll-heavy screens with complex interactions stayed on UIKit, everything else moved to SwiftUI.</p><p><strong><a href="https://www.sagarunagar.com/blog/associatedtype-swift-explained-swiftui/">associatedtype in Swift Explained. A Complete Guide with SwiftUI Examples</a></strong></p><p>If you&#8217;ve ever wondered why <code>View</code> has an associated type instead of just returning <code>View</code> from <code>body</code>, this article breaks it down clearly. The short answer is performance: SwiftUI knows exact types at compile time and avoids runtime dispatch, which is a big deal at scale. Sagar walks through the full picture, from basic protocol usage to real architecture patterns with ViewModels. The section on <code>any ViewModel</code> and its limitations is particularly useful, because it&#8217;s easy to reach for that pattern and then hit a wall when you actually need to access the state.</p><p><strong><a href="https://www.avanderlee.com/ai-development/xcode-instruments-time-profiler-improve-performance-with-ai/">Xcode Instruments Time Profiler: Improve Performance with AI</a></strong></p><p>A practical workflow for AI-assisted performance optimization: add signposts to the code you&#8217;re profiling, run the Time Profiler, copy the results, and feed them into your agent as context so it can actually see where the bottlenecks are instead of guessing. Simple idea, but the 25x improvement he got from iterating on it makes a strong case for adding this to your workflow.</p><p><strong><a href="https://antongubarenko.substack.com/p/swiftui-refreshable-task-cancellation">SwiftUI: Refreshable Task Cancellation</a></strong></p><p>If your <code>.refreshable</code> flow sometimes stops halfway through with no obvious error, this article is probably the explanation you&#8217;ve been looking for. <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Anton Gubarenko&quot;,&quot;id&quot;:123970311,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1eb672de-f6cd-47a2-98b2-6de3f5be6ffe_2316x3088.jpeg&quot;,&quot;uuid&quot;:&quot;16166b07-4642-41eb-bc7a-4eb35a889e99&quot;}" data-component-name="MentionToDOM"></span> breaks down a subtle but painful gotcha: mutating <code>State</code> inside a refresh task triggers a redraw, which can cancel the very task that caused it. The fix is usually simple, collect results locally and publish one final update at the end instead of mutating state as you go.</p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-0YHKGcHetOA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;0YHKGcHetOA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/0YHKGcHetOA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=0YHKGcHetOA">$36 Per Install to $6: My Meta Ads Lessons as an Indie Dev</a></strong></p><p>An indie dev spent $2,000 learning Meta ads during a flight to Tokyo. A simple Claude-written line of text on a camera roll screenshot beat everything. If you've only ever done ASO and are curious about paid ads, watch this before spending a single dollar.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.xcodebuildmcp.com/">XcodeBuildMCP</a></strong></p><p>XcodeBuildMCP is an MCP server that gives AI agents direct control over Xcode: build, run, test, debug with LLDB, automate the simulator UI, and deploy to a real device. You configure your scheme and simulator once, and the agent handles the rest. It works with Claude Code, Cursor, Windsurf, and others, and in Xcode 26.3 it integrates natively with the built-in coding agents. Over 5,000 stars on GitHub already. If you're experimenting with agentic workflows in your iOS projects, this is worth adding to your setup.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>28 new iOS positions this week  </strong><em>(-43% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 46% / 54% / 0%</p></li><li><p>Most wanted skills: SwiftUI 57% &#183; MVVM 43% &#183; UIKit 36% &#183; Combine 18%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Developer</strong> at <strong>Charles Schwab</strong> (Ann Arbor, MI) &#8212; Builds the thinkorswim&#174; trading platform in Swift with MVVM architecture, async/non-blocking patterns, and socket-based networking; expect deep work on mobile security for one of the most complex financial apps on the App Store <strong><a href="https://www.linkedin.com/jobs/view/ios-developer-at-charles-schwab-4403208808?refId=8CF8x4vyTQaeZWLTN%2B0oVw%3D%3D&amp;trackingId=7R7L48e%2F4RYTuTHZSh%2BWog%3D%3D&amp;position=8&amp;pageNum=0">&#8594; Apply</a></strong></p><p><strong>Sr. iOS Developer</strong> at <strong>Spirit Airlines</strong> (Dania, FL) &#8212; Leads the full iOS ecosystem for a high-traffic airline app (booking, loyalty, guest self-service) using Swift, SwiftUI, and UIKit; owns architectural decisions, CI/CD pipeline design, and mentors junior engineers <strong><a href="https://www.linkedin.com/jobs/view/sr-developer-ios-mobile-at-spirit-airlines-4393150202?refId=8CF8x4vyTQaeZWLTN%2B0oVw%3D%3D&amp;trackingId=ACdMZFgqRZtPcwaPopUScw%3D%3D&amp;position=21&amp;pageNum=0">&#8594; Apply</a></strong></p><p><strong>iOS Engineer</strong> at <strong>Fieldwire by Hilti</strong> (Remote) &#8212; Builds the highest-rated construction app on the App Store, with offline-first architecture and strict Apple Human Interface Guidelines alignment <strong><a href="https://www.linkedin.com/jobs/view/staff-software-engineer-ios-at-favor-delivery-4389839487">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://livsycode.com/swiftui/an-odometer-style-number-animation-in-swiftui/">An Odometer-Style Number Animation in SwiftUI</a></strong></p><p>SwiftUI already has <code>contentTransition(.numericText())</code> built in, but this post takes it one step further: instead of jumping from one value to the next, the number rolls through every intermediate value like an actual odometer.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:500841}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Which tool do you use to monitor network requests in iOS?</p><p><strong>Top Answer:</strong> Proxyman</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">28&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #56]]></title><description><![CDATA[Apple unifies its business tools, ISP explained through a real protocol gone wrong, lazy properties in SwiftUI, network monitoring with AI agents, and a CLI tool for App Store releases]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-56</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-56</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 17 Apr 2026 12:31:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cSHk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cSHk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cSHk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cSHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg" width="1600" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173849,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cSHk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/04/14/apple-business-platform-launches/">Apple Launches New All-in-One Apple Business Platform</a></strong></p><p>Apple merged Apple Business Essentials, Apple Business Manager, and Apple Business Connect into a single free platform. For dev teams, the most useful part is the new &#8220;Blueprints&#8221; feature: you can preconfigure devices with settings, apps, and policies, and new Macs arrive ready to use without any manual setup. One thing that&#8217;s getting pushback: Apple Maps ads are coming this summer as part of the business tools, which feels a bit off-brand for a company that built its reputation on privacy.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04162026a">Xcode 26.4.1</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04132026g">Xcode 26.5 beta 2</a></strong></p></li><li><p><strong><a href="https://www.anthropic.com/news/claude-opus-4-7">Claude Opus 4.7</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://swiftandmemes.com/interface-segregation-principle-in-ios-how-to-prevent-protocol-from-becoming-a-prison/">Interface Segregation Principle In iOS</a></strong><br>ISP is one of those SOLID principles that shows up on almost every iOS interview, yet most developers learn it the hard way in production. The article walks through a real-world scenario where a clean 4-method protocol slowly becomes a 25-method monster, and shows exactly how to prevent that from happening.</p><p><strong><a href="https://www.avanderlee.com/ai-development/network-requests-optimization-using-xcodes-simulator-agents/">Network Requests Optimization using Xcode&#8217;s Simulator &amp; Agents</a></strong></p><p>Most of us only open a proxy tool when something is already broken, which means we miss a lot of issues that are hard to reproduce. The idea here is to keep network monitoring running in the background at all times, and then pipe that real traffic data straight into an AI agent to spot caching gaps, duplicate requests, and slow endpoints.</p><p><strong><a href="https://www.sagarunagar.com/blog/lazy-properties-swiftui-pitfalls/">Lazy Properties in Swift - Why They Don&#8217;t Always Work in SwiftUI</a></strong></p><p><code>lazy</code> is one of those keywords that feels intuitive until you try it inside a SwiftUI view and the compiler just says no. The article explains why it breaks there and what patterns actually work instead, with <code>State</code> and <code>StateObject</code> being the right tools for that job.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://asccli.sh">App-Store-Connect-CLI</a></strong></p><p>If you're still doing releases through the App Store Connect web UI, this tool will change your workflow. It's a CLI that covers pretty much everything: uploading builds, managing TestFlight groups, syncing metadata and screenshots, submitting for review, and more. Works great in CI/CD pipelines too.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>49 new iOS positions this week  </strong><em>(+11% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 51% / 45% / 4%</p></li><li><p>Most wanted skills: SwiftUI 33% &#183; MVVM 31% &#183; UIKit 27% &#183; Core Data 16% &#183; Swift Concurrency 10% &#183; Bazel 10%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS</strong> at <strong>Google</strong> (Mountain View, CA) &#8212; Swift Concurrency stack (Actors, Publishers, GCD) with deep focus on multi-threaded performance, Instruments-based profiling, and accessibility; role sits on the Google Search iOS team building features used by hundreds of millions of users <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-google-search-at-google-4389829342">&#8594; Apply</a></strong></p><p><strong>Lead iOS Engineer</strong> at <strong>Rogo</strong> (New York, NY) &#8212; Founding iOS role building the native app from scratch using SwiftUI + UIKit; Rogo is an AI analyst platform for top investment banks and PE firms with strong product-market fit and backing from world-class investors, rare chance to own mobile architecture at a well-funded AI startup <strong><a href="https://www.linkedin.com/jobs/view/lead-ios-engineer-at-rogo-4389261013">&#8594; Apply</a></strong></p><p><strong>Staff Software Engineer, iOS</strong> at <strong>Favor Delivery</strong> (Texas) &#8212; SwiftUI, XCTest, XCUITest, SPM, and MVVM across a high-volume real-time logistics platform; Staff IC role on the Promotions &amp; Engagement squad with full ownership from development through release <strong><a href="https://www.linkedin.com/jobs/view/staff-software-engineer-ios-at-favor-delivery-4389839487">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://medium.com/grindr-engineering/claude-couldnt-see-its-print-statements-without-xcode-here-s-how-we-fixed-it-0ac4e842a6b2">Claude Couldn&#8217;t See Its Print Statements Without Xcode. Here&#8217;s How We Fixed It</a></strong></p><p>If you're running your iOS app from the terminal instead of Xcode, Claude has no way to see print statements, because the simulator and Claude are two separate processes. The fix is simple: write logs to a file with FileManager, then stream it with <code>tail -f</code>. A small setup, but it makes a real difference for anyone trying to use Claude for agentic iOS debugging.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:496245}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What do you use for loading remote images in your apps?</p><p><strong>Top Answer:</strong> Kingfisher</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">21&#8211;23</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #55]]></title><description><![CDATA[Hello Developer April 2026, SwiftUI List alternatives, spec-driven development with AI, and the real cost of vibe coding.]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-55</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-55</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 10 Apr 2026 12:31:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NE4i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NE4i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NE4i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NE4i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NE4i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/">Hello Developer: April 2026</a></strong></p><p>Apple dropped the April newsletter and the most exciting part for me is WWDC26 taking shape, the community meetup is confirmed for June 10 in Cupertino, and there&#8217;s a live Swift concurrency Q&amp;A with engineers coming on April 23. App Store Connect Analytics also got a huge update with 100+ new metrics, which honestly was long overdue. And if you haven&#8217;t checked the Liquid Glass design gallery yet, it&#8217;s worth a look to see how apps are starting to adopt the new visual direction.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://swiftwithmajid.com/2026/04/06/building-list-replacement-in-swiftui/">Building List Replacement in SwiftUI</a></strong></p><p>If you&#8217;ve been defaulting to <code>List</code> for every scrollable screen, this post is a good reminder that it&#8217;s not always the right call. The author walks through replacing List in their app using <code>ScrollView</code> with lazy stacks and the Container View APIs, and builds some nice reusable primitives. I liked the approach here because it gives you actual control over the look and feel without fighting list-specific modifiers.</p><p><strong><a href="https://tanaschita.com/ios-file-system-overview/">Working with Files and Directories in iOS</a></strong></p><p>This one is more of a reference than a deep dive, but it&#8217;s the kind of article I wish I had bookmarked earlier. It covers the app sandbox structure, the difference between Documents, Library, and tmp, how to read and write files using URL APIs, and how to exclude files from iCloud backups. Nothing groundbreaking if you&#8217;ve been doing iOS for a while, but it&#8217;s a clean and well-organized explanation.</p><p><strong><a href="https://wesleydegroot.nl/blog/asyncimage-in-swiftui">AsyncImage in SwiftUI</a></strong></p><p>AsyncImage has been around since iOS 15, but I still see people reaching for Kingfisher before even trying it. This is a solid overview of what it can do: handling loading states, failure cases, and basic caching out of the box.</p><p><strong><a href="https://nilcoalescing.com/blog/EmbeddingSFSymbolsInSwiftUIText/">Embedding SF Symbols in SwiftUI Text</a></strong></p><p>Didn&#8217;t know you could interpolate an Image directly inside a <code>Text</code> string literal until I saw this. Turns out it works because the literal gets converted to a <code>LocalizedStringKey</code>, which supports <code>Image</code> interpolation. There&#8217;s a gotcha though: styling modifiers don&#8217;t work directly on the interpolated image, so you have to wrap it in another <code>Text</code> first. A bit verbose, but useful when <code>Label</code> just doesn&#8217;t give you enough control over placement.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://antongubarenko.substack.com/p/spec-driven-development-with-opensec-9ea">OpenSpec</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Anton Gubarenko&quot;,&quot;id&quot;:123970311,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1eb672de-f6cd-47a2-98b2-6de3f5be6ffe_2316x3088.jpeg&quot;,&quot;uuid&quot;:&quot;79301828-9bab-4896-b024-b5a0438d965e&quot;}" data-component-name="MentionToDOM"></span> wrote about this tool and I totally agree with the idea behind it. I work in a similar way myself with most of my tasks. Before writing any code with AI, you first agree on a spec: what needs to be built, how it should behave, what the tasks are. Then the assistant implements against that, not just against a vague prompt. The delta specs part is what I find most practical. You don&#8217;t rewrite everything, just describe what&#8217;s changing. Worth trying if your AI sessions feel unpredictable.</p><p><strong><a href="https://www.swift.org/blog/expanding-swift-ide-support/">Expanding Swift&#8217;s IDE Support</a></strong></p><p>Tracy Miranda from the Swift tooling team at Apple announced that the Swift extension is now available on the Open VSX Registry. That means you can use it in VS Code-compatible editors (Cursor/Windsurf), not just Xcode or VS Code. Good to see Swift showing up in more agentic IDEs as the ecosystem keeps growing.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>44 new iOS positions this week  </strong><em>(+83% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 34% / 55% / 11%</p></li><li><p>Most wanted skills: SwiftUI 39% &#183; MVVM 20% &#183; UIKit 20% &#183; Core Data 16%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS</strong> at <strong>Mirage</strong> (New York, NY) &#8212; SwiftUI, AVFoundation, Combine, Core Animation, and Metal at the core of an AI-native video editing platform. Small team with high ownership, solving real generative media problems. Salary: $175K&#8211;$275K <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-mirage-4398081058">&#8594; Apply</a></strong></p><p><strong>Software Engineer, iOS, Google Search</strong> at <strong>Google</strong> (Mountain View, CA / New York, NY / Kirkland, WA) &#8212; Swift Concurrency, Actors, and Publishers on the Google Search App Platform team, owning core infrastructure used by the full Search app. Salary: $147K&#8211;$211K <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-google-search-at-google-4394476199">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-4NOFZhXUHDE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4NOFZhXUHDE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/4NOFZhXUHDE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=4NOFZhXUHDE">The real cost of vibe coding</a></strong></p><p>I watched this one and recognized myself immediately. The author built a custom terminal, an app store screenshot tool, an AI task manager, all going viral, all in a few weeks. And his actual app, the one that pays the bills, hasn&#8217;t moved in months. His point is that before AI, there was a natural gap between having an idea and building it. A few days would pass, and the bad ideas would die on their own. Vibe coding destroyed that gap. Now every idea gets built immediately, before you even know if it&#8217;s worth building.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:492383}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How many languages does your app support?</p><p><strong>Top Answer:</strong> 2-5</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">14&#8211;23</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #54]]></title><description><![CDATA[App Store adds 11 new languages, SwiftUI onAppear lifecycle explained, engineers should build skills not features, and the Claude Code source leak]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-54</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-54</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 03 Apr 2026 12:30:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Zw07!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zw07!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zw07!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zw07!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zw07!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/?id=97t4mt64">App Store expands support to 11 new languages</a></strong></p><p>Apple added localized metadata support for 11 new languages in App Store Connect, including Bangla, Tamil, Telugu, Gujarati, and several others, with a clear focus on India. If you&#8217;ve been thinking about expanding there, now&#8217;s a good time to add those localizations.</p><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-march-2026/">What&#8217;s new in Swift: March 2026 Edition</a></strong></p><p>The Core Build team just landed a big milestone: Swift Build is now the default build system in Swift's main branch, replacing the old llbuild-based one. Still needs some bug fixes before it ships to everyone, but the direction is clear. Also worth noting: <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/testing/0021-targeted-interoperability-swift-testing-and-xctest.md">ST-0021</a> was accepted, which fixes <code>XCTAssert</code> calls being silently ignored when called inside Swift Testing tests.</p><p><strong><a href="https://developer.apple.com/news/releases/?id=03302026g">Xcode 26.5 beta</a></strong></p><p>The StoreKit update is the most useful addition: you can now test monthly with 12-month commitment billing plans directly in Xcode. The rest is mostly bug fixes.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.swiftyplace.com/blog/swiftui-view-lifecycle-onappear?utm_source=rss">SwiftUI View Lifecycle: When onAppear Actually fires</a></strong></p><p>SwiftUI has two independent tracks: node lifetime (when state is created and destroyed) and visibility (when the view appears on screen). <code>onAppear</code> tracks visibility, not lifetime, which is why it fires on every tab switch in <code>TabView</code> even though your <code>@State</code> is still alive.</p><p><strong><a href="https://ronnierocha.dev/blog/engineers-building-skills-not-features/">Your engineers should be building skills, not just features</a></strong></p><p>Non-engineers are already contributing code with AI tools, but most teams haven't built the scaffolding to make that work well. The idea is simple: a Claude Code skill that documents your patterns is worth more than one feature, because it multiplies everyone who uses it. At first it felt like AI was all about prompt engineering. Now it's clear that skills and subagents are where developers will actually spend their time to keep up the pace.</p><p><strong><a href="https://www.hackingwithswift.com/articles/284/teach-your-ai-to-write-swift-the-hacking-with-swift-way">Teach your AI to write Swift the Hacking with Swift way</a></strong></p><p>Paul Hudson released an <code>AGENTS.md</code> that instructs AI coding tools to write Swift exactly like he does: prefer SwiftData, and drop <code>ObservableObject</code>. There are some genuinely solid rules, like always assuming strict concurrency is on and deleting code before adding more. Worth a read just to steal a few ideas for your own <code>AGENTS.md</code>.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/xrazz/app-store-approval-guide">iOS App Store Approval Checklist</a></strong></p><p>A practical checklist covering everything that gets your app rejected after the build is done: missing legal links, vague pricing, no Restore Purchases button, forgotten test accounts. Nothing groundbreaking, but it&#8217;s the kind of thing you skim once and then wish you&#8217;d read before your last submission. Bookmark before you hit submit on your next release.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>24 new iOS positions this week  </strong><em>(-54% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 33% / 63% / 4%</p></li><li><p>Most wanted skills: SwiftUI 54% &#183; MVVM 33% &#183; UIKit 29% &#183; Core Data 17%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Sr Developer, iOS Mobile</strong> at <strong>Spirit Airlines</strong> (Dania, FL) &#8212; SwiftUI + UIKit + MVVM-C + Async/Await + Swift Package Manager, with full ownership of CI/CD pipeline architecture and an automated testing strategy covering Unit, UI, and Snapshot tests for a high-traffic booking and loyalty app <strong><a href="https://www.linkedin.com/jobs/view/sr-developer-ios-mobile-at-spirit-airlines-4393150202/">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer</strong> at <strong>Intuit</strong> (Mountain View, CA) &#8212; Swift + SwiftUI role focused on shipping AI integrations into production for TurboTax and QuickBooks at scale; you'll own architectural decisions, mentor engineers, and evaluate AI impact on performance with real metrics <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-at-intuit-4382108609/">&#8594; Apply</a></strong></p><p><strong>iOS Software Engineer</strong> at <strong>Garmin</strong> (Chandler, AZ) &#8212; Swift + SwiftUI + Objective-C building iOS software for general aviation products; niche domain with deep Apple ecosystem work and on-site collaboration in Chandler <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-at-garmin-4381921885/">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://build.ms/2026/4/1/the-claude-code-leak/">The Claude Code Leak</a></strong></p><p>Claude Code's source code leaked last week, and the first reaction from developers was pointing at how messy it is. The more interesting take is what that says about code quality in general: one of the most loved developer tools is built on code that most engineers would flag in review, and nobody cares. What matters is that the product works. If you've ever felt guilty about shipping code you're not proud of, this one will make your day.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:488603}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Do you still watch the WWDC keynote live?</p><p><strong>Top Answer:</strong> Yes, every year, it&#8217;s a ritual</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">7&#8211;23</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #53]]></title><description><![CDATA[WWDC26 is June 8, Swift 6.3 and Xcode 26.4 are out, preparing your codebase for AI agents, modularizing a monolith, and Voice Control in SwiftUI]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-53</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-53</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 27 Mar 2026 12:30:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F0xc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F0xc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F0xc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F0xc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F0xc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/wwdc26/">WWDC26 confirmed for June 8</a></strong></p><p>Apple just confirmed WWDC26 kicks off on June 8 at Apple Park. This year&#8217;s official teaser promises &#8220;AI advancements and exciting new software and developer tools,&#8221; which isn&#8217;t exactly a surprise. Community expectations are split between a Siri that actually works and a Snow Leopard-style cleanup year for macOS. Personally, I&#8217;d take either. If you want a shot at attending in person, applications for <a href="https://developer.apple.com/wwdc26/special-event/">the special event</a> are open until March 30.</p><p><strong><a href="https://developer.apple.com/news/?id=hh6v4b55">New In-App Purchase and subscription data in Analytics</a></strong></p><p>App Store Connect Analytics just got a serious upgrade. Over 100 new metrics, cohort analysis, peer group benchmarks, new subscription reports, and more filters.</p><p><strong><a href="https://www.swift.org/blog/swift-6.3-released/">Swift 6.3 is out</a></strong></p><p>The headline feature is probably the official Swift SDK for Android. Community work has been going on for years, and now it&#8217;s an actual official release. Swift keeps expanding outside Apple platforms, and it&#8217;s accelerating.</p><p><strong><a href="https://www.swift.org/blog/swift-6.3-released/">Xcode 26.4 Released</a></strong></p><p>Xcode 26.4 ships with Swift 6.3 and a bunch of improvements to Instruments. Run Comparison is new - it lets you compare call trees across profiling runs directly in Instruments, which makes performance regression hunting a lot less painful. Also, Top Functions mode now shows the most expensive functions across the entire trace regardless of where they&#8217;re called from. Smaller thing, but useful: you can finally remove languages from String Catalogs directly in the editor.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://sundayswift.com/posts/preparing-ios-codebase-for-ai-agents/">Preparing Your iOS Codebase for AI Agents</a></strong></p><p>Drop an AI agent into a large iOS codebase with no guidance, and you get syntactically correct Swift that ignores your architecture, calls <code>xcodebuild</code> with wrong flags, and puts files in the wrong places. This post explains how to fix that. The core idea is hierarchical <code>AGENTS.md</code> files: a root-level operating contract, a subsystem guide for iOS-specific rules, and per-module docs for the kind of knowledge you'd normally only get from someone who's been in that directory for months. Btw, shorter documentation works better. Agents have finite context windows, and every redundant line pushes out actual useful content. If your guide is over 400 lines (I prefer 200), it's probably too long.</p><p><strong><a href="https://livsycode.com/best-practices/how-i-decomposed-a-monolithic-ios-app-into-130-modules-and-reduced-build-time-by-35/">How I decomposed a monolithic iOS app into 130+ modules and reduced build time by ~35%</a></strong></p><p>300 screens, a bridging header from 2015, MVC and MVVM coexisting in the same codebase. The key mistake: feature modules importing each other, which killed SwiftUI previews and created circular dependencies. The fix was an app-level coordinator that owns all cross-feature navigation, while features just expose entry points and signal outcomes. Incremental builds improved by around 35%.</p><p><strong><a href="https://wesleydegroot.nl/blog/focus-state-in-swiftui">Focus State in SwiftUI</a></strong></p><p><code>FocusState</code> has been around since iOS 15, but a lot of codebases still handle focus manually. Wesley de Groot's post covers the basics well: how to bind focus to an enum, auto-focus on appear, and move focus programmatically on form validation. Small thing, but it makes a real difference for keyboard navigation and accessibility.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.sagarunagar.com/blog/swift-algorithms-complete-guide/">Swift Algorithms - Apple&#8217;s Hidden Collection and Sequence APIs You Should Be Using</a></strong></p><p>If you're still writing nested loops and index math by hand, there's a good chance <code>swift-algorithms</code> covers what you need. Apple's open-source package adds focused collection APIs that don't exist in the standard library: <code>chunked</code>, <code>uniqued</code>, <code>indexed</code>, <code>product</code>, combinations, permutations, and more.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>54 new iOS positions this week  </strong><em>(+4% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 43% / 55% / 2%</p></li><li><p>Most wanted skills: SwiftUI 39% &#183; UIKit 28% &#183; Core Data 11% &#183; MVVM 19%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS, Google Search</strong> at <strong>Google</strong> (Mountain View, CA) &#8212; Swift Concurrency, Actors, Publishers, and GCD are core requirements; the role focuses on performance analysis with Instruments and multi-threaded systems &#8212; all for iOS Search used by billions <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-google-search-at-google-4389829342">&#8594; Apply</a></strong></p><p><strong>Lead Software Engineer, iOS/Mobile</strong> at <strong>Beacon AI</strong> (San Carlos, CA) &#8212; SwiftUI, UIKit, Combine, Core Data, Core ML, and on-device AI powering real-time flight safety systems deployed with the DoD and major airlines. Founding-level ownership of the entire iOS platform architecture <strong><a href="https://www.linkedin.com/jobs/view/lead-software-engineer-ios-mobile-at-beacon-ai-4388210004">&#8594; Apply</a></strong></p><p><strong>Lead iOS Engineer</strong> at <strong>Rogo</strong> (New York, NY) &#8212; Founding iOS role at the AI analyst platform used by top Wall Street investment banks and PE funds; stack is SwiftUI + UIKit with full end-to-end ownership from architecture to App Store release <strong><a href="https://www.linkedin.com/jobs/view/lead-ios-engineer-at-rogo-4389261013">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://wesleydegroot.nl/blog/voice-control">Voice Control</a></strong></p><p>Accessibility articles usually focus on VoiceOver, so it's nice to see Voice Control get some attention. The difference matters: VoiceOver is for blind users, Voice Control is for people with motor impairments who can see the screen but can't touch it reliably. The key modifier to know is <code>.accessibilityInputLabels(_:)</code>, which lets you define multiple voice commands for the same element. "Save", "Submit", "Send" - all pointing to one button. Quick read with practical code examples for forms, lists, and custom controls.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:484302}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How long did your last build wait for App Review?</p><p><strong>Top Answer:</strong> 1-3 days</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">30&#8211;31</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #52]]></title><description><![CDATA[Apple blocks vibe coding apps, Xcode 26.4 RC lands, the iOS dev toolkit beyond Xcode, some vs any explained, compilation cache in practice, String Catalogs tips, and how SwiftUI renders your views]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-52</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-52</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 20 Mar 2026 12:31:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6B1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6B1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6B1G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6B1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6B1G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/03/18/apple-blocks-updates-for-vibe-coding-apps/">Apple Quietly Blocks Updates for Popular Vibe Coding Apps</a></strong></p><p>Apple started blocking App Store updates for vibe coding apps like Replit and Vibecode. The rule they point to is Guideline 2.5.2, which says apps can&#8217;t execute code that changes their own functionality. And I get it. Technically, these apps generate and run other apps inside themselves. That is an app inside an app, and the guidelines do cover that. But at the same time, vibe coding is a completely new category. These tools didn&#8217;t exist when the rules were written. I think Apple&#8217;s guidelines need an update to handle these edge cases properly. And honestly, it&#8217;s better to create clear rules now than to wait until people find workarounds on their own. Replit already dropped from first to third in the developer tools rankings just because it couldn&#8217;t push updates since January.</p><p><strong><a href="https://developer.apple.com/news/releases/?id=03182026i">Xcode 26.4 Release Candidate</a></strong></p><p>Apple released the Release Candidate for Xcode 26.4 with Swift 6.3 and updated SDKs for all platforms. Instruments got a new Run Comparison feature that lets you compare call trees between different runs, which is great for tracking performance changes. Swift Testing now supports attaching images directly to tests.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.linkedin.com/pulse/your-ios-dev-toolkit-longer-just-xcode-vlad-khambir-ygske/?trackingId=0e2c2IRVSBORr9Kx3b6JXg%3D%3D">Your iOS Dev Toolkit is no longer just Xcode</a></strong></p><p>This one is mine, so I'll keep it short. I wrote about how the iOS developer toolkit has changed over the last year. Xcode is still there for builds and debugging, but the real work now happens around the AI agent. Claude Code, skills, MCPs, voice input, AGENTS.md. The article covers each piece and how they fit together.</p><p><strong><a href="https://www.sagarunagar.com/blog/swift-some-vs-any-opaque-existential-types/">Swift some vs any: Understanding Opaque Types and Existential Types</a></strong></p><p>If you've ever been confused by <code>some</code> and <code>any</code> in Swift, this is a clean breakdown. Sagar walks through what opaque and existential types actually are, how they differ at the compiler level, and why it matters for performance. The part about existential containers and witness tables is especially useful. Most of us use <code>some View</code> every day in SwiftUI without thinking about what's happening behind it.</p><p><strong><a href="https://livsycode.com/best-practices/xcode-26-compilation-cache/">Xcode 26 Compilation Cache</a></strong></p><p>Xcode 26 can now cache compilation results and reuse them when inputs haven't changed. Branch switching, clean builds, CI reruns, all get faster once the cache is warm. The catch? If your build time is mostly scripts or asset processing, you won't notice much. Still, a solid improvement for everyday work.</p><p><strong><a href="https://tanaschita.com/ios-string-catalogs-in-practice/">Working with String Catalogs in iOS projects</a></strong></p><p>A practical guide to <code>.xcstrings</code> files. Covers automatic key detection, manual management, entry states like stale and needs_review, and a useful trick: rename keys directly in the catalog editor so Xcode keeps your translations intact. If you're still managing localization the old way, this is a good starting point.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://charleswiltgen.github.io/Axiom/">Axiom</a></strong></p><p>I mentioned skills in my article this week, and Axiom is one of the best examples of what they can do. Instead of your agent just &#8220;knowing Swift,&#8221; you give it structured rules for how to write code in your project. Axiom covers iOS development end to end: concurrency, SwiftUI performance, database migrations, memory debugging, accessibility, Apple Intelligence. 50 skills total, plus commands and agents. It works as a Claude Code plugin and as an MCP server. If you&#8217;re building with agents and want them to follow real engineering discipline, not just generate code, check this out.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>52 new iOS positions this week  </strong><em>(+13% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 31% / 65% / 4%</p></li><li><p>Most wanted skills: SwiftUI 40% &#183; UIKit 23% &#183; Core Data 21% &#183; MVVM 15%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Swift Platform Experience &#8211; UI Frameworks Engineer</strong> at <strong>Apple</strong> (Cupertino, CA) &#8212; You're not building <em>with</em> UIKit, you're building UIKit itself: touch handling, animation, layout, <code>UICollectionView</code>, <code>UIHostingConfiguration</code>. The role requires 5+ years of hands-on UIKit, strong Swift proficiency, and familiarity with Core Animation and debugging/profiling. A rare chance to shape APIs that every iOS developer depends on <strong><a href="https://www.linkedin.com/jobs/view/swift-platform-experience-%E2%80%93-ui-frameworks-engineer-at-apple-4385652709">&#8594; Apply</a></strong></p><p><strong>iOS Software Engineer, ChatGPT Engineering</strong> at <strong>OpenAI</strong> (San Francisco / New York / Seattle) &#8212; Building and shipping features in the ChatGPT iOS app, with ownership from design through launch and iteration. Stack includes Swift/Objective-C, SwiftUI/UIKit, Core Data, and performance optimization. Cross-functional role where your code reaches millions of daily active users of the world's most-used AI app <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-chatgpt-engineering-at-openai-4375274377">&#8594; Apply</a></strong></p><p><strong>Senior Product Engineer, iOS</strong> at <strong>Sandbar</strong> (New York, NY) &#8212; Early-stage team (ex-Meta, CTRL-labs, Google, Apple) building Stream &#8212; a voice ring and conversational AI interface featured in WSJ, Bloomberg, and Wired. The iOS app handles on-device ML, BLE connectivity, WebSocket-based device-cloud sync, and a novel UIUX layer <strong><a href="https://www.linkedin.com/jobs/view/senior-product-engineer-ios-at-sandbar-4386955583">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-_zmQnn7Ki1E" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_zmQnn7Ki1E&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_zmQnn7Ki1E?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=_zmQnn7Ki1E">SwiftUI Under The Hood: What&#8217;s Really Happening When You iOS Updates</a></strong></p><p>Ever wondered what happens between a @State change and pixels appearing on screen? This video breaks down the SwiftUI rendering pipeline in a way I haven't seen before. The attribute graph, dirty marking, diffing, the two-frame delay, and why your body needs to be cheap.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:480184}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Have you started using agent skills in Xcode?</p><p><strong>Top Answer:</strong> Yes, actively</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">24&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #51]]></title><description><![CDATA[Thread safety in Swift, drop SwiftGen for good, GCD migration traps nobody warns you about, and 9 frontier models in one coding test]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-51</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-51</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 13 Mar 2026 12:30:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QWZJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QWZJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QWZJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg" width="711" height="530.2557427258805" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:487,&quot;width&quot;:653,&quot;resizeWidth&quot;:711,&quot;bytes&quot;:46480,&quot;alt&quot;:&quot;A colored pencil-style sketch representing Apple&#8217;s rainbow logo.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A colored pencil-style sketch representing Apple&#8217;s rainbow logo." title="A colored pencil-style sketch representing Apple&#8217;s rainbow logo." srcset="https://substackcdn.com/image/fetch/$s_!QWZJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.apple.com/newsroom/2026/03/apple-to-celebrate-50-years-of-thinking-different/">Apple to celebrate 50 years of thinking different</a></strong></p><p>Fifty years. Apple was founded in a garage in 1976, and this week the company is marking the milestone with a letter from Tim Cook. </p><p>What struck me most is the framing. Not &#8220;look what we built&#8221; but &#8220;look what people made possible with our tools.&#8221; For developers, that&#8217;s worth sitting with. You&#8217;re building on a platform that&#8217;s been around half a century and is still moving fast.</p><p><strong><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_4-release-notes">Xcode 26.4 Beta 3</a></strong></p><p>Beta 3 ships with Swift 6.3 and updated SDKs across all platforms.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.sagarunagar.com/blog/thread-safety-in-swift/">Thread Safety in Swift - Preventing Data Races with Locks, Queues, and Actors</a></strong></p><p>Data races are one of those bugs that only show up in production and are nearly impossible to reproduce locally. Sagar Unagar breaks down all the main approaches: serial queues, NSLock, actors, and why immutability is still your best default. The comparison table at the end is worth bookmarking.</p><p><strong><a href="https://appleboy.tech/articles/get-rid-of-your-swiftgen-dependency">Get Rid of Your SwiftGen Dependency</a></strong></p><p>This article makes a solid case for replacing SwiftGen with Xcode&#8217;s built-in symbol generation for strings, colors, and images. The key insight is that the symbols are generated during compilation, so no generated files in your repo, no merge conflicts, no build scripts to maintain. Just enable the right build setting and you get the same compile-time safety you had with SwiftGen.</p><blockquote><p>Worth noting: if you&#8217;re using SwiftGen for fonts, Core Data models, or other custom resource types, this won&#8217;t fully replace it. But for most projects, it&#8217;s one less dependency to keep alive.</p></blockquote><p><strong><a href="https://soumyamahunt.medium.com/what-you-should-know-before-migrating-from-gcd-to-swift-concurrency-74d4d9b2c4e1">What you should know before Migrating from GCD to Swift Concurrency</a></strong></p><p>This one covers the migration gotchas that the official guide skips. The part that stuck with me: actors are not drop-in replacements for serial queues. GCD guarantees FIFO order, Swift Concurrency doesn't, and that difference can introduce data races that are really hard to reproduce. Soumya Mahunt walks through each pitfall with side-by-side code comparisons.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode">Agent skills in Xcode: How to install and use them today</a></strong></p><p>Paul put together a GitHub repository collecting community-built agent skills for Xcode, Claude Code, and Codex. The idea is simple: skills are Markdown files that teach your coding agent things it doesn't already know, like new iOS 26 APIs, deprecated patterns, or SwiftData predicates that compile but crash at runtime. The repo already includes skills for SwiftUI, SwiftData, Swift Concurrency, and Swift Testing, and the list is growing.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>46 new iOS positions this week  </strong><em>(+2% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 30% / 70% / 0% &#128546;</p></li><li><p>Most wanted skills: SwiftUI 33% &#183; UIKit 20% &#183; Combine 11% &#183; MVVM 9%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS</strong> at <strong>State Farm</strong> (Tempe, AZ &#183; Bloomington, IL &#183; Richardson, TX &#183; Dunwoody, GA) &#8212; SwiftUI + UIKit combined codebase with Swift Concurrency, modular architecture <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-state-farm-4372805457">&#8594; Apply</a></strong></p><p><strong>Software Engineer, iOS</strong> at <strong>Garmin</strong> (Chandler, AZ) &#8212; Swift + SwiftUI for general aviation products; niche domain with real hardware context, peer code reviews, and a path to tech lead on derivative projects <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-at-garmin-4381921885">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://ronnierocha.dev/blog/ai-model-arena-game-hub/">I ran 9 frontier models through the same coding test</a></strong></p><p>One prompt, nine models, same spec. Sonnet 4.6 came out on top with a perfect test score and the best code review result.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:472455}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Which Apple product from this week&#8217;s lineup are you most excited about?</p><p><strong>Top Answer:</strong> MacBook Pro with M5 Pro/Max</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">9&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #50]]></title><description><![CDATA[Seven new Apple products, SwiftUI Onion Architecture, passkeys done right, and why your coding agent needs access to your analytics]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-50</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-50</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 06 Mar 2026 13:31:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zDiN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zDiN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zDiN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zDiN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg" width="1456" height="963" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:963,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zDiN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/?id=zmqipz05">Hello Developer: March 2026</a></strong></p><p>Apple's March edition is mostly about Xcode 26 coding intelligence. There's a new video, a live Q&amp;A thread on the Developer Forums, and fresh docs on giving external agentic tools access to Xcode.</p><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-february-2026/">What&#8217;s new in Swift: February 2026 Edition</a></strong></p><p>The monthly Swift community roundup is out! Two proposals were recently accepted: <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0506-advanced-observation-tracking.md">SE-0506</a> adds more control over <code>@Observable</code> tracking for advanced use cases like middleware, and <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0502-exclude-private-from-memberwise-init.md">SE-0502</a> fixes the long-standing issue where adding a private property with a default value would silently break your struct's memberwise initializer.</p><p><strong><a href="https://www.macrumors.com/2026/03/04/apple-unveiled-seven-products-this-week/">Apple Unveiled These Seven New Products This Week</a></strong></p><p>Apple dropped a lot of hardware this week. I won't hide it, the MacBook Neo is my favorite of the bunch. Not that I'm buying one, but it's genuinely exciting to see Apple go after the entry-level market this seriously. $599 powered by A18 Pro, and available in actual fun colors. If you're complaining about 8GB RAM on a $599 laptop, you're probably not the target audience &#128521;</p><div id="youtube2-kBX5WH9b4M4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;kBX5WH9b4M4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/kBX5WH9b4M4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://salgara.substack.com/p/swiftui-swift-effects-a-beautiful?r=5fy5ci&amp;utm_medium=ios&amp;triedRedirect=true">SwiftUI, Swift Effects: A Beautiful Onion Architecture</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Salgara&quot;,&quot;id&quot;:35733999,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e109dd9-fd1c-4ffa-848d-b42dff7f1bca_800x800.jpeg&quot;,&quot;uuid&quot;:&quot;1989c836-b415-436e-a8a5-8b2aaf2f1a9e&quot;}" data-component-name="MentionToDOM"></span> published an interesting experiment: what if you structured your entire SwiftUI app as nested views, like DI &#8594; DataStore &#8594; Logger &#8594; Fetch &#8594; ViewState, each layer handling its own concern? I use TCA myself, and I can see the appeal here: no long dependency chains, deterministic testing, and the whole thing fits naturally with how SwiftUI already thinks about composition. It's experimental, but worth reading if you're curious about alternatives to the standard DI approach.</p><p><strong><a href="https://tanaschita.com/ios-authentication-passkeys/">Implementing Passkeys in iOS with AuthenticationServices</a></strong></p><p>Passkeys keep coming up in security discussions, and this is a practical intro to actually implementing them. The article walks through both registration and authentication flows using <code>AuthenticationServices</code>, with code for handling <code>ASAuthorizationController</code> and the delegate callbacks.</p><p><strong><a href="https://www.avanderlee.com/ai-development/using-an-mcp-to-perform-product-optimizations/">Using an MCP to perform product optimizations</a></strong></p><p>Antoine van der Lee connected Amplitude to his coding agent via MCP, and now instead of manually digging through analytics charts, he just asks the agent what to work on next. The result: actual data-driven decisions without leaving the coding context. The combo with agent skills is where it gets really interesting, he prompts marketing psychology skills alongside real conversion numbers to improve upsells in his app. Less guessing, more shipping the right thing.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.hackingwithswift.com/articles/282/swiftui-agent-skill-claude-codex-ai">SwiftUI Agent Skill - Write better code with Claude, Codex, and other AI tools</a></strong></p><p>Paul Hudson released an open-source agent skill that teaches your AI coding tools to write better SwiftUI code. Deprecated API warnings, performance patterns, accessibility checks, concurrency tips, it's all in there, based on years of real SwiftUI experience. One command to install, works with Claude Code, Codex, and others. Worth adding to your setup.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>45 new iOS positions this week  </strong><em>(+13% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 47% / 51% / 2%</p></li><li><p>Most wanted skills: SwiftUI 49% &#183; Objective-C 40% &#183; UIKit 24% &#183; MVVM 16% &#183; Core Data 13%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Software Engineer, ChatGPT Engineering</strong> at <strong>OpenAI</strong> (San Francisco, CA) &#8212; working on the ChatGPT iOS app, pure Swift/SwiftUI stack with a team shipping features to hundreds of millions of users <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-chatgpt-engineering-at-openai-4375274377">&#8594; Apply</a></strong></p><p><strong>Mobile Engineer, iOS</strong> at <strong>Ramp</strong> (New York, NY) &#8212; Stack is SwiftUI + Swift Concurrency + The Composable Architecture + Bazel, one of the most modern setups in this week's dataset <strong><a href="https://www.linkedin.com/jobs/view/mobile-engineer-ios-at-ramp-4362814083?refId=A2A2UOeaEdl%2F%2BbZf0%2Bn%2FZQ%3D%3D&amp;trackingId=B%2FatL0XyYUM8cWs59aMO9w%3D%3D&amp;position=4&amp;pageNum=1">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer</strong> at <strong>Speak</strong> (San Francisco Bay Area) &#8212; AI conversation tutor backed by OpenAI, Accel, and Founders Fund; the iOS stack involves SwiftUI, real-time audio streaming (WebSockets, ll-hls), and Bitrise/Jenkins CI, one of the few roles where AI product and mobile streaming actually intersect <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-at-speak-4318185768?refId=wXfLhoaDX1ztf4SVxLd0Ag%3D%3D&amp;trackingId=L6Pl4U%2B0O2h%2FegTJg6b%2FZQ%3D%3D&amp;position=6&amp;pageNum=2">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://nilcoalescing.com/blog/AdjustingLineHeightInSwiftUIOniOS26/">Adjusting line height in SwiftUI on iOS 26</a></strong></p><p>A quick but useful look at the new <code>lineHeight(_:)</code> modifier coming in iOS 26. You get presets like <code>.loose</code> and <code>.tight</code>, plus more precise options: <code>multiple(factor:)</code>, <code>leading(increase:)</code>, and <code>exact(points:)</code>. The last one is the tricky one &#8212; fixed point values don't scale with Dynamic Type, so text can overlap or get clipped if the user bumps up their font size.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:468514}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How do you feel about a touchscreen Mac?</p><p><strong>Top Answer:</strong> Pointless for me</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">9&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #49]]></title><description><![CDATA[Touchscreen Mac is coming, Xcode 26.3 is out, SwiftUI animation process, SE-0508 trailing closures, automated migration tests and OSLog logging]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-49</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-49</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 27 Feb 2026 13:30:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c5DG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c5DG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c5DG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c5DG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg" width="1456" height="721" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:721,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MacBook Pro 13-inch - Apple&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="MacBook Pro 13-inch - Apple" title="MacBook Pro 13-inch - Apple" srcset="https://substackcdn.com/image/fetch/$s_!c5DG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://9to5mac.com/2026/02/24/new-m6-macbook-pro-details-revealed-including-dynamic-island-touch-more/">Apple has its first touchscreen-equipped Mac coming later this year</a></strong></p><p><a href="https://www.bloomberg.com/news/articles/2026-02-24/apple-s-touch-screen-macbook-pro-to-have-dynamic-island-new-interface">Mark Gurman confirmed</a> the details on the M6 MacBook Pro: OLED display, Dynamic Island replacing the notch, and a touchscreen that complements keyboard and trackpad rather than replacing them. I've long thought that bringing macOS and iPadOS closer together was the next logical step, and it's nice to finally see it materializing. I now have an official excuse for my smudgy screen: it's not a mess, it's touch workflow in action &#128578;</p><p><strong><a href="https://developer.apple.com/documentation/xcode-release-notes">Xcode 26.3 is out, and 26.4 beta is already here</a></strong></p><p><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_3-release-notes">Xcode 26.3</a> just landed on the App Store with agentic coding as the headline feature: Claude Agent and Codex can now work autonomously inside Xcode, exploring your codebase, searching docs, running builds, and even capturing Xcode Previews to verify their work. Meanwhile, Apple has already shipped <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_4-release-notes">Xcode 26.4 beta 2</a>, focused on refinements: image attachments in Swift Testing, severity levels for test issues, and improvements to String Catalogs.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.swiftdifferently.com/blog/swiftui/swiftui-animation-with-example">The 4-Step Process I Use to Create SwiftUI Animations</a></strong></p><p>Knowing the APIs isn&#8217;t enough, you can memorize every animation modifier and still produce animations that feel janky or drain battery. This article walks through a real example of rebuilding iOS&#8217;s large title navigation bar animation in a UIKit/SwiftUI hybrid app, and the four-step process the author uses to approach any animation problem. The part about preference keys to avoid triggering hundreds of state updates on every scroll is worth the read alone.</p><p><strong><a href="https://livsycode.com/swift/array-expression-trailing-closures-in-swift/">Array Expression Trailing Closures in Swift</a></strong></p><p><a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0508-array-expression-trailing-closures.md">SE-0508</a> removes a long-standing parsing restriction that prevented trailing closures after array and dictionary type expressions. So <code>[String] { ... }</code> now works as a constructor call, just like it does for any custom type. Not a groundbreaking feature, but if you write builder-style APIs or extensions around Array and Dictionary, this removes an annoying workaround you&#8217;ve probably hit before.</p><p><strong><a href="https://tanaschita.com/testing-database-migrations/">Preventing Forgotten Database Migrations with Automated Tests</a></strong></p><p>Schema changes are inevitable, and forgetting a migration means existing users hit a broken app on update. The approach here is simple: keep a baseline database file from an older version in your test target, copy it to a temp directory in a test, and try to open it with the current persistence stack. If it throws, the test fails. Works with Core Data, SwiftData, and Realm, and takes maybe an hour to set up.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://codakuma.com/swift-logging/">A simple logging framework in Swift</a></strong></p><p>Ever received a bug report that says &#8220;it crashed when I opened the app&#8221; with nothing else to go on? A solid read on building a lightweight wrapper around Apple&#8217;s built-in OSLog, structured logs with categories, automatic rotation, and an export function that pulls the last 24 hours of logs off the device as a text file. No third-party dependencies, no paid services, just clean and practical.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>40 new iOS positions</strong> this week <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 45% / 50% / 5%</p></li><li><p>Most wanted skills: SwiftUI 48% &#183; Core Data 28% &#183; UIKit 25% &#183; Objective-C 20% &#183; Combine 18%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Software Engineer, ChatGPT Engineering</strong> at <strong>OpenAI</strong> (San Francisco, CA) &#8212; working on the ChatGPT iOS app, pure Swift/SwiftUI stack with a team shipping features to hundreds of millions of users <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-chatgpt-engineering-at-openai-4375274377">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer, App Builds</strong> at <strong>Duolingo</strong> (New York, NY) &#8212; owning the build infrastructure for the world's most downloaded education app, Swift/SwiftUI at serious scale with 300+ A/B experiments running simultaneously <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-app-builds-at-duolingo-4258558564">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer</strong> at <strong>Intuit</strong> (New York, NY) &#8212; AI-native fintech behind TurboTax and QuickBooks, SwiftUI focus with explicit push to integrate LLMs into consumer-facing iOS products <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-at-intuit-4376164127/">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-t8NYLDB5Fg8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;t8NYLDB5Fg8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/t8NYLDB5Fg8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=t8NYLDB5Fg8">Swift Autoclosures - From First Principles to Smarter SwiftUI Validation</a></strong></p><p>You use <code>@autoclosure</code> every day with the nil coalescing operator, but most developers never think about what's actually happening. Worth watching if you've never gone deeper than &#8220;<code>??</code>&#8221;</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:459773}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What slows you down the most in iOS development?</p><p><strong>Top Answer:</strong> Debugging issues</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>February</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">24&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #48]]></title><description><![CDATA[Apple Experience on March 4, iOS 26.4 betas are out, agentic delivery pipelines, SwiftUI toast above everything, CLI tools over MCP servers, and tracking your Claude Agent from the menu bar.]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-48</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-48</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 20 Feb 2026 13:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vb7G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vb7G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vb7G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vb7G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vb7G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/02/17/apple-event-march-2026-preview/">Apple Experience on March 4</a></strong></p><p>Apple is hosting a special &#8220;Apple Experience&#8221; event on March 4 in New York, London, and Shanghai. It&#8217;s not a traditional keynote, so don&#8217;t expect a live stream. Instead, selected journalists get hands-on time with whatever Apple announces. </p><p><strong><a href="https://developer.apple.com/news/?id=xgkk9w83">Get ready with the latest beta releases</a></strong></p><p>Apple released the first betas of iOS 26.4, iPadOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, and watchOS 26.4. Time to fire up your test devices and check if your apps still behave as expected &#128640;</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.donnywals.com/setting-up-a-delivery-pipeline-for-your-agentic-ios-projects/">Setting up a delivery pipeline for your agentic iOS projects</a></strong></p><p>Donny Wals wrote about his CI/CD setup for agentic projects, and the gym story at the start is exactly what good agentic workflow looks like in practice. The <code>agents.md</code> as a living document piece is something I keep coming back to, you add rules every time the agent does something you don't want. The quality of your output is only as good as the guardrails you put in place upfront.</p><p><strong><a href="https://livsycode.com/swiftui/building-a-toast-component-in-swiftui/">Building a SwiftUI Toast in 5 Steps</a></strong></p><p>Toasts are more of an Android thing, but the approach here is solid. A temporary <code>UIWindow</code> placed above the app's main window is the right way to do it if you want the notification to appear above sheets, tab bars, and navigation. The <code>PassThroughWindow</code> implementation with Liquid Glass detection is a nice touch for iOS 26.</p><p><strong><a href="https://ronnierocha.dev/blog/dont-build-mcps-build-cli-tools/">Don&#8217;t Build MCPs, Build CLI Tools</a></strong></p><p>MCP was designed for sandboxed agents without terminal access. If you're using Claude Code, your agent already has a terminal and doesn't need the extra layer. We don't use MCP servers on our end either, and context window bloat is a big part of why. The argument for CLI tools, zero schema overhead, native composability with pipes, no server setup, is hard to ignore.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/artemnovichkov/ClaudeAgentBar">ClaudeAgentBar</a></strong></p><p>A macOS menu bar app that tracks your Claude Agent activity from Xcode: messages, sessions, tool calls, token counts, peak hours. Small tool, but useful if you want to keep an eye on how much your agent is actually doing.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-sc6pvW6vQzA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;sc6pvW6vQzA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/sc6pvW6vQzA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Paul Hudson is doing a live stream on February 21 covering exactly what a lot of us are figuring out right now: agentic coding in Xcode 26.3, Claude Code, Codex, Gemini, and the instructions and skills that keep AI on track.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:452575}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What&#8217;s your main AI coding setup for iOS development?</p><p><strong>Top Answer:</strong> Xcode to build + external to edit</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>February</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">24&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #47]]></title><description><![CDATA[Swift Student Challenge is open, the four ways developers use AI, SwiftData gets model inheritance, and a hands-on look at agentic Xcode]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-47</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-47</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 13 Feb 2026 13:30:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1a3Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1a3Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1a3Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1a3Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1a3Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1a3Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1a3Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1a3Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1a3Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1a3Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1a3Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F744a1d8a-e8d8-4ee0-bbeb-d41fad7321cd_2048x1075.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/?id=f0xw4t5r">Swift Student Challenge submissions are now open</a></strong></p><p>Apple just opened submissions for this year&#8217;s Swift Student Challenge. Students from anywhere in the world can submit their app playgrounds until February 28. No prior experience needed, it&#8217;s free, and you just need a Mac or iPad with Xcode or Swift Playgrounds. I really think this is one of the best opportunities for students getting into iOS. Even if you don&#8217;t win, the experience of building and submitting something real is super valuable. And if you do win, that&#8217;s an achievement that stays on your resume forever. If you know any students interested in development, definitely share this with them.</p><p><strong><a href="https://developer.apple.com/news/?id=d75yllv4">Updated App Review Guidelines now available</a></strong></p><p>Apple updated the App Review Guidelines. The main change: apps with random or anonymous chat features now fall under the 1.2 User-Generated Content guideline.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://tanaschita.com/swiftui-coordinators/">How to use SwiftUI Coordinators to communicate with UIKit</a></strong></p><p>Natascha Fadeeva wrote a clean walkthrough on using coordinators in SwiftUI. If you ever needed to wrap a UIKit view controller and pass data back to SwiftUI, this is exactly that. The example uses DataScannerViewController for QR code scanning, which still doesn&#8217;t have a native SwiftUI version. The article explains why you need a coordinator in the first place (UIKit delegates need a class, SwiftUI views are structs) and walks through the whole setup step by step. I actually used a similar approach on my own project and <a href="https://www.vladkhambir.com/posts/migrate-from-UIKit-to-SwiftUI/">wrote about it here</a>. </p><p><strong><a href="https://ronnierocha.dev/blog/coding-context-vibe-spectrum/">Coding, Context Engineering, Vibe Engineering, and Vibe Coding: Breaking Down the AI Development Workflow</a></strong></p><p>It breaks down four approaches to working with AI: traditional coding, context engineering, vibe engineering, and vibe coding. Turns out most of us are somewhere in the middle and didn't even have a name for it. The part about context engineering is probably the most useful. You prepare detailed instructions and coding specs for the AI, review each step, and build features incrementally. It's slower but way more reliable for production code. </p><p>And one thing I really agree with: no matter how much you trust AI with code generation, always review security yourself. Authentication flows, API keys, data handling, permission boundaries. <strong>That part is on you, not on AI.</strong></p><p><strong><a href="https://www.kodeco.com/49976785-getting-started-with-swiftdata-in-ios-26">Getting Started with SwiftData in iOS 26</a></strong></p><p>If you&#8217;ve been using SwiftData, you probably noticed it was missing one thing that CoreData had for years: model inheritance. Well, iOS 26 finally brings it. Kodeco published a solid walkthrough that covers how it works. The article uses a simple recipe app example where a <code>Beverage</code> class inherits from <code>Recipe</code>, getting all parent properties for free. No code duplication. Just keep in mind this only works if your minimum target is iOS 26 or above &#128532;</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.avanderlee.com/ai-development/core-data-agent-skill-now-available-open-source/">Core Data Agent Skill: Now available open-source</a></strong></p><p>Antoine van der Lee released an open-source Agent Skill for Core Data. If your project still relies on Core Data (and let&#8217;s be honest, a lot of projects do), this can help your coding agent understand things like threading, batch operations, CloudKit integration, migration strategies, and more. He built it from his own articles and his Core Data Best Practices repo, so the quality is solid.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-QdpaI_j0FRU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;QdpaI_j0FRU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/QdpaI_j0FRU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=QdpaI_j0FRU">Agentic Coding in Xcode 26.3: Full Walkthrough</a></strong></p><p>Stuart Lynch recorded a fully live, unedited walkthrough of building two SwiftUI apps using Claude Agent right inside Xcode 26.3. He builds a habit tracker and a personal finance app from a single prompt, and you can see the whole process: how the agent creates Swift Data models, organizes files into folders, fixes its own build errors, and even generates project documentation and an engineering journal. He also shows how to set up agents, add skills (like Antoine van der Lee&#8217;s SwiftUI and Swift Concurrency skills), and use a global <code>claude.md</code> file for project-level instructions. If you&#8217;re curious what agentic coding actually looks like in practice, this is a great video to watch.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:448877}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How do you currently use AI in your iOS development workflow?</p><p><strong>Top Answer:</strong> For everything</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #46]]></title><description><![CDATA[Agentic workflows in Xcode, Observation framework deep dives, and why your SwiftUI animations break]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-46</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-46</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 06 Feb 2026 13:32:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lSjs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lSjs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lSjs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lSjs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lSjs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lSjs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lSjs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg" width="1400" height="793" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:793,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lSjs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lSjs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lSjs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lSjs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eb54c22-19ec-4309-ad97-956c01348cc6_1400x793.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/hello/february26">Hello Developer: February 2026</a></strong></p><p>Xcode 26.3 just dropped, and honestly, this one feels different. Apple isn't just improving autocomplete anymore &#8211; they're going all-in on agentic workflows. Built-in agents like Anthropic&#8217;s Claude Agent and OpenAI Codex can now act autonomously inside Xcode, exploring your codebase, searching docs, fixing bugs, and running tests. It's less "AI suggests the next line" and more "AI helps you ship the whole feature." That's a pretty big shift, and I think it shows where Apple believes all of this is heading.</p><div id="youtube2-oV6mC8Rt1kY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;oV6mC8Rt1kY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/oV6mC8Rt1kY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://developer.apple.com/news/?id=ueeok6yw">Upcoming SDK minimum requirements</a></strong></p><p>Starting April 28, 2026, any app you upload to App Store Connect needs to be built with SDK 26. Apple keeps tightening this up, which basically means we all need to stay current with toolchains and, whether we like it or not, adopt newer APIs and design patterns sooner.</p><div class="pullquote"><p>Every week: 3 stories of how it all went wrong. </p><p>Real devs. Real failures. Real lessons.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://failhub.substack.com&quot;,&quot;text&quot;:&quot;Visit FailHub&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://failhub.substack.com"><span>Visit FailHub</span></a></p></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.swiftjectivec.com/agentic-coding-codex-claude-code-in-xcode/">Agentic Coding in Xcode 26.3 with Claude Code and Codex</a></strong></p><p>Jordan Morgan wrote about his experience with agentic workflows in Xcode, and it's worth your time. What caught my attention is that Apple didn't reinvent the wheel here &#8211; they actually embraced what's already working: agents.md, skills, MCPs. They just made Xcode a first-class environment for it.</p><p><strong><a href="https://tanaschita.com/swiftui-observation-migrating-to-observation/">Migrating to the Observation framework in SwiftUI</a></strong></p><p>A great walkthrough of what really changes when you move from <code>ObservableObject</code> to <code>Observation</code>. Not just the syntax &#8211; the actual concepts. The property-level tracking piece is huge for performance, especially if you're working on a bigger SwiftUI app. If you've been treating <code>Observable</code> like a simple find-and-replace, this article will show you why that's not enough. You need to rethink how you use <code>State</code>, <code>Bindable</code>, and <code>Environment</code>.</p><p><strong><a href="https://swiftwithmajid.com/2026/02/03/on-demand-resources-in-ios-app/">On-demand resources in iOS app</a></strong></p><p> liked this one because it reminds us that On-Demand Resources aren't just for games with huge asset bundles. You can actually use them for security &#8211; moving API tokens and sensitive configs out of your main binary to make reverse engineering harder. The article includes a clean async wrapper around <code>NSBundleResourceRequest</code>. Sure, Apple considers this legacy now, but it's still useful knowledge before you move to Background Assets.</p><p><strong><a href="https://captainswiftui.substack.com/p/objectively-better-observably-trickier?r=5fy5ci&amp;utm_campaign=post&amp;utm_medium=web&amp;triedRedirect=true">Objectively Better, Observably Trickier</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Danny Bolella&quot;,&quot;id&quot;:16860009,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85253e94-1d3a-4686-b03b-58c0a78b655b_1176x1176.jpeg&quot;,&quot;uuid&quot;:&quot;8b8cc457-5919-461e-9a1b-66902a29842b&quot;}" data-component-name="MentionToDOM"></span> explained why Observation isn&#8217;t just Combine 2.0. The shift from push to pull model is explained really well here, and then it walks through real traps: lazy initialization, nested observables, arrays, and property wrappers. If you migrated to <code>Observable</code> and your UI mysteriously stopped updating, this will probably explain exactly what went wrong.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.avanderlee.com/ai-development/swiftui-agent-skill-build-better-views-with-ai/">SwiftUI Agent Skill: Build better views with AI</a></strong></p><p>Antoine built an open-source SwiftUI Agent Skill that teaches coding agents how to write better SwiftUI code. It's structured, reusable knowledge that agents can actually apply consistently. Layout patterns, performance tips, modern APIs, Liquid Glass &#8211; it's all in there! If you're serious about using agents and don't want to accumulate SwiftUI tech debt even faster, check this out.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://www.swiftdifferently.com/blog/swiftui/swiftui-animations-deep-dive">How Your Views Actually Move</a></strong></p><p>This is one of those deep dives that makes everything click. If you've ever wondered "why is this animation broken?", this article breaks down SwiftUI animations from first principles: state changes, render trees, transactions, and transitions. SwiftUI animations can feel like magic in the worst way &#8211; this article turns that into actual understanding.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:445186}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>When using AI to build apps, what hurts you the most?</p><p><strong>Top Answer:</strong> High costs &amp; rate limits</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>February</strong></p><ul><li><p><a href="https://dev.events/ical/ar-ctic-conference-5mnr1f4l">10&#8211;12</a> &#8212; <strong><a href="https://arcticonference.com/">Arctic Conference</a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #45]]></title><description><![CDATA[Swift goes Windows, AI speeds you up (and breaks you faster), linking choices that actually matter, and why your pickers keep surprising you in prod.]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-45</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-45</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 30 Jan 2026 13:31:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GR4M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GR4M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GR4M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GR4M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GR4M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GR4M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GR4M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:814854,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://vladkhambir.substack.com/i/186242762?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GR4M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GR4M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GR4M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GR4M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F081578cf-be00-4ce4-9ba0-de6679d9d59b_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.swift.org/blog/announcing-windows-workgroup/">Announcing the Windows Workgroup</a></strong></p><p>Swift officially launched a Windows Workgroup for long-term platform support &#8212; toolchains, core libraries, proper Windows API interop, the whole thing. This feels different from previous attempts. It's community-led, focused, and actually looks sustainable. Swift isn't just "that Apple language" anymore, and I'm honestly curious to see where this goes.</p><div class="pullquote"><p>Every week: 3 stories of how it all went wrong. </p><p>Real devs. Real failures. Real lessons.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://failhub.substack.com&quot;,&quot;text&quot;:&quot;Visit FailHub&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://failhub.substack.com"><span>Visit FailHub</span></a></p></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.avanderlee.com/ai-development/ai-app-development-what-i-learned-in-one-month/">AI App Development: What I Learned in One Month</a></strong></p><p>Antoine wrote an honest post about going all-in with AI tools for app dev. Yeah, you ship fast. Really fast. But tech debt, hidden dependencies, and missing guardrails hit you even faster. His main point resonated with me: AI doesn't replace good process, it just makes your current process louder. If your setup is messy, AI will help you build mess faster. Linting, clear agent rules, early dependency checks &#8212; these matter way more now. Good reality check if you've been riding the AI hype train.</p><p><strong><a href="https://livsycode.com/best-practices/static-dynamic-and-mergeable-linking-in-modular-ios-apps/">Static, Dynamic, and Mergeable Linking in Modular iOS Apps</a></strong></p><p>This one breaks down linking strategies in modular projects and the real trade-offs you face with many targets, extensions, and CI pipelines. Here's what stuck with me: at scale, linking isn't some low-level compiler thing anymore. It's a product decision. It affects build times, binary size, Xcode previews, team velocity. Worth reading if your modular setup is starting to feel slow and you're wondering if SwiftPM defaults still make sense for your project.</p><p><strong><a href="https://www.createwithswift.com/sharing-content-among-apps-using-appentity-and-transferable-protocol/">Sharing content among apps using AppEntity and Transferable protocol</a></strong></p><p>Practical walkthrough on making your app data work system-wide with <code>AppEntity</code> and <code>Transferable</code>. What I liked here is the framing: this isn't about "export" features, it's about making your app a real citizen in the Apple ecosystem. Data becomes the interface, not UI. If you care about Shortcuts, Siri, or just proper iOS integration, this is worth your time.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://tuist.dev/blog/2026/01/27/flaky-tests">Stop Flaky Tests from Blocking Your PRs</a></strong></p><p>Flaky tests kill productivity, and with AI-generated PRs everywhere now, it's getting worse. Tuist's approach makes sense: auto-detect flakiness, quarantine those tests, keep shipping. Don't let noise block your team. If your CI feels unreliable lately, this is a practical fix worth checking out.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-_wpqggVJCYQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_wpqggVJCYQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_wpqggVJCYQ?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Deep dive into SwiftUI pickers &#8212; the parts that actually break in production. Tags, identity, optional selections, picker styles that scale. The key insight: pickers are value-driven, not view-driven. Once you get that, 90% of the weird bugs make sense. Good watch, even if you think you already know pickers. Turns out most of us don't.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:441434}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How do you feel about AI agents in your daily dev workflow?</p><p><strong>Top Answer:</strong> Useful, but I stay cautious</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>February</strong></p><ul><li><p><a href="https://dev.events/ical/ar-ctic-conference-5mnr1f4l">10&#8211;12</a> &#8212; <strong><a href="https://arcticonference.com/">Arctic Conference</a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #44]]></title><description><![CDATA[New Apple hardware, MVVM-C scalability, designing empty states in SwiftUI, Universal Links at scale, real-world StoreKit 2 subscriptions, AI-powered dev tools, and why Identifiable matters]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-44</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-44</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 23 Jan 2026 13:31:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HVG8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HVG8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HVG8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HVG8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HVG8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HVG8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HVG8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HVG8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!HVG8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!HVG8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!HVG8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab66c83-7579-4296-b45a-72f32437c41d_1600x900.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/01/21/five-all-new-apple-products-this-year/">Apple Expected to Unveil Five All-New Products This Year</a></strong></p><p>Apple's looking pretty busy this year! They're finally dropping that foldable iPhone everyone's been waiting for, plus some interesting smart home stuff like a Face ID doorbell and a home hub. It's unusual for Apple to launch this many brand-new products at once, but as an Apple fan, this would be like Christmas for me!</p><div><hr></div><blockquote><p>I want to hear about the times you messed up, when your code crashed prod, when your &#8220;quick fix&#8221; became a three-day nightmare, when you made the wrong call and had to own it.</p><p>After 60+ conversations with people in tech, I&#8217;m sharing three real failures every week.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://failhub.substack.com&quot;,&quot;text&quot;:&quot;Visit FailHub&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://failhub.substack.com"><span>Visit FailHub</span></a></p></blockquote><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.linkedin.com/pulse/edition-10-why-mvvm-c-coordinators-does-scale-swiftui-bruno-duzxe/?trackingId=cHb73S9ZTYODcs%2F29PPM4A%3D%3D">Why MVVM-C with Coordinators Does Scale: A real-world SwiftUI perspective</a></strong></p><p>This experience-driven take on MVVM-C explains why it can scale in SwiftUI when applied with real feature boundaries. I like the SwiftUI angle here: coordinators as explicit, observable flows that model intent instead of fighting navigation APIs. If you&#8217;re debating MVVM-C vs TCA or feeling growing fear around refactors and team ownership, this is a great read.</p><p><strong><a href="https://captainswiftui.substack.com/p/emptiness-in-swiftui?triedRedirect=true">Emptiness in SwiftUI</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Danny Bolella&quot;,&quot;id&quot;:16860009,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85253e94-1d3a-4686-b03b-58c0a78b655b_1176x1176.jpeg&quot;,&quot;uuid&quot;:&quot;ac3b2108-0529-4c83-811b-27347d77417e&quot;}" data-component-name="MentionToDOM"></span> wrote a really thoughtful piece about handling empty states in SwiftUI. It breaks down three distinct types of emptiness: <code>EmptyView</code> for layout structure, <code>EmptyModifier</code> for type system requirements, and <code>ContentUnavailableView</code> for actual user-facing scenarios. It's one of those reads that'll change how you think about every blank state and conditional you write in SwiftUI.</p><p><strong><a href="https://albertodebortoli.com/2026/01/15/universal-links-at-scale-the-challenges-nobody-talks-about/">Universal Links At Scale: The Challenges Nobody Talks About</a></strong></p><p>Universal Links sound simple until you ship them at scale. This article cuts through the usual setup guides to expose the real pain points: CDN caching issues, pattern matching quirks, and the complete lack of decent tooling. Worth reading if you're running these in production and want to avoid nasty surprises.</p><p><strong><a href="https://www.createwithswift.com/providing-access-to-premium-features-with-storekit-2/">Providing access to premium features with StoreKit 2</a></strong></p><p>A very practical guide to StoreKit 2 that skips theory and goes straight to real subscription mechanics. It clearly shows how to model tiers, handle upgrades correctly, and keep SwiftUI in sync with StoreKit state without hacks or global singletons everywhere.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://commanderai.app/">commanderai.app</a></strong></p><p>Jumping between your editor, terminal, git client, and AI chat kills momentum fast. Commander wraps it all into one native Mac app with Codex integration and built-in git handling. Solid option if you want AI coding assistance that doesn't fragment your workflow.</p><p><strong><a href="https://www.avanderlee.com/ai-development/11-things-i-learned-after-using-ai-agents-full-time/">11 Things I learned after using AI Agents full-time</a></strong></p><p>A checklist from someone who's actually running agents in production, not just tinkering. The focus is on discipline: plan first, keep changes small, set clear boundaries, and treat agents like juniors who need structure.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://wesleydegroot.nl/blog/identifiable-protocol-in-swift">The Identifiable Protocol in Swift</a></strong></p><p>A deep dive into <code>Identifiable</code> that explains why identity matters beyond just satisfying the compiler. Read this if you&#8217;ve debugged strange List updates or navigation glitches and want to understand the root cause.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:437670}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How do you feel about Siri potentially powered by Google&#8217;s Gemini?</p><p><strong>Top Answer:</strong> Cautiously optimistic</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>February</strong></p><ul><li><p><a href="https://dev.events/ical/ar-ctic-conference-5mnr1f4l">10&#8211;12</a> &#8212; <strong><a href="https://arcticonference.com/">Arctic Conference</a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #43]]></title><description><![CDATA[Apple's Google AI bet, dependencies you don't need, native Markdown rendering, gesture hierarchy, Agent Skills, and custom string interpolation]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-43</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-43</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 16 Jan 2026 13:30:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Wvha!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Perfect CVs are useless. I want to hear about the times you messed up, when your code crashed prod, when your &#8220;quick fix&#8221; became a three-day nightmare, when you made the wrong call and had to own it.</p><p>After 60+ conversations with people in tech, I&#8217;m sharing three real failures every week. First issue is live.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://failhub.substack.com/p/failhub-issue-1&quot;,&quot;text&quot;:&quot;Visit FailHub&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://failhub.substack.com/p/failhub-issue-1"><span>Visit FailHub</span></a></p></blockquote><h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wvha!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wvha!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Wvha!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Wvha!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Wvha!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wvha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg" width="700" height="467" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:467,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Siri and Gemini logos seen on an iPhone.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Siri and Gemini logos seen on an iPhone." title="Siri and Gemini logos seen on an iPhone." srcset="https://substackcdn.com/image/fetch/$s_!Wvha!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Wvha!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Wvha!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Wvha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e94622f-8e18-4191-8109-29b0b60e218f_700x467.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://blog.google/company-news/inside-google/company-announcements/joint-statement-google-apple/">Joint statement from Google and Apple</a></strong></p><p>Hey, Siri&#8230;ously?! Apple and Google announced a multi-year partnership in which the next generation of Apple Foundation Models will be based on Google&#8217;s Gemini, powering Apple Intelligence and a more personalized Siri.</p><p>Apple keeps on device execution and privacy, but bets on Google for the core AI foundation. This is HUGE, probably the biggest Siri change in years!</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.fractal-dev.com/blog/should-you-use-all-these-dependencies">Should you use all these dependencies?</a></strong></p><p>Good reality check on how dependencies sneak into iOS projects and become expensive later. The RxSwift and Alamofire examples are spot on, they show how "everyone uses this" often means solving problems you don't actually have.</p><p><strong><a href="https://artemnovichkov.com/blog/rendering-markdown-in-swiftui">Rendering Markdown in SwiftUI</a></strong></p><p>SwiftUI does support Markdown, you just need to understand how Text and <code>AttributedString</code> work. The <code>AttributedString</code> part is really useful, showing you can do a lot without extra libraries. Must-read if you're presenting user content or docs and want full control.</p><p><strong><a href="https://www.createwithswift.com/understanding-gesture-hierarchy/">Understanding gesture hierarchy</a></strong></p><p>Clear explanation of why gestures stop working when you nest views. Shows <code>GestureMask</code>, <code>highPriorityGesture</code>, and <code>defersSystemGestures</code> with simple examples. Read this to avoid broken taps or drags in your app.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.avanderlee.com/ai-development/agent-skills-replacing-agents-md-with-reusable-ai-knowledge/">Agent Skills explained: Replacing AGENTS.md with reusable AI knowledge</a></strong></p><p>Good article on making AI tools work across multiple projects. Antoine explains why AGENTS.md becomes a mess, and how Agent Skills help you reuse knowledge properly. If you work with AI agents on Swift projects, this will help your workflow.</p><div><hr></div><p><strong>&#127852; One More Thing&#8230;</strong></p><p><strong><a href="https://nilcoalescing.com/blog/DefiningCustomStringInterpolationBehaviorInSwift/">Defining custom string interpolation behavior in Swift</a></strong></p><p>Swift&#8217;s string interpolation can do way more than most people think. The <code>FormatStyle</code> example shows how to make your strings clean and reusable.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:433998}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Does your app fully support Dark Mode?</p><p><strong>Top Answer:</strong> Yes, fully supported across the app</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>January</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-conf-sg-trll6ox">21&#8211;23</a> &#8212; <strong><a href="https://www.iosconf.sg/">iOS Conf SG</a></strong> <em>(Singapore &#127480;&#127468;)</em></p></li></ul><p><strong>February</strong></p><ul><li><p><a href="https://dev.events/ical/ar-ctic-conference-5mnr1f4l">10&#8211;12</a> &#8212; <strong><a href="https://arcticonference.com/">Arctic Conference</a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">15&#8211;16</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #42]]></title><description><![CDATA[Hello Developer kicks off 2026, Dark Mode, SwiftUI motion and previews, agentic AI workflows, and testable side effects in Swift]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-42</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-42</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 09 Jan 2026 13:31:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!187k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!187k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!187k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 424w, https://substackcdn.com/image/fetch/$s_!187k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 848w, https://substackcdn.com/image/fetch/$s_!187k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!187k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!187k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:714661,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://vladkhambir.substack.com/i/183936214?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!187k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 424w, https://substackcdn.com/image/fetch/$s_!187k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 848w, https://substackcdn.com/image/fetch/$s_!187k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!187k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F557806a5-2d36-4bfc-83e0-54583bed604d_2048x1366.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/?id=zni5qkkl">Hello Developer: January 2026</a></strong></p><p>Apple kicks off 2026 with a fresh Hello Developer update, and it is a solid one. Between a dedicated SwiftUI activity in Cupertino, deeper conversations around Liquid Glass, and new Develop in Swift tutorials. It feels like Apple is doubling down on both design and developer education!</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://wesleydegroot.nl/blog/dark-mode">Dark Mode</a></strong></p><p>Dark Mode is one of those features that feels obvious, yet is still easy to get wrong. This article walks through Dark Mode in SwiftUI from the right angle: rely on system defaults first, use asset catalogs properly, and only reach for <code>colorScheme</code> when you really need custom behavior.</p><p><strong><a href="https://dimillian.medium.com/the-state-of-agentic-ios-engineering-in-2026-c5f0cbaa7b34">The State of Agentic iOS Engineering in 2026</a></strong></p><p>This is one of the most honest takes on AI-assisted iOS development I have read so far. Thomas describes agentic engineering not as magic automation, but as a constant evolution of workflows where you work more, yet feel like you produce less friction. </p><p><strong><a href="https://www.createwithswift.com/understanding-spring-animations-in-swiftui/">Understanding Spring Animations in SwiftUI</a></strong></p><p>This is a great practical guide on why spring animations matter and how to use them intentionally in SwiftUI. Letizia explains springs not as eye candy, but as a communication tool that makes interfaces feel responsive and human, especially for direct user interactions.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/Alex-Ozun/swift-effect">Swift Effect</a></strong></p><p>Swift Effect is one of the more interesting experiments I&#8217;ve seen around side effects in Swift. It gives you a lightweight &#8220;effects and handlers&#8221; model that feels closer to do-try-catch than classic DI, so your app code can stay linear while I/O, networking, and concurrency become interceptable and testable.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-zrqFczU1iFg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;zrqFczU1iFg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/zrqFczU1iFg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Preview traits are an underrated SwiftUI feature that can seriously boost your productivity. This video shows how to use built-in and custom traits to manage orientations, Dark Mode, Dynamic Type, and even mock network or SwiftData layers directly in previews.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:430234}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How do you see Apple&#8217;s AI strategy today?</p><p><strong>Top Answer:</strong> Long-term bet that will pay off</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>January</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-conf-sg-trll6ox">21&#8211;23</a> &#8212; <strong><a href="https://www.iosconf.sg/">iOS Conf SG</a></strong> <em>(Singapore &#127480;&#127468;)</em></p></li></ul><p><strong>February</strong></p><ul><li><p><a href="https://dev.events/ical/ar-ctic-conference-5mnr1f4l">10&#8211;12</a> &#8212; <strong><a href="https://arcticonference.com/">Arctic Conference</a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">15&#8211;16</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #41]]></title><description><![CDATA[Apple&#8217;s long-term AI bet, agentic workflows, date decoding strategies, cleaner package setups, and a practical look at closing the loop with AI in real iOS development]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-41</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-41</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 02 Jan 2026 13:30:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c-GZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c-GZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c-GZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c-GZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c-GZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c-GZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c-GZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg" width="1456" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:812,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Apple Intelligence features&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Apple Intelligence features" title="Apple Intelligence features" srcset="https://substackcdn.com/image/fetch/$s_!c-GZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c-GZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c-GZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c-GZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3334706-5ef6-4400-9211-51d66802b069_2160x1204.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2025/12/30/apple-ai-strategy-could-pay-off-in-2026/">Report: Apple&#8217;s AI Strategy Could Finally Pay Off in 2026</a></strong></p><p>Apple&#8217;s cautious AI strategy might finally make sense. While others burn billions on proprietary models, Apple is fine treating LLMs as a commodity, using third-party models like Gemini and shipping AI through iPhone-level OS integration. It feels strange for a company that used to lead the industry, and the AI race looks lost for now, but maybe the bubble is making all of us miss the real play.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.vladkhambir.com/posts/windsurf-workflows-software-development-lifecycle/">Using Windsurf Workflows to Automate the Software Development Lifecycle</a></strong></p><p>In this article, I explain why real AI productivity starts not with prompts, but with structured workflows. I demonstrate how Windsurf Workflows can standardize everyday engineering tasks, why context management becomes critical at scale, and how the Agent Skills pattern from Claude helps keep AI focused on reasoning rather than glue code. If you&#8217;re experimenting with AI beyond autocomplete and want something that actually works in production, this one is worth your time.</p><p><strong><a href="https://tanaschita.com/swift-json-date-decoding-encoding/">Understanding date decoding strategies when working with JSON in Swift</a></strong></p><p>Dates are where JSON decoding in Swift quietly breaks in real projects, and this article does a great job explaining why. It walks through all date decoding strategies in <code>JSONDecoder</code>, from timestamps and ISO 8601 to custom fallback logic when APIs are inconsistent.</p><p><strong><a href="https://www.massicotte.org/blog/package-swift/">Versioned Package.swift Files</a></strong></p><p>This is a sharp take on a trend that looks clever but usually isn&#8217;t. Matt explains why versioned Package.swift files make sense only when you truly need newer manifest APIs, and why using them to bump the tools version adds complexity with zero upside.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://marketplace.visualstudio.com/items?itemName=artemnovichkov.asset-catalog-viewer">Asset Catalog Viewer</a></strong></p><p>Asset Catalog Viewer is a small but very practical VSCode add-on for anyone who touches .xcassets outside Xcode. It brings the familiar three-panel asset catalog UI into VSCode, with previews, properties, and support for image sets, colors, app icons, and data assets, including @1x/@2x/@3x and device-specific variants.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://twocentstudios.com/2025/12/27/closing-the-loop-on-ios-with-claude-code/">Closing the Loop on iOS with Claude Code</a></strong></p><p>This post is a great reminder that agentic coding only becomes useful when the agent can actually see the results of its work. It walks through a practical &#8220;closed loop&#8221; for iOS: build with cache intact, install and launch on the simulator, read logs, and even poke the UI, with a bonus step for running on real devices when the simulator lies. If you&#8217;re experimenting with Claude Code and keep getting stuck at &#8220;looks good in theory,&#8221; this is the missing piece.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:426647}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What tool do you use for project documentation?</p><p><strong>Top Answer:</strong> Notion</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>January</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-conf-sg-trll6ox">21&#8211;23</a> &#8212; <strong><a href="https://www.iosconf.sg/">iOS Conf SG</a></strong> <em>(Singapore &#127480;&#127468;)</em></p></li></ul><p><strong>February</strong></p><ul><li><p><a href="https://dev.events/ical/ar-ctic-conference-5mnr1f4l">10&#8211;12</a> &#8212; <strong><a href="https://arcticonference.com/">Arctic Conference</a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>