<?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>Mon, 06 Apr 2026 20:34:39 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 #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><item><title><![CDATA[The iOS Weekly Brief – Issue #40]]></title><description><![CDATA[Swift 6.2 momentum, modern debugging with LLDB, deterministic async testing, custom document types in SwiftUI, smarter AI workflows with SwiftAgents, and a small but lovely testing improvement]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-40</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-40</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 26 Dec 2025 13:30:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jh4t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_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_!jh4t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jh4t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!jh4t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!jh4t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!jh4t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jh4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45001325-ff14-4fd3-a853-e15d8b4776c6_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;:1085747,&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/182568066?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_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_!jh4t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!jh4t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!jh4t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!jh4t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45001325-ff14-4fd3-a853-e15d8b4776c6_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/whats-new-in-swift-december-2025/">What&#8217;s new in Swift: December 2025 Edition</a></strong></p><p>Swift ends 2025 on a strong note: Swift 6.2 makes concurrency easier to adopt, and memory safety keeps pushing the language forward. Swift is no longer just about Apple platforms, with real progress on Android, server, embedded, and AI. A great high-level snapshot of where Swift is heading next.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://livsycode.com/best-practices/debugging-swift-code-from-print-to-lldb/">Debugging Swift Code: From print() to LLDB</a></strong></p><p>This is a practical walkthrough of modern Swift debugging, showing when <code>print()</code> still makes sense and when you should switch to LLDB tools like <code>v</code>, <code>po</code>, <code>p</code>, and <code>expr</code>. It does a great job of explaining how to debug complex async and SwiftUI-driven flows without polluting your code or rebuilding on every change. A must-read if you want faster feedback loops and a cleaner codebase.</p><p><strong><a href="https://darjeelingsteve.com/articles/Bringing-Structure-to-Swift%27s-Unstructured-Concurrency-for-Reliable-Unit-Testing.html">Bringing Structure to Swift&#8217;s Unstructured Concurrency for Reliable Unit Testing</a></strong></p><p>It dives into the problems unstructured concurrency creates for unit testing when using <code>Task {}</code> directly in Swift and SwiftUI. The piece shows how abstracting task scheduling brings determinism to async code, making tests predictable and reliable. A solid approach for anyone struggling with flaky async tests.</p><p><strong><a href="https://serialcoder.dev/text-tutorials/swiftui/creating-and-opening-custom-document-types-in-swiftui/">Creating and Opening Custom Document Types in SwiftUI</a></strong></p><p>A step-by-step guide to defining custom document types in SwiftUI and registering them with the system. It covers exported type identifiers, document types, and handling incoming file URLs so your app can open files directly from Finder.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/twostraws/SwiftAgents">SwiftAgents</a></strong></p><p>SwiftAgents is a practical AGENTS.md template for Swift and SwiftUI projects using LLMs, focused on avoiding the most common AI-generated code mistakes. I like that it aggressively targets modern APIs and iOS 26+, which makes AI output much cleaner and more future-proof. Worth checking out if you&#8217;re actively using AI in your Swift workflow and want more predictable results.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://www.swiftwithvincent.com/blog/swift-62-lets-you-write-better-test-names">Swift 6.2 lets you write better test names</a></strong></p><div id="youtube2-lWcJ171OnWw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;lWcJ171OnWw&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/lWcJ171OnWw?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>Swift 6.2 removes the need for awkward test function names by allowing raw identifiers, so your test description can be the function name itself.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:423721}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How do you feel about a potential foldable iPhone?</p><p><strong>Top Answer:</strong> I&#8217;d love to use a foldable iPhone</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><item><title><![CDATA[The iOS Weekly Brief – Issue #39]]></title><description><![CDATA[Leaks of a foldable iPhone, Xcode 26.2 updates, on-device Apple Intelligence, cleaner localization patterns, a fresh take on Swift concurrency, and real-world CloudKit lessons]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-39</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-39</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 19 Dec 2025 13:31:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pmH2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_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_!pmH2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pmH2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pmH2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pmH2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pmH2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pmH2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f0a3b5c-6275-4ad6-bc77-a7cfde246701_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_!pmH2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pmH2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pmH2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pmH2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f0a3b5c-6275-4ad6-bc77-a7cfde246701_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/2025/12/15/apple-leak-unreleased-devices-codenames/">Apple Leak Confirms Work on Foldable iPhone</a></strong></p><p>A leaked Apple prototype running an early build of iOS 26 revealed codenames for dozens of unreleased devices, including a foldable iPhone. Some of the new products are expected in early 2026.</p><p>On a personal note, I watched <a href="https://www.youtube.com/watch?v=trsHTKqmZOk">MKBHD&#8217;s Samsung Galaxy Z Tri Fold review</a> this week and was genuinely impressed. It feels bold and experimental, and I&#8217;d love to see Apple explore similarly ambitious foldable designs.</p><p><strong><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_2-release-notes">Xcode 26.2 Release</a></strong></p><p>Xcode 26.2 comes with Swift 6.2.3, updated SDKs, better on-device debugging, and performance improvements for ChatGPT-powered coding assistance.</p><p><strong><a href="https://ads.apple.com/app-store/help/ad-placements/0082-search-results">Additional ads in App Store search results</a></strong></p><p>Starting in 2026, Apple will add more ad placements to App Store search results, pushing organic results further down the page. This makes ASO more competitive and tightly coupled with Apple Ads, especially on high-intent keywords. For indie developers, it likely means organic growth alone will be harder, and promotion without paid ads will become increasingly challenging.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.kodeco.com/49841134-using-apple-foundation-models-to-summarize-text">Using Apple Foundation Models to Summarize Text</a></strong></p><p>Explore how to use Apple Foundation Models to summarize text fully on-device, walking through availability checks, limitations, and a practical share extension example. A great hands-on intro if you want to experiment with Apple Intelligence in real apps, understand its constraints, and see where on-device LLMs actually make sense today.</p><p><strong><a href="https://danijelavrzan.com/posts/2025/12/strings-localized-in-a-single-file/">Keep Your Strings Clean and Localized in a Single File</a></strong></p><p>A clean, scalable approach to localization that keeps all strings in a single L10n file while still fully leveraging Xcode&#8217;s String Catalog. A very practical pattern for large SwiftUI codebases where scattered strings quickly become unmaintainable.</p><p><strong><a href="https://www.massicotte.org/blog/non-sendable-first-design/">Non-Sendable First Design</a></strong></p><p>A deep dive into a &#8220;Non-Sendable First&#8221; design approach that argues for starting with plain, nonisolated types and only adding isolation when it&#8217;s truly needed. With <code>NonisolatedNonsendingByDefault</code>, non-sendable types become simpler, more flexible, and often a better default than MainActor or actors. A thought-provoking read that may change how you model concurrency in Swift.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://fatbobman.com/en/posts/my-eight-years-with-cloudkit/">My Eight Years with CloudKit</a></strong></p><p>A long-form, experience-driven look at CloudKit from eight years of real production use, from the IceCream open-source library to scaling commercial apps with tens of thousands of daily users. Packed with practical insights, trade-offs, and advanced patterns like cross-app data sharing and remote feature flags, this is a great Toolbox pick if you&#8217;re considering CloudKit beyond the basics.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://fatbobman.com/en/snippet/why-child-state-won-not-update-from-parent-in-swiftui/">Why Child State Won&#8217;t Update from Parent in SwiftUI</a></strong></p><p>A clear explanation of why <code>State</code> in a child view does not react to parent updates, and why this behavior is by design in SwiftUI. A great reminder to treat <code>State</code> as private view state and reach for let or <code>Binding</code> when data comes from outside.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:421338}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How often do you check your app for possible retain cycles?</p><p><strong>Top Answer:</strong> Rarely, only when a bug appears</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>December</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">9-26</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>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><item><title><![CDATA[The iOS Weekly Brief – Issue #38]]></title><description><![CDATA[App Store Awards, Liquid Glass updates, enum architecture tricks, design ethics, retain-cycle pitfalls, battery myths, and a neat SwiftUI shadow effect]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-38</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-38</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 12 Dec 2025 13:32:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MD5f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_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_!MD5f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MD5f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MD5f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MD5f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MD5f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MD5f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a8e5692-ad60-4019-96c5-53850af77070_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_!MD5f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MD5f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MD5f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MD5f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e5692-ad60-4019-96c5-53850af77070_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/?id=mu3kfca2">Hello Developer: December 2025</a></strong></p><p>Apple&#8217;s December Hello Developer roundup highlights the 2025 App Store Award winners, new Liquid Glass design activities, fresh videos, and updates to the HIG and documentation. A quick, clean snapshot of what&#8217;s new across the developer ecosystem.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.linkedin.com/pulse/swift-enum-hidden-magic-tricks-bruno-valente-pimentel--s8snf/">Swift Enum Hidden Magic Tricks</a></strong></p><p>A sharp breakdown of why senior iOS engineers treat enums as architecture, not syntax. The article demonstrates how enums eliminate impossible states, eliminate boolean soup, and transform messy flows into compiler-verified state machines. If your app logic still relies on scattered flags and optionals, this piece serves as a reminder that enums are often the cleaner, safer model you should strive for.</p><p><strong><a href="https://www.createwithswift.com/the-power-of-ethics-in-mobile-design/">The power of ethics in mobile design</a></strong></p><p>This article explains why ethics is now a key part of mobile design. It shows how clear communication, privacy, inclusion, and careful use of AI help build trust and create better apps. A good reminder that modern design is not only about visuals, but about the intentions behind every feature we ship.</p><p><strong><a href="https://tanaschita.com/swift-async-tasks-memory-management/">How to avoid retain cycles when working with tasks in Swift</a></strong></p><p>A practical guide to how tasks capture values in Swift and when retain cycles can appear. It explains when strong captures are safe and when you should use weak self to avoid leaks in long-running tasks.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.avanderlee.com/optimization/battery-life-on-ios-and-the-myth-of-killing-apps/">Battery life on iOS and the myth of killing apps</a></strong></p><p>Killing apps on iOS doesn&#8217;t improve battery life because the system already manages suspended apps efficiently. When users force-quit everything, iOS has to relaunch those apps from scratch, which uses more energy. A good overview of how the app lifecycle works and why letting the system handle it is usually best.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://nilcoalescing.com/blog/AddAnInnerShadowToASymbolImageInSwiftUI/">Add an inner shadow to a symbol image in SwiftUI</a></strong></p><p>With just a few modifiers, you can make circular or rounded icons feel inset into the surface instead of sitting on top. A small visual trick that can make your app&#8217;s icons look more polished with almost no extra code.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:418380}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Would you buy Apple Glasses if they launched at the same price as Meta Glasses ($800)?</p><p><strong>Top Answer:</strong> Yes, instantly</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>December</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">9-26</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/mobile-developers-week-abu-dhabi-2025-hsllu5eo">13&#8211;15</a> &#8212; <strong><a href="https://www.mobiledevelopersweek.com/">Mobile Developers Week Abu Dhabi 2025</a></strong> <em>(Abu Dhabi &#127462;&#127466;)</em></p></li></ul><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><item><title><![CDATA[The iOS Weekly Brief – Issue #37]]></title><description><![CDATA[iOS 26.1 becomes the default update, Apple Glasses hype rises, better document previews, smarter localization, simpler IAP setup, new Xcode test insights, and seven key project tweaks]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-37</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-37</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 05 Dec 2025 13:30:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!C25T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.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_!C25T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C25T!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C25T!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C25T!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C25T!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C25T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&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_!C25T!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!C25T!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!C25T!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!C25T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd50d40e4-2001-4979-a4fe-bdcc9b73df98_1500x750.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/2025/12/02/ios-26-1-is-now-apples-recommended-update-for-users-still-on-ios-18/">iOS 26.1 is now Apple&#8217;s recommended update</a></strong></p><p>Apple finally made iOS 26.1 the default update for anyone still on iOS 18, after months of keeping it hidden behind the &#8220;alternate version&#8221; label.</p><p><strong><a href="https://9to5mac.com/2025/12/01/apple-glasses-could-be-next-years-most-attention-grabbing-product/">Apple Glasses could be next year&#8217;s most attention-grabbing product</a></strong></p><p>Apple Glasses are shaping up to be Apple&#8217;s next big swing, a brand-new product category and the company&#8217;s first truly AI-centric device. If Apple nails the price, comfort, and &#8220;iPhone accessory&#8221; positioning, smart glasses might finally move beyond early adopters. Worth keeping an eye on</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://livsycode.com/swiftui/document-preview-options-in-swiftui/">Document Preview Options in SwiftUI</a></strong></p><p>A great breakdown of all the ways you can show documents in SwiftUI, from the simple Quick Look sheet to full PDFKit control, WKWebView embeds, and even the old <code>UIDocumentInteractionController</code> for system-level actions. It&#8217;s a practical comparison that helps you pick the right tool. If your app deals with files, this is a solid reference worth keeping.</p><p><strong><a href="https://danielsaidi.com/blog/2025/12/02/a-better-way-to-localize-swift-packages-with-xcode-string-catalogs">A Better Way to Localize Swift Packages with Xcode String Catalogs</a></strong></p><p>Xcode 26 improves string catalogs for Swift Packages, but the new auto-generated symbols are internal-only. Daniel solves this with a script that converts them into public, type-safe keys you can use across apps. A clean, scalable approach to package localization.</p><p><strong><a href="https://www.createwithswift.com/implementing-non-consumable-in-app-purchases-with-storekit-2/">Implementing Non-Consumable In-App Purchases with StoreKit 2</a></strong></p><p>A clear, hands-on guide to implementing a simple non-consumable IAP with StoreKit 2, from local StoreKit configs to App Store Connect setup and TestFlight testing. It walks through the full flow end-to-end, demystifying how purchases actually work without any backend.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://tuist.dev/blog/2025/12/03/test-insights">Test Insights for Xcode</a></strong></p><p>Tuist&#8217;s new Test Insights finally gives teams real visibility into their test suite, detailed per-test reports, timing breakdowns, slowest cases, regressions over time, and direct links to failed tests right from CI. It removes the usual friction of digging through logs or downloading .xcresult files and turns test performance into a trackable metric. If your suite is growing and CI is slowing you down, this is a tool worth trying.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://www.avanderlee.com/xcode/the-7-changes-i-do-for-every-new-xcode-project/">The 7 changes I do for every new Xcode project</a></strong></p><div id="youtube2--D_OrL6wALM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-D_OrL6wALM&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/-D_OrL6wALM?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>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:414937}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What&#8217;s your primary monetization model for iOS apps?</p><p><strong>Top Answer:</strong> My apps are free / no monetization</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>December</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">9-26</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/mobile-developers-week-abu-dhabi-2025-hsllu5eo">13&#8211;15</a> &#8212; <strong><a href="https://www.mobiledevelopersweek.com/">Mobile Developers Week Abu Dhabi 2025</a></strong> <em>(Abu Dhabi &#127462;&#127466;)</em></p></li></ul><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><item><title><![CDATA[The iOS Weekly Brief – Issue #36]]></title><description><![CDATA[Huge Black Friday dev deals, Siri-style voice integration, smarter app monetization with StoreKit 2, lessons from building for iOS and Android, auto-format Swift code on every commit]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-36</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-36</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 28 Nov 2025 13:31:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!S2sb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.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_!S2sb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S2sb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S2sb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S2sb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S2sb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S2sb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&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_!S2sb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S2sb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S2sb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S2sb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1378cb4b-740a-489b-a0df-779a250a1dcf_1500x750.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/2025/11/26/this-chatgpt-voice-update-previews-what-we-can-expect-from-the-new-siri/">This ChatGPT voice update previews what we can expect from the new Siri</a></strong></p><p>ChatGPT&#8217;s new voice update finally blends voice, text, and visuals into one seamless mode, completely changing how natural the interaction feels. The author argues this is exactly the type of integration Apple is still struggling to deliver with the new Siri, especially as it tries to bridge voice commands with Apple Intelligence&#8217;s text-based features. It&#8217;s a good look at why Siri may need third-party AI help to keep up, and why next year is Apple&#8217;s last window to ship something truly competitive.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.createwithswift.com/managing-in-app-purchases-in-your-apps/">Managing In-App Purchases in your apps</a></strong></p><p>A clean, practical overview of all the monetization paths Apple gives us, from one-time unlocks to subscriptions. Jan breaks down when each model makes sense and how StoreKit 2 fits into a sustainable revenue strategy. A quick read if you&#8217;re planning to add or rethink your app&#8217;s IAP model.</p><p><strong><a href="https://fatbobman.com/en/posts/from-ios-to-android/">From iOS to Android: A Candid Look at My Real-World Journey into Dual-Platform Development</a></strong></p><p>A clear look at what it actually takes to build and maintain the same product across iOS and Android, and why true parity is more about adapting to each platform than mirroring features. A useful read if you&#8217;re considering expanding beyond iOS.</p><p><strong><a href="https://tanaschita.com/ios-associated-domains-alternate-mode/">Using associated domains alternate mode during development</a></strong></p><p>A very handy tip for anyone working with universal links or App Clips. Apple&#8217;s alternate associated-domains mode lets you bypass the CDN and fetch AASA files directly from your server, making changes visible instantly during development. If you&#8217;ve ever waited minutes (or hours) for propagation, this is a small feature that saves a lot of time</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/mRs-/Black-Friday-Deals?tab=readme-ov-file">Black Friday Deals 2025</a></strong></p><p>A massive, community-maintained list of Black Friday deals across macOS and iOS developer tools, AI apps, utilities, books, and courses. If you&#8217;re hunting for discounts on your favorite dev apps or want to discover new ones, this page is the most complete roundup you&#8217;ll find this year.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://useyourloaf.com/blog/format-swift-with-a-git-commit-hook/">Format Swift with a Git Commit Hook</a></strong></p><p>A quick, practical guide to auto-formatting Swift code on every commit using a Git pre-commit hook and the built-in swift-format tool from Xcode 16.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:411701}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How would you rate Tim Cook&#8217;s tenure as Apple&#8217;s CEO?</p><p><strong>Top Answer:</strong> 4/5</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>November</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">3-28</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>December</strong></p><ul><li><p><a href="https://dev.events/ical/mobile-developers-week-abu-dhabi-2025-hsllu5eo">13&#8211;15</a> &#8212; <strong><a href="https://www.mobiledevelopersweek.com/">Mobile Developers Week Abu Dhabi 2025</a></strong> <em>(Abu Dhabi &#127462;&#127466;)</em></p></li></ul><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; <a href="https://www.nextappcon.com">Next.App DevCon 2026</a> <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><item><title><![CDATA[The iOS Weekly Brief – Issue #35]]></title><description><![CDATA[Tim Cook&#8217;s upcoming transition, Swift 6.2&#8217;s friendlier concurrency, async bridging techniques, and making localization work in Swift Packages]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-35</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-35</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 21 Nov 2025 13:31:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!48Rf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><p><strong><a href="https://www.ft.com/content/0d424625-f4f8-4646-9f6e-927c8cbe0e3e">Apple intensifies succession planning for CEO Tim Cook</a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!48Rf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!48Rf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!48Rf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!48Rf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!48Rf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!48Rf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg" width="1400" height="787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:787,&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_!48Rf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg 424w, https://substackcdn.com/image/fetch/$s_!48Rf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg 848w, https://substackcdn.com/image/fetch/$s_!48Rf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!48Rf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9285530b-f284-423a-9e7d-63a1068aa69d_1400x787.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>Apple is quietly preparing for Tim Cook to step down as early as next year, with hardware chief John Ternus emerging as the leading internal candidate. A transition of this magnitude doesn&#8217;t happen often at Apple, so it is one to watch closely.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://livsycode.com/best-practices/localizing-swift-packages-in-an-ios-app/">Localizing Swift Packages in an iOS App</a></strong></p><p>The article explains why iOS ignores .lproj folders inside packages unless the main app explicitly declares supported languages, and how a single Info.plist entry fixes the problem. A must-know detail if you&#8217;re shipping features as modules and expect localization to &#8220;just work.&#8221;</p><p><strong><a href="https://www.avanderlee.com/concurrency/approachable-concurrency-in-swift-6-2-a-clear-guide/">Approachable Concurrency in Swift 6.2: A Clear Guide</a></strong></p><p>Swift 6.2 introduces Approachable Concurrency, a friendlier way to adopt async/await without getting overwhelmed by compiler errors. Antoine shows how the new defaults simplify migration by treating most app code as main-actor first and revealing advanced concurrency only when needed.</p><p><strong><a href="https://tanaschita.com/swift-async-completions-to-async-await/">Bridging completion handlers to Swift&#8217;s async/await</a></strong></p><p>This article gives a clean, practical walkthrough of turning old completion-based APIs into modern async functions using continuations. It explains when to use checked vs unsafe continuations, how to handle errors, and why each async function must resume exactly once.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/getyourguide/spmgraph">SwiftPM dependency graphs</a></strong></p><p>spmgraph is a small CLI tool that gives Swift packages the kind of visibility and guardrails Xcode still can&#8217;t. You can generate clean dependency graphs, run selective tests based on changed files, and even enforce custom architectural rules using a Swift-powered config.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://www.swiftwithvincent.com/blog/providing-a-default-value-in-a-string-interpolation">Providing a default value in a String interpolation</a></strong></p><div id="youtube2-1lIsL_UCewE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1lIsL_UCewE&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/1lIsL_UCewE?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>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:408338}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Are you already using Swift Testing in your project?</p><p><strong>Top Answer:</strong> Yes, fully migrated</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>November</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">3-28</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>December</strong></p><ul><li><p><a href="https://dev.events/ical/mobile-developers-week-abu-dhabi-2025-hsllu5eo">13&#8211;15</a> &#8212; <strong><a href="https://www.mobiledevelopersweek.com/">Mobile Developers Week Abu Dhabi 2025</a></strong> <em>(Abu Dhabi &#127462;&#127466;)</em></p></li></ul><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; <a href="https://www.nextappcon.com">Next.App DevCon 2026</a> <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>