<?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 Jul 2026 01:23: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 #67]]></title><description><![CDATA[Fable comes back, memberwise initializer, dynamic colors across UIKit and SwiftUI, animation bugs from new iOS betas, privacy manifest, and ASO basics for getting your first users]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-67</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-67</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 03 Jul 2026 12:30:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Py92!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>Last week&#8217;s poll showed most of you still haven&#8217;t installed the iOS 27 beta, and yeah, betas are unstable, but there&#8217;s a good reason to install it anyway. As you&#8217;ll see further down in this issue, new iOS versions almost always bring new UI bugs, and you won&#8217;t catch them until you run your app on the beta. So if you haven&#8217;t tested for regressions yet, today is the day &#128521;</p><p>This week also brought a wave of new Claude models. Honestly, the variety confuses me&#8230; Different models, different names, different reasoning levels, all for different tasks and budgets. I keep thinking AI itself should just pick the right model and effort level for me based on the task and the context. I&#8217;d love an automatic mode as the default that figures this out on its own.</p></blockquote><h2><strong><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">What&#8217;s New</span></strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Py92!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Py92!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 424w, https://substackcdn.com/image/fetch/$s_!Py92!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 848w, https://substackcdn.com/image/fetch/$s_!Py92!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 1272w, https://substackcdn.com/image/fetch/$s_!Py92!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Py92!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp&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;:&quot;Introducing Claude Sonnet 5&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="Introducing Claude Sonnet 5" title="Introducing Claude Sonnet 5" srcset="https://substackcdn.com/image/fetch/$s_!Py92!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 424w, https://substackcdn.com/image/fetch/$s_!Py92!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 848w, https://substackcdn.com/image/fetch/$s_!Py92!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 1272w, https://substackcdn.com/image/fetch/$s_!Py92!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95e42f6d-e7d0-4bee-b06a-79d26634f133_2880x1620.webp 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.anthropic.com/news/redeploying-fable-5"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Fable Is Back</span></a></strong></p><p>Fable 5 and Mythos 5 are available AGAIN after weeks of being blocked. This week also brought <a href="https://www.anthropic.com/news/claude-sonnet-5">Sonnet 5</a>, a cheaper model that gets close to Opus 4.8 on benchmarks.</p><p>We have so many models now, with different version numbers, names, and a bunch of reasoning levels inside each one. Picking the right option for your budget takes a lot of effort &#128556; A Sonnet 5 (with max reasoning level) can match 4.8 in quality, but 4.8 still finishes faster. It&#8217;s so confusing, or is it just me?</p><div><hr></div><h2><strong><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Releases</span></strong></h2><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06292026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.5.2</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06292026d"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6</span></a><span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> beta 3</span></strong></p></li></ul><div><hr></div><h2><strong><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Must Read</span></strong></h2><p><strong><a href="https://www.avanderlee.com/swift/memberwise-initializers/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Memberwise Initializer in Swift explained with Code Examples</span></a></strong></p><p>Swift 6.4 stops private stored properties with default values from making your memberwise initializer private too. My biggest annoyance is still there: mark a struct public and Swift still will not generate a public initializer. If you work across modules with a bunch of model types, that means you have to manually write an initializer for basically every single one (when Swift could just hand it to you for free &#128542;)</p><p><strong><a href="https://antongubarenko.substack.com/p/dynamic-color-init"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Dynamic Color Init</span></a></strong></p><p>I use the same approach too, dynamic colors through UIColor's <code>dynamicProvider</code> on the UIKit side and <code>colorScheme</code> through the environment on SwiftUI side. This is a great use case for environment variables.</p><p><strong><a href="https://fatbobman.com/en/posts/debugging-notes-on-two-swiftui-animation-bugs/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Debugging Notes on Two SwiftUI Animation Bugs</span></a></strong></p><p>Every new iOS version brings bugs you didn't expect, and most of them are about broken UI, especially if you use custom components. What's odd here is that in this article we use standard components with standard APIs. This is exactly why betas exist, so you can catch such bugs, adapt your code, and make sure users don't get surprised when they install the release version.</p><div><hr></div><h2><strong><span data-color="#e69138" style="color: rgb(230, 145, 56);">Quick Read</span></strong></h2><p><strong><a href="https://tanaschita.com/ios-privacy-manifests/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Understanding privacy manifests in iOS</span></a></strong></p><p>Privacy manifests declare what data your app and its SDKs collect. If you skip a declaration, whether in your code or a connected SDK, your build will be rejected automatically. I got rejections like this, so check this out before you submit your app.</p><div><hr></div><h2><strong><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Video</span></strong></h2><div id="youtube2-Uyzj4C4wbkI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Uyzj4C4wbkI&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/Uyzj4C4wbkI?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=Uyzj4C4wbkI"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">App Store Optimization (For Beginners)</span></a></strong></p><p><span>Building an app with AI is easier than ever right now, so the real bottleneck for most people becomes distribution. Paid ads are one option, but ASO can bring you your first users and feedback completely FREE. This video walks through the basics, and I think every iOS engineer should know them.</span></p><div><hr></div><h2><strong><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Toolbox</span></strong></h2><p><strong><a href="https://excalidraw.com/"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Excalidraw</span></a></strong></p><p>I use this tool every day to visualize ideas when I need to explain something to someone or just wrap my head around a problem myself. I'm a visual thinker, so Excalidraw makes information way easier to process. It's also great for system design interviews or quick sketches of a design idea, and you can export it straight into Claude to turn a rough layout into something cool.</p><div><hr></div><h2><strong><span data-color="#0b5394" style="color: rgb(11, 83, 148);">iOS Job Market (USA)</span></strong></h2><p><strong>37 new iOS positions this week  </strong><em>(+3% vs last week &#183; -3% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 14% / 81% / 5%</p></li><li><p>Most wanted skills: SwiftUI 46% &#183; UIKit 22% &#183; MVVM 19% &#183; Combine 11%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Software Engineer, iOS</strong><span> at </span><strong>Mirage</strong><span> (New York, NY) &#8212; AVFoundation, Core Animation, SwiftUI, Combine, and optional Metal/OpenGL for an AI-native video editor (Captions by Mirage); Forbes AI 50 company backed by Sequoia, a16z, and Kleiner Perkins. In-person NYC. $175K&#8211;$275K</span> <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-mirage-4431357173/"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>Junior iOS Developer</strong><span> at </span><strong>Rare Candy</strong><span> (Remote) &#8212; Swift and SwiftUI; ships an AI-powered card scanner and real-time pack drops. $120K&#8211;$140K</span> <strong><a href="https://www.linkedin.com/jobs/view/junior-ios-developer-at-rare-candy-4432680299"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><div><hr></div><h2><strong><span data-color="#3d85c6" style="color: rgb(61, 133, 198);">Weekly Poll</span></strong></h2><div class="poll-embed" data-attrs="{&quot;id&quot;:699199}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Have you tested your app on the iOS 27 beta yet?</p><p><strong>Top Answer:</strong> No, waiting for a more stable build</p></blockquote><div><hr></div><h2><strong><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Upcoming Conferences</span></strong></h2><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;10</span></a> &#8212; <strong><a href="https://macadmins.psu.edu"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">MacAdmins Conference</span></a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">22&#8211;23</span></a> &#8212; <strong><a href="https://swiftrockies.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Rockies 2026</span></a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li><li><p><a href="https://dev.events/ical/i-playground-2026-koq30epr"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">25&#8211;26</span></a><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);"> </span>&#8212; <strong><a href="https://iplayground.io/2026/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">iPlayground 2026</span></a></strong> <em>(Taipei &#127481;&#127484;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;11</span></a> &#8212; <strong><a href="https://swiftisland.nl"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Island 2026</span></a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/ns-spain-xiv-c7xn1fmt"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">17&#8211;18</span></a> &#8212; <strong><a href="https://2026.nsspain.com/#top"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">NSSpain XIV</span></a></strong> <em>(Logro&#241;o &#127466;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">29&#8211;2</span></a> &#8212; <strong><a href="https://macsysadmin.se"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">MacSysAdmin</span></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"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;9</span></a><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);"> </span>&#8212; <strong><a href="https://www.nextappcon.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Next.App DevCon 2026</span></a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;9</span></a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftCon</span></a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">12&#8211;14</span></a> &#8212; <strong><a href="https://swiftleeds.co.uk"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftLeeds 2026</span></a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">2&#8211;3</span></a> &#8212; <strong><a href="https://swiftconnection.io/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Connection</span></a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">10&#8211;12</span></a> &#8212; <strong><a href="https://do-ios.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Do iOS 2026</span></a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swift-bharat-qffau9bk"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">19&#8211;20</span></a> &#8212; <strong><a href="https://www.swiftbharat.org/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Bharat</span></a></strong> <em>(Mumbai &#127470;&#127475;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">20&#8211;22</span></a> &#8212; <strong><a href="https://swiftsonicconf.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftSonic 26</span></a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><p><strong>February 2027</strong></p><ul><li><p><a href="https://dev.events/ical/arctic-conference-2hq9ykym"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">16&#8211;18</span></a> &#8212; <strong><a href="https://arcticonference.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">ARCTIC Conference</span></a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March 2027</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2027-aum4rlef"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">2&#8211;4</span></a> &#8212; <strong><a href="https://tryswift.jp/2027/en/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">try! Swift Tokyo 2027</span></a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li></ul><div><hr></div><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 #66]]></title><description><![CDATA[Apple hikes device prices, local AI with Foundation Models, Swift 6.4 concurrency, item-based alerts, toolbar control, building a macro from scratch, and Swift Package Index joins Apple]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-66</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-66</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 26 Jun 2026 12:30:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!n6Fb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We live in a world where AI is making everything go a little crazy, and the strange part is how it now touches things that seem completely unrelated to it. On top of our Netflix and Spotify subscriptions, most of us now pay for a few AI tools too, and now even the price of devices that have nothing to do with AI is going up. This week Apple raised prices across a bunch of its products, even MacBook Neo &#128561;. Its whole appeal was the price. It was such a great, affordable way to step into the Apple world, and I could not stop recommending it. Now it starts at $699 instead of $599, and that magic feels a little less obvious... Apple blames the memory chip shortage, with AI data centers eating up supply, so this is probably just the start.</p><p>New betas also dropped this week, so if you are testing, keep a close eye on crashes showing up on iOS 27. The public beta is coming soon, and once it lands there will be a lot more users on it. Sure, you can say people chose to install an unstable beta and that is on them, but it is also on us. Do not forget your own side of this, make sure your app behaves well even on the betas, because those crash reports land on you too.</p><h2><strong><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">What&#8217;s New</span></strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n6Fb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n6Fb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg 424w, https://substackcdn.com/image/fetch/$s_!n6Fb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg 848w, https://substackcdn.com/image/fetch/$s_!n6Fb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!n6Fb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n6Fb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg" width="1456" height="737" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:737,&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_!n6Fb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg 424w, https://substackcdn.com/image/fetch/$s_!n6Fb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg 848w, https://substackcdn.com/image/fetch/$s_!n6Fb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!n6Fb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd01868e3-dc8e-4acc-b80a-8252799cd903_2048x1036.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=e2lxw9l1"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Design kits for iOS, iPadOS, and macOS 27 are here</span></a></strong></p><p>Apple already shipped updated design kits for Figma and Sketch for iOS, iPadOS, and macOS 27, with refreshed Liquid Glass. I always lean on standard UI components because I trust Apple's designers, and even when we customize, building on top of their defaults makes every new iOS release so much easier to survive.</p><div><hr></div><h2><strong><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Releases</span></strong></h2><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06222026f"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27 beta 2</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06222026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 beta 2</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06222026c"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">macOS 27.0 beta 2</span></a></strong></p></li></ul><div><hr></div><h2><strong><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Must Read</span></strong></h2><p><strong><a href="https://www.avanderlee.com/concurrency/swift-6-4-whats-new-in-concurrency/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Swift 6.4: What&#8217;s New in Concurrency</span></a></strong></p><p>Some of these Swift 6.4 changes we already touched on in the last issue, but Antoine packed all of them into one clean overview, and that's exactly why it's so useful.</p><p><strong><a href="https://tanaschita.com/foundation-models-getting-started/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Getting started with Apple&#8217;s Foundation Models framework</span></a></strong></p><p>If you&#8217;ve wanted to try Apple&#8217;s Foundation Models framework but never found a starting point, this is the place to begin. I believe local models will only get more popular over time, since they just work, cost no tokens, and need no extra connections, which makes them great for the kind of trivial AI tasks most apps have, and Apple&#8217;s approach makes this easy to adopt.</p><p><strong><a href="https://blog.jacobstechtavern.com/p/real-engineers-use-metal"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">UIKit for scroll performance!? Real engineers use Metal</span></a></strong></p><p><span data-color="#674ea7" style="color: rgb(103, 78, 167);"><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jacob Bartlett&quot;,&quot;id&quot;:126930235,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!s80e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab1e065-dffc-4096-ad9e-826ddda8a6cd_1304x1304.png&quot;,&quot;uuid&quot;:&quot;1e3c2f65-8e31-4419-afb8-20ee0c38e3c5&quot;}" data-component-name="MentionToDOM"></span></span> clones Apple Photos and chases a smooth 120fps, and the lesson is that even UIKit, which is usually great for scrolling, starts to break once you push thousands of visible cells on screen at the most extreme zoom levels. His fix is to keep UIKit for the scroll physics but give all the real rendering to the GPU with Metal. In all my years I have never had to build something like this, but it is great to know the option is there when you hit that wall</p><div><hr></div><h2><strong><span data-color="#e69138" style="color: rgb(230, 145, 56);">Quick Read</span></strong></h2><p><strong><a href="https://www.sagarunagar.com/blog/swiftui-item-based-alert-confirmation-dialog/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">SwiftUI&#8217;s new item based presentations in iOS 27</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;9881b447-3677-4876-9316-4d77e7a3e423&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">@State private var invoiceToDelete: Invoice?

// Dialog appears when the item is non-nil, and resets to nil on dismiss
.confirmationDialog("Delete Invoice", item: $invoiceToDelete) { invoice in
    // actions
}</code></pre></div><p><strong><a href="https://swiftwithmajid.com/2026/06/23/taking-control-of-toolbar-items-in-swiftui/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Taking control of toolbar items in SwiftUI</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;53305155-b780-41a2-9525-fb12a277a7aa&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">.toolbar {
    // .topBarPinnedTrailing pins the item to the top trailing edge
    ToolbarItemGroup(placement: .topBarPinnedTrailing) {
        Button("Action 1") { }
    }

    // ToolbarOverflowMenu hides these items in an overflow menu by default
    ToolbarOverflowMenu {
        Button("Action 2") { }
        Button("Action 3") { }
    }
}
// toolbarMinimizeBehavior hides the bar when you scroll down
.toolbarMinimizeBehavior(.onScrollDown, for: .navigationBar)</code></pre></div><div><hr></div><h2><strong><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Video</span></strong></h2><div id="youtube2-7W6R2TIoEW8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;7W6R2TIoEW8&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/7W6R2TIoEW8?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=7W6R2TIoEW8"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Swift Macros Demystified: Build a Freestanding Expression Macro</span></a></strong></p><p><span>Stuart builds a Swift macro completely from scratch, starting with the boilerplate Xcode gives you and explaining every piece, until you end up with a </span><code>#URL</code><span> macro that validates the string at compile time and even shows clear error messages instead of the cryptic ones. I really value this kind of content because it goes deep into how things actually work, not just what tool exists.</span></p><div><hr></div><h2><strong><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Toolbox</span></strong></h2><p><strong><a href="https://www.swift.org/blog/swift-package-index-update/"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Swift Package Index</span></a></strong></p><p>Swift Package Index has officially joined Apple to build a full package registry for the community, and it's amazing to see such a long-running independent project rewarded this way. And it explains why Dave Verwer stepped back from iOS Dev Weekly to go all-in on it.</p><div><hr></div><h2><strong><span data-color="#0b5394" style="color: rgb(11, 83, 148);">iOS Job Market (USA)</span></strong></h2><p><strong>36 new iOS positions this week  </strong><em>(-25% vs last week &#183; +0% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 14% / 81% / 6%</p></li><li><p>Most wanted skills: SwiftUI 47% &#183; UIKit 22% &#183; MVVM 19% &#183; Combine 11%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>iOS Developer</strong> at <strong>Aircraft Performance Group</strong> (Argyle, TX) &#8212; Swift + SwiftUI + Objective-C with automated testing and App Store release management, notable for an explicitly AI-native dev workflow (Windsurf as a primary tool); APG builds runway analysis and flight planning software used by commercial and corporate airlines worldwide <strong><a href="https://www.linkedin.com/jobs/view/ios-developer-at-aircraft-performance-group-4432101006"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>iOS Engineer II</strong><span> at </span><strong>Expedia Group</strong><span> (Chicago, IL) &#8212; Swift + SwiftUI with AI/ML feature integration in a large-scale distributed travel platform (Expedia, Hotels.com, Vrbo); preferred quals call out Xcode expertise, CI/CD for mobile, and on-device AI toolkits. $111K&#8211;$155.5K</span> <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-ii-at-expedia-group-4422500179"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>iOS Software Engineer 2</strong><span> at </span><strong>Garmin</strong><span> (Chandler, AZ) &#8212; Swift + SwiftUI + UIKit for commercial aviation products; role spans new feature design through peer code review, with a path to tech lead on derivative projects</span> <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-2-at-garmin-4422321902"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><div><hr></div><h2><strong><span data-color="#3d85c6" style="color: rgb(61, 133, 198);">Weekly Poll</span></strong></h2><div class="poll-embed" data-attrs="{&quot;id&quot;:651667}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Does your app support landscape mode?</p><p><strong>Top Answer:</strong> Yes, fully adaptive</p></blockquote><div><hr></div><h2><strong><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Upcoming Conferences</span></strong></h2><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;10</span></a> &#8212; <strong><a href="https://macadmins.psu.edu"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">MacAdmins Conference</span></a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">22&#8211;23</span></a> &#8212; <strong><a href="https://swiftrockies.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Rockies 2026</span></a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li><li><p><a href="https://dev.events/ical/i-playground-2026-koq30epr"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">25&#8211;26</span></a><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);"> </span>&#8212; <strong><a href="https://iplayground.io/2026/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">iPlayground 2026</span></a></strong> <em>(Taipei &#127481;&#127484;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;11</span></a> &#8212; <strong><a href="https://swiftisland.nl"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Island 2026</span></a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/ns-spain-xiv-c7xn1fmt"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">17&#8211;18</span></a> &#8212; <strong><a href="https://2026.nsspain.com/#top"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">NSSpain XIV</span></a></strong> <em>(Logro&#241;o &#127466;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">29&#8211;2</span></a> &#8212; <strong><a href="https://macsysadmin.se"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">MacSysAdmin</span></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"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;9</span></a><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);"> </span>&#8212; <strong><a href="https://www.nextappcon.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Next.App DevCon 2026</span></a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;9</span></a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftCon</span></a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">12&#8211;14</span></a> &#8212; <strong><a href="https://swiftleeds.co.uk"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftLeeds 2026</span></a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">2&#8211;3</span></a> &#8212; <strong><a href="https://swiftconnection.io/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Connection</span></a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">10&#8211;12</span></a> &#8212; <strong><a href="https://do-ios.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Do iOS 2026</span></a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swift-bharat-qffau9bk"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">19&#8211;20</span></a> &#8212; <strong><a href="https://www.swiftbharat.org/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Bharat</span></a></strong> <em>(Mumbai &#127470;&#127475;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">20&#8211;22</span></a> &#8212; <strong><a href="https://swiftsonicconf.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftSonic 26</span></a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><p><strong>February 2027</strong></p><ul><li><p><a href="https://dev.events/ical/arctic-conference-2hq9ykym"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">16&#8211;18</span></a> &#8212; <strong><a href="https://arcticonference.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">ARCTIC Conference</span></a></strong> <em>(Oulu &#127467;&#127470;)</em></p></li></ul><p><strong>March 2027</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2027-aum4rlef"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">2&#8211;4</span></a> &#8212; <strong><a href="https://tryswift.jp/2027/en/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">try! Swift Tokyo 2027</span></a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li></ul><div><hr></div><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 #65]]></title><description><![CDATA[iOS 27 prepares for the foldable era, AsyncImage finally gets native caching, SwiftData gains ResultsObserver, and the AI world had a dramatic week.]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-65</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-65</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 19 Jun 2026 12:30:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aXgV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This week we have fewer big announcements, more tutorials. That&#8217;s always what happens after WWDC: devs start digging into the new APIs and sharing what they find. Most of what you will read this issue requires iOS 27, which means you can explore it now but probably won&#8217;t ship it for a while &#128556;</p><p>A couple of AI stories this week that are not directly about iOS but feel relevant to us as developers.</p><p>The US government ordered <a href="https://www.anthropic.com/news/fable-mythos-access">Anthropic to suspend access to the latest model</a>. I find this situation a bit odd&#8230; Anthropic itself pointed out that the capability the government was concerned about is already present in other publicly available models, including OpenAI&#8217;s GPT-5.5. Which makes you wonder why Anthropic specifically was targeted. Having a government actively move against you is not a great position to be in. More importantly, this is a reminder that depending on a single AI provider is a real risk. If this can happen to Anthropic, it can happen to others too.</p><p><a href="https://www.reuters.com/legal/transactional/spacex-buy-anysphere-60-billion-2026-06-16/">SpaceX acquired Cursor in a $60 billion all-stock deal</a> &#129327; That is a wild number for what is essentially an AI-powered code editor. Cursor&#8217;s market share had actually been declining before the deal. So the price feels hard to justify on fundamentals alone. SpaceX already merged with xAI earlier, and now with Grok and Cursor under the same roof, there is clearly a bigger play here around AI development tooling.</p><p>This issue ended up longer than I planned, but I tried to pick only the things that I found most useful, enjoy &#128522;</p><h2><strong><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">What&#8217;s New</span></strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aXgV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aXgV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aXgV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aXgV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aXgV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aXgV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_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_!aXgV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aXgV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aXgV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aXgV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3b192eb-eb50-4d9a-9b91-2c5d6d6ee3ef_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/06/12/ios-27-landscape-mode-apps/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">iOS 27 Adds Landscape Mode to More Apple Apps Ahead of iPhone Ultra</span></a></strong></p><p>iOS 27 brings landscape support to most of Apple's standard apps, with Messages also getting a collapsible sidebar in landscape mode. This looks like groundwork for the rumored "iPhone Ultra", and it is basically iOS catching up to what Android has supported for years. Funny enough, landscape home screen support already existed back on the old Plus models.</p><p><strong><a href="https://developer.apple.com/news/?id=sus6t6ab"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">New domain for Sign in with Apple and iCloud+ Hide My Email</span></a></strong></p><p>Apple is unifying the email domains for Sign in with Apple and iCloud+ Hide My Email under one shared domain, private.icloud.com, later this summer, while old addresses on privaterelay.appleid.com and icloud.com keep working as before. If you have any email validation, allowlists, or domain based filtering in your app, this is a good time to add the new domain before it shows up in production.</p><div><hr></div><h2><strong><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Releases</span></strong></h2><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06182026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 26.6 RC 2</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06152026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6 beta 2</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06152026b"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iPadOS 26.6 beta 2</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06152026c"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">macOS 26.6 beta 2</span></a></strong></p></li></ul><div><hr></div><h2><strong><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Must Read</span></strong></h2><p><strong><a href="https://fatbobman.com/en/posts/from-size-class-to-available-space/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">From Size Class to Available Space: Is horizontalSizeClass Still Reliable?</span></a></strong></p><p>Fatbobman covers one of the quieter but important changes from WWDC 26: with iPhone apps now running in resizable windows, <code>horizontalSizeClass</code> is no longer a reliable signal for layout width. Geometry-based layout is the new direction, though honestly it can feel like a workaround compared to size class which was just simpler. With resizable windows coming to iPhone, the old approach is starting to show its limits&#8230;</p><p><strong><a href="https://www.kodeco.com/53143707-wwdc-2026-asyncimage-caching"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">WWDC 2026: AsyncImage Caching</span></a></strong></p><p><code>AsyncImage</code> finally gets native caching in iOS 27, and I could not be happier about this. Without caching, <code>AsyncImage</code> was never really an option for production apps, so most of us just kept using Kingfisher. Now you can customize cache policy through URLRequest or plug in a custom <code>URLSession</code> via the new <code>asyncImageURLSession</code> modifier, though that last part is still a bit buggy in Beta 1.</p><p><strong><a href="https://blog.jacobstechtavern.com/p/ios-27-launch-time"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">How did Apple cut launch time by 30% in iOS 27?</span></a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jacob Bartlett&quot;,&quot;id&quot;:126930235,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!s80e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab1e065-dffc-4096-ad9e-826ddda8a6cd_1304x1304.png&quot;,&quot;uuid&quot;:&quot;e8d35b24-a0f5-4d31-a1df-7677ac525b8b&quot;}" data-component-name="MentionToDOM"></span> does a solid deep-dive into one of the more interesting claims from this WWDC: Apple says iOS 27 improves app launch times by 30%</p><p><strong><a href="https://www.swiftdifferently.com/blog/swift/concurrency/how-actors-work"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Actors in Swift: The Problem They Solve and How it Works</span></a></strong></p><p>This is a proper deep dive into how Actors actually work under the hood. It covers actor isolation, serial executor, cross-actor references, and reentrancy, which is probably the trickiest part to get right. I think this is fundamental knowledge every iOS developer should have, because Actors are now one of the main tools for async code, and using them without really understanding the mechanics is a good way to end up with subtle bugs that are nearly impossible to debug.</p><p><strong><a href="https://livsycode.com/swift/task-cancellation-shields-in-swift-6-4/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">withTaskCancellationShield in Swift 6.4</span></a></strong></p><p><span>Swift 6.4 adds </span><code>withTaskCancellationShield</code><span>, a small but useful API for cleanup code that must run even when a task is cancelled. The rule is - shield cleanup, not business logic.</span></p><p><strong><a href="https://azamsharp.com/2026/06/12/whats-new-in-swiftdata.html"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">What&#8217;s New in SwiftData for iOS 27</span></a></strong></p><p><span>iOS 27 brings a good set of SwiftData improvements: enum predicates, sectioned queries, compound predicates, and the new </span><code>.codable</code><span> attribute. But the one I am most excited about is </span><code>ResultsObserver</code><span>, which finally lets you observe store changes outside of SwiftUI views. I was never a fan of putting data storage logic at the view level, so this feels like a step in the right direction. The article covers all of these features in detail with code examples for each one, so if you are building anything with SwiftData, this is a good one to go through carefully.</span></p><div><hr></div><h2><strong><span data-color="#e69138" style="color: rgb(230, 145, 56);">Quick Read</span></strong></h2><ul><li><p><strong><a href="https://nilcoalescing.com/blog/NewSwiftUIAPIsForReorderingAndDragAndDropOniOS27/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">New SwiftUI APIs for reordering and drag and drop on iOS 27</span></a></strong></p></li><li><p><strong><a href="https://livsycode.com/swiftui/adaptive-tabview-layouts-with-tabviewstyle-sidebaradaptable-in-swiftui/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Adaptive TabView Layouts with .tabViewStyle(.sidebarAdaptable) in SwiftUI</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;433787e1-0285-43e0-8e15-90b34cf066da&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">TabView {}
// Enables adaptive behavior: tab bar on iPhone, sidebar on iPad
.tabViewStyle(.sidebarAdaptable)
// Prefer sidebar placement when the space allows
.defaultTabBarPlacement(.sidebar)</code></pre></div></li><li><p><strong><a href="https://swiftwithmajid.com/2026/06/16/swipe-actions-outside-of-list-in-swiftui/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Swipe actions outside of List in SwiftUI</span></a></strong></p></li><li><p><strong><a href="https://tanaschita.com/swift-defer-async/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Async cleanup with defer in Swift</span></a></strong></p></li><li><p><strong><a href="https://www.avanderlee.com/ai-development/swiftui-best-practices-xcode-27-agent-skill/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">SwiftUI Best Practices, straight from Apple&#8217;s Xcode 27 Agent Skill</span></a></strong></p></li></ul><div><hr></div><h2><strong><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Video</span></strong></h2><div id="youtube2-nnjRWgBu-s4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;nnjRWgBu-s4&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/nnjRWgBu-s4?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=nnjRWgBu-s4"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">App Store Optimization is BACK?!</span></a></strong></p><p>Right around WWDC this week, indie developers started noticing their App Store rankings climbing. The theory is that Apple quietly updated their ranking algorithm. I noticed some unexpected spikes on my own projects too, so this does not feel like a coincidence &#129300;</p><div><hr></div><h2><strong><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Toolbox</span></strong></h2><p><strong><a href="https://artemnovichkov.com/blog/using-claude-with-apple-foundation-models"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Using Claude with Apple Foundation Models</span></a></strong></p><p><span>Apple extended the Foundation Models framework with support for server-side models, and Anthropic was quick to ship </span><a href="https://github.com/anthropics/ClaudeForFoundationModels"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">ClaudeForFoundationModels</span></a><span>, a Swift package that makes Claude a drop-in replacement for </span><code>LanguageModelSession</code><span>. Same API, same </span><code>@Generable</code><span> macro, same streaming, just a different model underneath. What I really like about this approach is that third-party models feel and work like native ones, no separate SDK, no different patterns to learn.</span></p><div><hr></div><h2><strong><span data-color="#0b5394" style="color: rgb(11, 83, 148);">iOS Job Market (USA)</span></strong></h2><p><strong>48 new iOS positions this week  </strong><em>(+55% vs last week &#183; +78% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 19% / 81% / 0%</p></li><li><p>Most wanted skills: SwiftUI 58% &#183; UIKit 31% &#183; MVVM 15% &#183; Combine 10%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>iOS App Development Engineer</strong><span> at </span><strong>Adobe</strong><span> (San Jose, CA) &#8212; TCA + Combine + MVVM + concurrency on Marc Levoy's Nextcam team, the group behind Project Indigo, an experimental AI camera app that mixes computational photography with on-device intelligence</span> <strong><a href="https://www.linkedin.com/jobs/view/4409709692"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>iOS Engineer</strong><span> at </span><strong>Hinge</strong><span> (New York, NY) &#8212; SwiftUI and Swift Concurrency on a dating app used by millions; the listing explicitly calls out AI dev tools as part of day-to-day workflow, which is a good sign for how the team operates. $150K&#8211;$180K</span> <strong><a href="https://www.linkedin.com/jobs/view/4407964635"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>Software Engineer, iOS/Mobile, Health Wearable</strong><span> at </span><strong>Beacon AI</strong><span> (San Carlos, CA) &#8212; SwiftUI + HealthKit + real-time biometric data visualization for flight crew safety monitoring; one of the more unusual iOS niches in this week's dataset, backed by DoD contracts and airline partnerships </span><strong><a href="https://www.linkedin.com/jobs/view/4429160267"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><div><hr></div><h2><strong><span data-color="#3d85c6" style="color: rgb(61, 133, 198);">Weekly Poll</span></strong></h2><div class="poll-embed" data-attrs="{&quot;id&quot;:611234}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>How do you feel about WWDC26?</p><p><strong>Top Answer:</strong> Met expectations</p></blockquote><div><hr></div><h2><strong><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Upcoming Conferences</span></strong></h2><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;10</span></a> &#8212; <strong><a href="https://macadmins.psu.edu"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">MacAdmins Conference</span></a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">22&#8211;23</span></a> &#8212; <strong><a href="https://swiftrockies.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Rockies 2026</span></a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li><li><p><a href="https://dev.events/ical/i-playground-2026-koq30epr"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">25&#8211;26</span></a><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);"> </span>&#8212; <strong><a href="https://iplayground.io/2026/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">iPlayground 2026</span></a></strong> <em>(Taipei &#127481;&#127484;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;11</span></a> &#8212; <strong><a href="https://swiftisland.nl"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Island 2026</span></a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/ns-spain-xiv-c7xn1fmt"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">17&#8211;18</span></a> &#8212; <strong><a href="https://2026.nsspain.com/#top"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">NSSpain XIV</span></a></strong> <em>(Logro&#241;o &#127466;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">29&#8211;2</span></a> &#8212; <strong><a href="https://macsysadmin.se"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">MacSysAdmin</span></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"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;9</span></a><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);"> </span>&#8212; <strong><a href="https://www.nextappcon.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Next.App DevCon 2026</span></a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">7&#8211;9</span></a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftCon</span></a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">12&#8211;14</span></a> &#8212; <strong><a href="https://swiftleeds.co.uk"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftLeeds 2026</span></a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">2&#8211;3</span></a> &#8212; <strong><a href="https://swiftconnection.io/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Swift Connection</span></a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">10&#8211;12</span></a> &#8212; <strong><a href="https://do-ios.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Do iOS 2026</span></a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">20&#8211;22</span></a> &#8212; <strong><a href="https://swiftsonicconf.com"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">SwiftSonic 26</span></a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><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 #64]]></title><description><![CDATA[WWDC26 recap, Siri AI arrives, Xcode 27 Agent Skills, SwiftUI gets lazy State, SwiftUI composition under the hood, and runtime language switching without restarting your app]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-64</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-64</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 12 Jun 2026 12:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XXlL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This year felt different. The keynote was shorter than usual, possibly the shortest WWDC I can remember. And I think that&#8217;s actually a signal. When the whole world is going through an AI transformation, you don&#8217;t need two hours to make your point.</p><p>Tim Cook made his clearly: Apple isn&#8217;t chasing AI for the sake of AI. While others keep shipping features just to stay relevant, Apple is doing what they&#8217;ve always done, building an ecosystem where new technology fits naturally. Now Siri is actually useful. Yes, Google helped make that happen, but I, as a customer don&#8217;t really care. The name stayed the same, almost nothing else did.</p><p>On Liquid Glass, I&#8217;m honestly a bit torn. A lot of people are happy that Apple added a slider to customize it, but that&#8217;s not the Apple I knew and loved. Part of what made Apple great was the confidence to say &#8220;this is how it should look&#8221; and stick with it. That&#8217;s what separated them from Android. So while I understand why they did it, it feels like a small retreat from the design standards they set for everyone else.</p><p>A couple more things. iOS 27 supports iPhone 11 and up, which makes it the most widely supported iOS release ever! The catch is that the best AI features are locked to newer hardware, which will quietly push a lot of people toward an upgrade. </p><p>Xcode got a real overhaul too, themes, better stability, new Device Hub replacing the Simulator. The resizability support is the detail I keep thinking about. Apps that adapt to any size, that&#8217;s exactly what a foldable iPhone would need. I think we just got a pretty strong hint. </p><p>And Intel support is officially gone. macOS Golden Gate is Apple silicon only.</p><p>Everything in this issue ties back to what this week was about: new tools, new directions, and figuring out how to use them well.</p><h3><strong>&#127381; What&#8217;s New</strong></h3><p></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XXlL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XXlL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XXlL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XXlL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XXlL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XXlL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:229255,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&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_!XXlL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XXlL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XXlL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XXlL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd869912f-3cf0-4bc5-90fc-a7cfff707d9b.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/?id=8rgqj83s">Find out what&#8217;s new for Apple developers</a></strong></p><p>iOS 27, macOS Golden Gate, Xcode 27 and the rest of the new SDKs are now available as developer betas. This is the big one this year, new Apple Intelligence frameworks, design updates, and a ton of new APIs across the board. If you want to start exploring, the betas are ready to install and the documentation is already updated.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_6-release-notes">Xcode 26.6 RC</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-27-release-notes">Xcode 27 Beta</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-27-release-notes">iOS &amp; iPadOS 27 Beta</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/documentation/macos-release-notes/macos-27-release-notes">macOS Golden Gate 27 Beta</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.kodeco.com/53131394-wwdc26-sessions-worth-your-time">WWDC26: Sessions Worth Your Time</a></strong></p><p>Every year I go through the session list and pick what's relevant to my current workflow or useful to bookmark for upcoming APIs. But there are three I watch without fail every WWDC: <a href="https://www.youtube.com/watch?v=9zjeImiYtow">What's New in Xcode</a>, <a href="https://www.youtube.com/watch?v=ssppiors2Ak">What's New in Swift</a>, and <a href="https://www.youtube.com/watch?v=s8BB8q2MyXc">What's New in SwiftUI</a>. Add the <a href="https://www.youtube.com/watch?v=hF8swzNR1-o&amp;t=2s">Keynote</a> and <a href="https://www.youtube.com/watch?v=yl2jsIoMfDU">Platforms State</a> of the Union on top of that, and you have a solid starting point before diving into anything else. The Kodeco team put together a useful guide with their own picks if you want more ideas, including some less obvious sessions in there too.</p><p><strong><a href="https://swiftwithmajid.com/2026/06/08/what-is-new-in-swiftui-after-wwdc26/">What is new in SwiftUI after WWDC26</a></strong></p><p>Majid covers all the SwiftUI updates from this year's WWDC in one place. The one I was most happy to see is <code>AsyncImage</code> finally getting proper caching. It's used in basically every app, and it always felt strange that we still had to reach for third-party solutions for something so fundamental. Better late than never. Swipe actions also got an update and now work in any container, not just List. Personally I've always been a bit unsure about that pattern since most users never discover hidden swipe gestures, but I can see where it fits. The toolbar improvements and reorderable containers are the other additions I'd look at first if you're updating an existing app.</p><p><strong><a href="https://nilcoalescing.com/blog/InitializingObservableClassesWithTheStateMacroInXcode27/">Initializing Observable classes with the State macro in Xcode 27</a></strong></p><p>In Xcode 27, <code>State</code> becomes a Swift macro instead of a property wrapper, which means <code>Observable</code> models stored in <code>State</code> are now initialized lazily. Before this, the model's <code>init()</code> ran on every view struct recreation, even though SwiftUI discarded the extra instances. Unnecessary work that quietly added up. What I found particularly interesting is that this change is back-deployed to iOS 17. Apple doesn't do that often, and it's good to see it happen for something this fundamental.</p><p><strong><a href="https://tanaschita.com/swiftui-understanding-composition/">Understanding composition in SwiftUI</a></strong></p><p>Not everything has to be about new APIs. This one covers how SwiftUI actually builds and represents view hierarchies under the hood, from <code>ViewBuilder</code> and <code>TupleView</code> to why <code>some View</code> exists. I'm a firm believer that knowing how things work at a fundamental level pays off, whether you're debugging a layout that behaves unexpectedly or just trying to write cleaner code. If you've been using SwiftUI for a while but never looked at what's actually happening beneath the surface, this is a good read.</p><p><strong><a href="https://www.sagarunagar.com/blog/swiftui-app-language-switching-without-restart/">SwiftUI Localization Guide - Change Language Without Restarting the App</a></strong></p><p>Xcode 27 makes the translation side of localization much easier, agents can now go through your entire String Catalog and translate strings with full context of your UI and code. But translation is only half of the problem. The other half is making the language switch actually work at runtime without restarting the app. This article covers exactly that, using <code>LocalizedStringResource</code>, SwiftUI environment injection, and a computed locale property.</p><div><hr></div><p><strong>&#127939; Quick Read</strong></p><ul><li><p><strong><a href="https://livsycode.com/blog/swiftui-contentbuilder-one-builder-name-for-different-swiftui-content/">SwiftUI ContentBuilder: one builder name for different content</a></strong></p><p><code>ContentBuilder</code> is now a unified replacement for <code>ViewBuilder</code>, <code>ToolbarContentBuilder</code>, <code>CommandsBuilder</code> and other specialized builders</p></li><li><p><strong><a href="https://livsycode.com/swiftui/toolbarminimizebehavior-in-swiftui/">toolbarMinimizeBehavior in SwiftUI</a></strong></p><p>No more manual scroll offset tracking to hide the navigation bar. SwiftUI now has a native modifier for this</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;0e9c8d54-b229-45b2-8657-6af11932ce97&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">ScrollView {
    StickerListView()
}
.toolbarMinimizeBehavior(.onScrollDown, for: .navigationBar)</code></pre></div></li><li><p><strong><a href="https://livsycode.com/swiftui/swiftui-tabrole-prominent-in-ios27/">SwiftUI TabRole.prominent in iOS 27</a></strong></p><p>Now you can mark one tab as visually prioritized without building a custom tab bar</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;a4108f21-38c8-4d10-b1d2-d5b278b781d3&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">Tab("Now", systemImage: "play.fill", value: .nowPlaying, role: .prominent) {
    NowPlayingView()
}</code></pre></div></li></ul><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-yl2jsIoMfDU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;yl2jsIoMfDU&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/yl2jsIoMfDU?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=yl2jsIoMfDU">Platforms State of the Union</a></strong></p><p>If you only watch one video from WWDC this year, make it this one. The Keynote is for everyone, but the State of the Union is for us. It covers Foundation Models framework, Core AI, SwiftUI and Swift updates, Xcode 27 agentic coding, and everything else that actually matters for your day-to-day work as an iOS developer. A solid 60 minutes that gives you a clear picture of where Apple is taking the platform.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.avanderlee.com/ai-development/using-xcode-27s-agent-skills-in-claude-codex-and-cursor/">Using Xcode 27&#8217;s Agent Skills in Claude, Codex, and Cursor</a></strong></p><p>Apple shipping official Agent Skills is a big deal. Every time a new iOS version drops, your agent is essentially working with outdated knowledge. <code>swiftui-whats-new-27</code> fixes exactly that by teaching the agent about new APIs and changes in iOS 27. And <code>swiftui-specialist</code> covers SwiftUI best practices in general. If you use a different IDE, you can grab all the skills and bring them with you.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;7c5bb2d0-844c-4647-a0fb-872a048cbc3f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">xcrun agent skills export ~/.agents/skills</code></pre></div><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>31 new iOS positions this week  </strong><em>(-18% vs last week &#183; +7% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 32% / 68% / 0%</p></li><li><p>Most wanted skills: SwiftUI 54% &#183; UIKit 38% &#183; MVVM 25% &#183; Combine 19%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Engineer II</strong> at <strong>Reverb</strong> (Chicago, IL) &#8212; SwiftUI-heavy codebase (90% Swift) with server-driven APIs, declarative UI, remote config, and feature flags powering weekly releases; the world's largest marketplace for buying and selling musical instruments. $115,000&#8211;$149,000 <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-ii-at-reverb-4427615346">&#8594; Apply</a></strong></p><p><strong>Mobile iOS Engineer</strong> at <strong>xAI</strong> (New York, NY) &#8212; Swift, UIKit, SwiftUI, Combine for reactive UIs, AVFoundation for real-time audio, and direct integrations with AI model outputs via gRPC; building the Grok iOS app at one of the fastest-moving AI labs. $180,000&#8211;$440,000 <strong><a href="https://www.linkedin.com/jobs/view/mobile-ios-engineer-at-xai-4416402105">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:571877}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How confident are you in your app&#8217;s security?</p><p><strong>Top Answer:</strong> Very confident</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><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><li><p><a href="https://dev.events/ical/i-playground-2026-koq30epr">25&#8211;26</a> &#8212; <strong><a href="https://iplayground.io/2026/">iPlayground 2026</a></strong> <em>(Taipei &#127481;&#127484;)</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/ns-spain-xiv-c7xn1fmt">17&#8211;18</a> &#8212; <strong><a href="https://2026.nsspain.com/#top">NSSpain XIV</a></strong> <em>(Logro&#241;o &#127466;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #63]]></title><description><![CDATA[WWDC 2026 is next week, All Systems Glow, iOS security deep dive, and Swift concurrency getting more useful with task naming, Sendable explained, and a fresh take on stateless actors]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-63</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-63</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 05 Jun 2026 12:31:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qg0L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_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_!qg0L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qg0L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qg0L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qg0L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qg0L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qg0L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50a1aa5b-b66b-4f39-9653-8417774fcf72_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_!qg0L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qg0L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qg0L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qg0L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50a1aa5b-b66b-4f39-9653-8417774fcf72_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/06/01/apple-wwdc-2026-all-systems-glow/">Apple Teases Next Week&#8217;s WWDC 2026 Event: All Systems Glow</a></strong></p><p>The "glow" likely points to a redesigned Siri experience on iOS 27: a dedicated Siri app and a new "Search or Ask" entry point in the Dynamic Island, both with a dark theme and glowing elements. Siri's been the most frustrating piece of Apple's AI story for a while now, so this might be the moment they actually fix it. Or at least make it look better while it tries to figure out which app to use for phone calls.</p><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-may-2026/">What&#8217;s new in Swift: May 2026 Edition</a></strong></p><p>The Swift Evolution pipeline has been busy lately. Three proposals were recently accepted, including changes around <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0519-ref-mutableref-types.md">references</a>, <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0528-noncopyable-continuation.md">async continuations</a>, and <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/testing/0024-per-test-case-repetitions.md">test case repetition</a>. One more is still under active review. I'd go through the full digest if you care about where the language is heading.</p><p><strong><a href="https://www.apple.com/newsroom/2026/06/app-store-ecosystem-reaches-1-point-4-trillion-usd-as-developers-thrive-globally/">App Store Ecosystem Hits $1.4 Trillion</a></strong></p><p>Apple dropped its annual App Store ecosystem report, and the AI angle is the most interesting part for developers. Over 40 of the top 100 apps now feature consumer-facing AI, and those apps grew billings 4x faster than the rest. If you're still on the fence about adding AI features to your app, the market is sending a pretty clear signal.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=06012026a">iOS 26.5.1</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://artemnovichkov.com/blog/task-names-in-swift-concurrency">Task Names in Swift Concurrency</a></strong></p><p>Swift 6.2 finally added task naming via <a href="https://forums.swift.org/t/se-0469-task-naming/78509">SE-0469</a>, and it's one of those features that sounds small until you open Instruments or LLDB and everything is suddenly labeled. The article covers all the APIs in detail.</p><blockquote><p><strong>&#128161;Quick take</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;48939190-6762-4728-8b3d-e144cb2c060b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// Instruments and LLDB now show the name, not just an address
Task(name: "Load profile \(userID)") {
    await loadProfile(id: userID)
}

// Read the name from inside the task
print(Task.name ?? "unnamed")

// async let doesn't support names &#8212; use a task group if you need them
group.addTask(name: "Load profile \(userID)") { ... }</code></pre></div></blockquote><p><strong><a href="https://www.sagarunagar.com/blog/swift-sendable-compile-time-data-race-prevention/">Swift Sendable Explained - Compile Time Data Race Prevention in Swift Concurrency</a></strong></p><p>A good breakdown of <code>Sendable</code> and how Swift's compile-time data race prevention actually works. If you've been hitting concurrency warnings in Swift 6 and silencing them with <code>unchecked Sendable</code> without fully understanding why, this is a good reset.</p><p><strong><a href="https://www.massicotte.org/stateless-actors/">Stateless Actors</a></strong></p><p>If actors exist to protect mutable state, what's the point of an actor with no state? Turns out there are a few legitimate cases, but also real trade-offs: unnecessary serialization, protocol conformance headaches, and situations where a plain <code>struct</code> with <code>@concurrent</code> does the job better.</p><div><hr></div><h3><strong>&#127939; Quick Read</strong></h3><ul><li><p><strong><a href="https://tanaschita.com/ios-notifications-registering-in-swiftui/">Registering for push notifications in SwiftUI</a></strong></p><blockquote><p><strong>&#128161;Quick take</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;48dba6de-dfb6-44df-9a4c-59d3443e2c5b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">@main
struct ExampleApp: App {
    // The only SwiftUI-specific part - everything else is standard UIKit
    @UIApplicationDelegateAdaptor(AppDelegate.self)
    private var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}</code></pre></div></blockquote></li><li><p><strong><a href="https://nilcoalescing.com/blog/AnimationTimingInSwiftUI/">SwiftUI animation timing</a></strong></p><blockquote><p><strong>&#128161;Quick take</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;d5c9f33e-0bbd-449d-b29f-6b13cc890292&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// Match the animation to the direction of movement
.easeIn              // leaving the screen
.easeOut             // entering the screen
.easeInOut           // moving between two positions

// Spring presets by character
.smooth              // no overshoot - standard UI movement
.snappy              // subtle overshoot &#8212; slightly more alive
.bouncy              // visible overshoot &#8212; use to draw attention

// Since iOS 17, .default is a spring, not easeInOut
// Old .animation(.default) code may behave differently</code></pre></div></blockquote></li><li><p><strong><a href="https://serialcoder.dev/text-tutorials/swiftui/enabling-haptic-feedback-with-sensoryfeedback-in-swiftui/">Enabling Haptic Feedback with sensoryFeedback in SwiftUI</a></strong></p><blockquote><p><strong>&#128161;Quick take</strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;0e9c8d54-b229-45b2-8657-6af11932ce97&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// Pick by semantic meaning, not feel
.sensoryFeedback(.selection, trigger: selectedItem)
.sensoryFeedback(.success, trigger: didSave)
.sensoryFeedback(.error, trigger: didFail)

// Conditional &#8212; return feedback based on outcome
.sensoryFeedback(trigger: didSave) { _, newValue in
    newValue ? .success : .error
}

// iOS 26: touch-down feedback, no state change needed
.sensoryFeedback(.press(.button), trigger: totalPresses)</code></pre></div></blockquote></li></ul><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-Jtk4O1rDKTI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Jtk4O1rDKTI&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/Jtk4O1rDKTI?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=Jtk4O1rDKTI">Modern iOS Security: Attacks, Defenses &amp; AI</a></strong></p><p>A podcast conversation with two iOS security experts about the most common mistakes they've seen in production apps, how AI has dramatically lowered the barrier for attackers, and why your storage layer is probably your weakest point.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/skwallace36/Pepper">Pepper</a></strong></p><p>An MCP that injects a dynamic library into your iOS Simulator app at runtime, giving AI agents direct access to the view hierarchy, live network traffic, heap inspection, keychain, and more. No source changes, no extra build steps. Instead of relying on screenshots, the agent reads the UI state as structured data, making it significantly faster and more reliable. </p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>38 new iOS positions this week  </strong><em>(+6% vs last week &#183; -5% vs last month)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 32% / 63% / 5%</p></li><li><p>Most wanted skills: SwiftUI 50% &#183; UIKit 21% &#183; Core Data 8% &#183; MVVM 5%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Engineer</strong> at <strong>Bevel</strong> (New York, NY) &#8212; SwiftUI + HealthKit + WatchKit stack powering the #1 AI Health Companion app with 1M+ global downloads; the role spans both iOS and watchOS with a focus on clean, well-tested Swift code. $130K-$180K <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-at-bevel-4422659610">&#8594; Apply</a></strong></p><p><strong>Software Engineer, iOS</strong> at <strong>Google</strong> (Cambridge, MA) &#8212; Core infrastructure role on the iOS Google Search App Platform; requires fluency across the full concurrency stack. $147K-$211K <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-google-search-at-google-4423909598">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer</strong> at <strong>talk Realty</strong> (United States, Remote) &#8212; Mitty, an on-device video app that turns your camera roll into ready-to-post videos (everything runs on-device); needs deep AVFoundation expertise and structured Swift concurrency: actors, async/await. $130K-$180K <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-4421615935">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:531510}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Do you use Xcode Instruments?</p><p><strong>Top Answer:</strong> Rarely, only when things break</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/envision-wwdc-26-knpycfaw">8&#8211;12</a> &#8212; <strong><a href="https://envisionwwdc.org/">Envision WWDC26</a></strong> <em>(Online &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li><li><p><a href="https://dev.events/ical/i-playground-2026-koq30epr">25&#8211;26</a> &#8212; <strong><a href="https://iplayground.io/2026/">iPlayground 2026</a></strong> <em>(Taipei &#127481;&#127484;)</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/ns-spain-xiv-c7xn1fmt">17&#8211;18</a> &#8212; <strong><a href="https://2026.nsspain.com/#top">NSSpain XIV</a></strong> <em>(Logro&#241;o &#127466;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #62]]></title><description><![CDATA[Subscription retention data, SwiftUI List animations, Swift Concurrency ownership, Keychain basics, and WWDC watchlist ahead of Monday]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-62</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-62</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 29 May 2026 12:32:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Rivb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_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_!Rivb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rivb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Rivb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Rivb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Rivb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rivb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b675674-cf1d-4907-85d7-d39820712634_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_!Rivb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Rivb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Rivb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_1500x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Rivb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b675674-cf1d-4907-85d7-d39820712634_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/2026/05/27/new-report-shows-annual-app-subscribers-rarely-return-after-they-cancel/">95% of canceled annual app subscribers never come back</a></strong></p><p>RevenueCat published part two of their State of Subscription Apps 2026 report, and the retention numbers are exactly what you'd expect from anyone who's ever immediately cancelled a free trial just to not forget. Turns out 95% of annual subscribers who cancel never come back, which honestly makes sense: if someone decided to leave, they've already found a workaround or just decided they don't need it.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p>The beta versions of iOS 26.6, iPadOS 26.6, macOS 26.6, tvOS 26.6, visionOS 26.6, and watchOS 26.6 are <strong><a href="https://developer.apple.com/news/?id=tu7pk9oy">now available</a></strong>.</p></li><li><p><strong><a href="https://www.anthropic.com/news/claude-opus-4-8">Claude Opus 4.8</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://fatbobman.com/en/posts/taming-row-height-and-spacing-jumps/">Taming Row Height and Spacing Jumps in SwiftUI List with a Custom Layout</a></strong></p><p>Fatbobman dug into one of those SwiftUI List quirks that looks like a simple animation bug until you realize the whole layout model is working against you. Row height jumps aren't a missing <code>.animation()</code> call. List just doesn't interpolate height changes, and no transition modifier fixes that. The fix is a custom layout that separates what the parent sees from what the child renders, all with pure SwiftUI primitives.</p><p><strong><a href="https://swiftwithmajid.com/2026/05/26/swift-defer-clean-up-before-you-leave/">Swift Defer. Clean up before you leave.</a></strong></p><p><code>defer</code> is one of those Swift keywords you forget exists until you ship a bug where a temp file never gets deleted or a completion handler never gets called. Placing cleanup code right next to setup code isn't just cleaner, it's safer.</p><p><strong><a href="https://www.sagarunagar.com/blog/swift-task-lifecycle-management/">Swift Task Lifecycle Management</a></strong></p><p>The mental shift here is worth pausing on: older concurrency models asked "how do I run work concurrently," Swift Concurrency asks "who owns this work." That reframe explains why <code>Task.detached</code> feels wrong in most situations even when it technically compiles fine, and why <code>.task</code> in SwiftUI is not just a convenience wrapper but a design decision.</p><p><strong><a href="https://tanaschita.com/ios-keychain-secure-data-storage/">Working with the Keychain in iOS</a></strong></p><p>This is a clean walkthrough of the Keychain Services API covering all four operations you need, with enough context to understand the query dictionary structure before you wrap it in your own abstraction.</p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-hDFOy-ynJ6I" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;hDFOy-ynJ6I&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/hDFOy-ynJ6I?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.avanderlee.com/concurrency/using-xcode-instruments-to-optimize-swift-concurrency-code/">Using Xcode Instruments to optimize Swift Concurrency Code</a></strong></p><p>Antoine walked through a real performance problem, a wallpaper generator that blocked the main thread for nearly 2 seconds, and fixed it step by step using the Swift Concurrency template in Xcode Instruments. The interesting part is not the fix itself but the workflow: profile first, then optimize, then verify with data instead of trusting your eyes in the simulator.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://danielsaidi.com/blog/2026/05/22/making-a-swiftui-sheet-automatically-size-to-fit-its-content">Making a SwiftUI sheet automatically size to fit its content</a></strong></p><p>SwiftUI still has no native way to size a sheet to its content, so this is a pattern you end up writing yourself eventually. The solution is straightforward: observe the content height with <code>onGeometryChange</code> and feed it back as a <code>.height</code> detent.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>36 new iOS positions this week  </strong><em>(+33% vs last week &#183; +38% vs last month)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 33% / 67% / 0%</p></li><li><p>Most wanted skills: SwiftUI 50% &#183; UIKit 31% &#183; MVVM 19% &#183; Core Data 14%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Engineer, ChatGPT Mobile Infrastructure</strong> at <strong>OpenAI</strong> (New York, NY) &#8212; Building the core Swift platform (Bazel, Swift Concurrency, SwiftUI, state management, performance + CI) that enables hundreds of engineers to ship features across ChatGPT, Atlas, and Sora; Staff+ level with a focus on on-device observability, build tooling, and AI developer productivity. $185K&#8211;$385K <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-chatgpt-mobile-infrastructure-at-openai-4416736415">&#8594; Apply</a></strong></p><p><strong>Staff, Software Engineer, iOS</strong> at <strong>Walmart</strong> (Sunnyvale, CA) &#8212; SwiftUI + Combine stack with a focus on AI-integrated, edge-computed features powering the Walmart+ membership experience for hundreds of millions of shoppers; Staff-level role shaping the mobile architecture roadmap and mentoring senior talent <strong><a href="https://www.linkedin.com/jobs/view/staff-software-engineer-ios-at-walmart-4417289888">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://www.massicotte.org/blog/wwdc-26-watchlist/">WWDC 2026 Watch List</a></strong></p><p>Matt Massicotte put together his WWDC watchlist, and the most interesting part is that he expects most of it to go nowhere &#128517;</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:520582}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What do you use for feature flags in your iOS app?</p><p><strong>Top Answer:</strong> I don&#8217;t use feature flags</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/envision-wwdc-26-knpycfaw">8&#8211;12</a> &#8212; <strong><a href="https://envisionwwdc.org/">Envision WWDC26</a></strong> <em>(Online &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li><li><p><a href="https://dev.events/ical/i-playground-2026-koq30epr">25&#8211;26</a> &#8212; <strong><a href="https://iplayground.io/2026/">iPlayground 2026</a></strong> <em>(Taipei &#127481;&#127484;)</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/ns-spain-xiv-c7xn1fmt">17&#8211;18</a> &#8212; <strong><a href="https://2026.nsspain.com/#top">NSSpain XIV</a></strong> <em>(Logro&#241;o &#127466;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #61]]></title><description><![CDATA[Apple Design Awards, accessibility powered by Apple Intelligence, programmatic scrolling in SwiftUI, and a proper feature flag system from scratch]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-61</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-61</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 22 May 2026 12:32:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3jZM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_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_!3jZM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3jZM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3jZM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3jZM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3jZM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3jZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/451e33c6-76a9-45af-95c4-ff776ce1fee4_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_!3jZM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!3jZM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!3jZM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!3jZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F451e33c6-76a9-45af-95c4-ff776ce1fee4_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/design/awards/">2026 Apple Design Award Finalists Announced</a></strong></p><p>Apple just dropped the ADA finalists list, and it&#8217;s worth a look even if you&#8217;re not a gamer or a designer. These apps and games are essentially a curated showcase of what&#8217;s possible on Apple platforms right now: Liquid Glass done right, Foundation Models in production, RealityKit pushed to its limits. If you want to see where the bar actually is, this list is a better reference than any WWDC session.</p><p><strong><a href="https://www.apple.com/newsroom/2026/05/the-app-store-stopped-over-2-point-2-billion-usd-in-fraudulent-transactions-in-2025/">App Store Blocked $2.2 Billion in Fraud Last Year</a></strong></p><p>Apple published its annual App Store fraud report, and the numbers are hard to ignore. Over 9.1 million app submissions were reviewed in 2025, and more than 2 million were rejected. Nearly 59,000 apps got pulled for bait-and-switch behavior, where an app passes review as a simple utility and then quietly becomes something else. As a developer, that context matters: the platform you&#8217;re publishing on is a lot more actively curated than it sometimes feels.</p><p><strong><a href="https://www.apple.com/newsroom/2026/05/apple-unveils-new-accessibility-features-and-updates-with-apple-intelligence/">Apple Intelligence Comes to Accessibility Features</a></strong></p><p>Apple previewed a set of accessibility updates powered by Apple Intelligence: VoiceOver and Magnifier get detailed image descriptions and natural language Q&amp;A, Voice Control lets users navigate by describing what they see instead of memorizing exact labels, and generated subtitles will work automatically for uncaptioned video across all Apple platforms.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://nilcoalescing.com/blog/ModernSwiftUIAPIsForProgrammaticScrolling/">Modern SwiftUI APIs for Programmatic Scrolling</a></strong></p><p>If you&#8217;ve been using ScrollViewReader since iOS 16 and never looked back, this article will catch you up fast. The API has changed a lot: iOS 17 brought <code>scrollPosition(id:)</code>, iOS 18 added the <code>ScrollPosition</code> struct that handles identifiers, edges, and raw offsets through a single binding.</p><p><strong><a href="https://swiftwithmajid.com/2026/05/19/deprecating-your-own-convenience-api/">Deprecating Your Own Convenience API</a></strong></p><p>Short and practical. When you build compatibility wrappers for older iOS versions, they turn into dead code the moment you bump your minimum target. The trick here is using <code>@available</code> with <code>deprecated</code> and <code>obsoleted</code> on your own types, not just Apple&#8217;s APIs.</p><p><strong><a href="https://livsycode.com/best-practices/a-feature-flags-system-in-swift/">A Feature Flags System in Swift</a></strong></p><p>Feature flags are one of those things you improvise early on and regret later. This article walks through a proper type-safe, thread-safe implementation: enums instead of string keys, priority-based resolution across multiple sources, persistent local overrides via UserDefaults, and a result builder DSL for clean configuration. The part I found most useful is the environment-based composition, where production gets only business config and non-production builds layer in testing, simulator, and forced overrides on top.</p><p><strong><a href="https://www.sagarunagar.com/blog/contentunavailableview-swiftui/">ContentUnavailableView in SwiftUI: Complete Guide</a></strong></p><p>Empty states are one of those things that get built quickly and never revisited. This guide covers <code>ContentUnavailableView</code>from the basics to production patterns: the built-in search variant, action buttons for recovery flows, state-driven architecture with enums, and common mistakes like showing it during loading or using generic messages.</p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-dW6KeYCqCFc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;dW6KeYCqCFc&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/dW6KeYCqCFc?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>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.hackingwithswift.com/articles/285/introducing-kickstart-the-app-that-helps-indie-developers-ship">Kickstart: The App That Helps Indie Developers Ship</a></strong></p><p>Most iOS developers know how to build apps. The part that kills momentum is everything else: screenshots, ASO, press outreach, launch planning, review management. Kickstart is a Mac app that pulls all of that into one workspace, with daily task suggestions, competitor tracking, keyword research, website generation, and more.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>27 new iOS positions this week  </strong><em>(-7% vs last week &#183; -4% vs last month)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 30% / 66% / 4%</p></li><li><p>Most wanted skills: SwiftUI 59% &#183; UIKit 33% &#183; MVVM 22% &#183; Combine 15%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Mobile iOS Engineer</strong> at <strong>xAI</strong> (Palo Alto, CA) &#8212; UIKit + SwiftUI + Combine + performance-critical Swift Concurrency on the Grok iOS app; small high-impact team building real-time AI interactions where every millisecond counts. $180K&#8211;$440K <strong><a href="https://www.linkedin.com/jobs/view/mobile-ios-engineer-at-xai-4416404062">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer</strong> at <strong>LoopNet</strong> (Irvine, CA) &#8212; SwiftUI/Swift + MVVM + Dependency Injection on the #1 global commercial real estate marketplace. $130K&#8211;$204K. <strong><a href="https://www.linkedin.com/jobs/view/loopnet-senior-ios-engineer-at-loopnet-4414973094">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://codakuma.com/floating-safe-area-bar/">A Floating Card Using safeAreaBar</a></strong></p><p>The idea is to pin a summary card to the bottom of the screen, but instead of a flat <code>safeAreaInset</code>, use iOS 26&#8217;s <code>safeAreaBar</code> to get the scroll edge blur effect that makes the card actually readable over scrolling content. The post also includes a clean iOS 18 fallback using <code>ultraThinMaterial</code> with a gradient mask, all wrapped into a reusable <code>floatingSafeAreaBar</code> view modifier. </p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:516457}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Which ASO tool do you use for your app?</p><p><strong>Top Answer:</strong> Astro</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>May</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">26&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #60]]></title><description><![CDATA[Rosetta sunset is official, iOS rendering pipeline from touch to pixels, SwiftUI formatting deep dive, and a free open-source ASO tool]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-60</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-60</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 15 May 2026 12:31:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qAZu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qAZu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qAZu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qAZu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg" width="1400" height="788" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:788,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qAZu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qAZu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa971b970-86f9-4826-ac42-9fede0b3635d_1400x788.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/hello/may26">May 2026 - Hello Developer</a></strong></p><p>Apple dropped the May edition of Hello Developer, and there's a lot to unpack. Rosetta is officially getting a sunset date, macOS 27 will be the last release to support it, so if you're still shipping Intel-only builds, the clock is ticking. Also worth checking: new Foundation Models technotes on managing the on-device context window, and WWDC26 details are starting to come in.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05112026n">Xcode 26.5</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05112026a">iOS 26.5</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://blog.jacobstechtavern.com/p/ui-pipeline-internals">Touch to Pixels: UI Pipeline Internals on iOS</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jacob Bartlett&quot;,&quot;id&quot;:126930235,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!s80e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab1e065-dffc-4096-ad9e-826ddda8a6cd_1304x1304.png&quot;,&quot;uuid&quot;:&quot;39a54fdd-8e16-41d1-854d-19940ad4a422&quot;}" data-component-name="MentionToDOM"></span> failed an interview question about the iOS rendering pipeline and turned that into one of the best deep dives I&#8217;ve seen on the topic. The article walks you through the full journey: from your finger touching the capacitive screen, through the kernel, backboardd, Core Animation, the render server, all the way to pixels on the display. Most of us operate at a layer where all of this is abstracted away, but understanding what&#8217;s actually happening underneath makes you a better developer, not just a better interviewee.</p><p><strong><a href="https://serialcoder.dev/text-tutorials/swiftui/formatting-values-in-swiftui-text-and-textfield/">Formatting Values in SwiftUI Text and TextField</a></strong></p><p>Most of us reach for string interpolation by default, but SwiftUI&#8217;s <code>format</code> parameter does a lot more than that. This article covers the full range: numbers, percentages, currencies, dates, temperatures, distances, file sizes, person names, URLs, and more, all with locale-awareness built in. </p><p><strong><a href="https://antongubarenko.substack.com/p/swift-bits-scene-for-hosted-swiftui">Swift Bits: Scene for Hosted SwiftUI View</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Anton Gubarenko&quot;,&quot;id&quot;:123970311,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1eb672de-f6cd-47a2-98b2-6de3f5be6ffe_2316x3088.jpeg&quot;,&quot;uuid&quot;:&quot;c61f66bb-ec81-4446-a254-3fc25f1fa96c&quot;}" data-component-name="MentionToDOM"></span> dug into a subtle lifecycle trap that bites you when you embed SwiftUI views inside a UIKit app. <code>scenePhase</code> looks like it should work everywhere, and nothing obviously breaks, but in a <code>UIHostingController</code> setup it can silently misbehave. The fix is straightforward: use <code>UIApplication</code> or <code>UIScene</code> notifications instead, depending on how granular you need to be. </p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-5PSq5VvW_mM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;5PSq5VvW_mM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/5PSq5VvW_mM?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=5PSq5VvW_mM">How to Build an Infinite Scroll List Without Sacrificing Performance</a></strong></p><p>A practical walkthrough of building a paginated list in SwiftUI from scratch: when to trigger the next fetch, how to handle loading states with an enum-based state machine, and why fixed cell sizes matter more than you think for scroll performance. The part about <code>onScrollGeometryChange</code> as an alternative to <code>onAppear</code> is worth the watch alone. If you've ever shipped a list that jumps or stutters, this video explains exactly why that happens.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://openaso.thirdtechapps.com/">OpenASO: Free Open-Source ASO Tool</a></strong></p><p>ASO research is mostly tedious manual work: checking competitor keywords, digging through reviews, downloading screenshots one by one. OpenASO automates all of that. Give it an app, and it pulls competitor metadata, keyword rankings, reviews, and screenshots straight from Apple&#8217;s public iTunes Search API, no proprietary backend involved. Built as a local Mac app specifically to stay free, which is a smart call given how quickly web-based ASO tools turn into paid SaaS.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>29 new iOS positions this week  </strong><em>(-28% vs last week &#183; -41% vs last month)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 34% / 62% / 4%</p></li><li><p>Most wanted skills: SwiftUI 34% &#183; UIKit 21% &#183; MVVM 14%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Staff iOS Engineer (AI Native), Family AI Lab</strong> at <strong>Life360</strong> (Remote, US) &#8212; SwiftUI + Apple Foundation Model + App Intents on a zero-to-one AI team building the next generation of Life360's family intelligence layer; expects daily AI-native workflow (Claude Code, Cursor) and comfort with on-device Apple frameworks. $190K&#8211;$280K <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-ai-native-family-ai-lab-at-life360-4413153621">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer, Growth</strong> at <strong>Waymo</strong> (San Francisco, CA) &#8212; SwiftUI + Swift Concurrency in production, leading iOS platform architecture and engineering excellence for the Waymo One rideshare app. $213K&#8211;$263K <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-growth-at-waymo-4411003236">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://www.swiftdifferently.com/blog/swiftui/fixedsize-usecase">Finally found a use case for .fixedSize</a></strong></p><p>Most SwiftUI devs quietly file <code>.fixedSize</code> under "modifiers I'll never reach for." This article is about why that's a mistake. Concrete layout problem: cards in a horizontal ScrollView all need to match the tallest one's height, and it turns out <code>.fixedSize(horizontal: false, vertical: true)</code> is the cleanest solution by far.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:512774}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What do you use for networking in your iOS app?</p><p><strong>Top Answer:</strong> Custom URLSession layer</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">19&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #59]]></title><description><![CDATA[Swift's Networking Vision, ARC Internals, Background Tasks, Concurrency Traps, Scalable Async Architecture, a Free Screenshot Tool, and Customizable Toolbars]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-59</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-59</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 08 May 2026 12:31:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JkLv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JkLv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JkLv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 424w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 848w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1272w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JkLv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1587702,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://iosweeklybrief.com/i/196829218?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JkLv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 424w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 848w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1272w, https://substackcdn.com/image/fetch/$s_!JkLv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F605b9893-8882-4d88-842d-ab47ab9efd23_1698x926.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-april-2026/">What&#8217;s new in Swift: April 2026 Edition</a></strong></p><p>April was a busy month for Swift. Swift Evolution accepted a Vision for Networking, basically a plan to rebuild Swift's networking stack from scratch with proper HTTP client and server APIs, which should make things cleaner for everyone. Lots more in the full digest, worth a read.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05042026i">Xcode 26.5 RC (17F42)</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=05042026a">iOS 26.5 RC (23F75)</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://nilcoalescing.com/blog/SchedulingAndHandlingBackgroundAppRefreshInSwiftUI/">Scheduling and handling background app refresh in SwiftUI</a></strong></p><p>Background tasks are one of those things you set up once, forget how it works, and then spend an hour figuring it out again next time. This article is a clean, practical walkthrough from enabling the capability in Xcode to scheduling the task and handling it with the SwiftUI <code>backgroundTask</code> modifier. </p><blockquote><p>The debugging tip: there's a console command that simulates a background launch without having to wait for the system to decide it's ready.</p></blockquote><p><strong><a href="https://www.avanderlee.com/concurrency/unexpected-task-suspension-points-in-swift-concurrency/">Unexpected Task suspension points in Swift Concurrency</a></strong></p><p>If you've ever wondered why your UI slows down under load even though you're using async/await correctly, this one might explain it. Antoine shows how tasks that inherit Main Actor isolation can cause unexpected "thread hopping" - your task starts on the main thread, immediately suspends to do actual work elsewhere, then waits to come back.</p><p><strong><a href="https://livsycode.com/swift/swift-arc-from-zombie-objects-to-side-tables/">Swift ARC: From Zombie Objects to Side Tables</a></strong></p><p>Most of us know the basics of ARC, but this article goes much deeper into how Swift actually manages memory under the hood. It covers the evolution from "zombie objects" in early Swift to the current side table model, and explains exactly what happens at the bit level when you create a weak or unowned reference. The practical section at the end ties it all together with clear rules on when to actually reach for <code>unowned</code> (spoiler: less often than most codebases assume).</p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-M5ZUGBeugP4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;M5ZUGBeugP4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/M5ZUGBeugP4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=M5ZUGBeugP4">Production SwiftUI: Scalable Networking Architecture with Async Await</a></strong></p><p>A solid walkthrough of how to build a networking layer that doesn't turn into a mess as your app grows. The video covers the full stack from URL construction to error handling, and makes a strong case for using an endpoint protocol instead of a giant enum. The part about swapping real and mock services for previews is especially practical if you've ever found yourself fighting with previews that need live network calls.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://ezscreenshots.com/app">ezscreenshots</a></strong></p><p>A solo dev got tired of bloated screenshot tools, sent one prompt to Claude, and shipped a free web app at ezscreenshots.com. Drop your screenshot, edit the headline, export a clean PNG - that's it. No sign-up, no 50 buttons, no design suite you have to learn just to make App Store images.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>40 new iOS positions this week  </strong><em>(+54% vs last week &#183; -9% vs last month)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 35% / 65% / 0%</p></li><li><p>Most wanted skills: SwiftUI 40% &#183; MVVM 22% &#183; UIKit 20% &#183; Core Data 18%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Senior Software Engineer, iOS</strong> at <strong>Roblox</strong> (San Mateo, CA) &#8212; SwiftUI + Swift Concurrency on the Consumer Platform team powering tens of millions of daily players; you'll lead architecture across a large Swift codebase and drive multi-quarter platform initiatives <strong><a href="https://www.linkedin.com/jobs/view/senior-software-engineer-ios-at-roblox-4409986969">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer (SwiftUI)</strong> at <strong>Homes.com</strong> (Irvine, CA) &#8212; SwiftUI-first role at CoStar Group (S&amp;P 500, NASDAQ 100) building one of the fastest-growing real estate portals; direct impact on a product used by millions of homebuyers <strong><a href="https://www.linkedin.com/jobs/view/homes-com-senior-ios-engineer-swiftui-at-homes-com-4410796543">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer</strong> at <strong>Intuit</strong> (San Diego, CA) &#8212; Swift + SwiftUI + TDD at an AI-native product shop (TurboTax, QuickBooks); the role focuses on integrating LLM-powered features into consumer financial apps at scale <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-at-intuit-4379235735">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://swiftdevjournal.com/posts/make-swiftui-toolbar-customizable/">Make a SwiftUI Toolbar Customizable</a></strong></p><p>A quick and practical tip: SwiftUI lets you make toolbar items user-customizable with just two things - an ID on the <code>.toolbar</code> modifier and an ID on each <code>ToolbarItem</code>. One gotcha to keep in mind: <code>ToolbarItemGroup</code> does not conform to <code>CustomizableToolbarContent</code>, so you have to wrap each item individually in <code>ToolbarItem</code> if you want the customization to work.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:508908}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>At what price would you seriously consider buying Vision Pro?</p><p><strong>Top Answer:</strong> Under $1,000</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>May</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">12&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #58]]></title><description><![CDATA[Vision Pro is over, URLSession explained from top to bottom, actors vs queues vs locks, and App Store gets a new subscription type]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-58</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-58</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 01 May 2026 12:32:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!i_W4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i_W4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i_W4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i_W4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!i_W4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i_W4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9c925b8-0aab-4219-b443-cdaefa61b0b4_1600x900.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/04/29/apple-vision-pro-m5-flop/">Apple Has Given Up on the Vision Pro After M5 Refresh Flop</a></strong></p><p>The Vision Pro team has been disbanded. According to MacRumors and Mark Gurman, Apple has stopped work on the device and redistributed the team, mostly to Siri. New CEO John Ternus was apparently never a fan of the product and already killed the cheaper Vision Air last year. What&#8217;s interesting is that the most common reaction I&#8217;ve seen isn&#8217;t &#8220;the tech is bad&#8221; but &#8220;I would have bought one at $1,500.&#8221; The hardware impressed people, the price didn&#8217;t. As for what&#8217;s next, I&#8217;m actually a Ray-Ban Meta glasses fan, and honestly I&#8217;d love to see Apple take a real shot at this form factor. If they get it right, a proper wearable from Apple could be something special.</p><p><strong><a href="https://developer.apple.com/news/?id=agq42lxe">Now Available: Monthly Subscriptions with a 12-Month Commitment</a></strong></p><p>Apple is adding a new subscription type to the App Store: monthly payments with a 12-month commitment. Users can cancel anytime, but they stay on the hook for the remaining payments until the year is up. It&#8217;s a middle ground between monthly and annual pricing, which is actually a pretty useful option if you&#8217;re trying to lower the barrier to entry without giving up the annual revenue guarantee. Rolls out with iOS 26.5 in May, everywhere except the US and Singapore for now.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04272026a">iOS 26.5 beta 4</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04272026g">Xcode 26.5 beta 3</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://blog.jacobstechtavern.com/p/urlsession-to-electrons">URLSession to Electrons: How Networking Works on iOS</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Jacob Bartlett&quot;,&quot;id&quot;:126930235,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!s80e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feab1e065-dffc-4096-ad9e-826ddda8a6cd_1304x1304.png&quot;,&quot;uuid&quot;:&quot;bfd88027-b7c5-402f-85ab-00ab9ec1d3a9&quot;}" data-component-name="MentionToDOM"></span> wrote one of those articles that makes you feel slightly embarrassed you never asked the question before. We call <code>.resume()</code> hundreds of times and just trust that something happens. This piece follows that call all the way down to the physical world, and it&#8217;s a good reminder that &#8220;URLSession handles it&#8221; is just a polite way of saying &#8220;I have no idea what&#8217;s going on.&#8221; Not essential knowledge for shipping apps, but the kind of thing that quietly makes you better at debugging.</p><p><strong><a href="https://www.avanderlee.com/concurrency/immediate-tasks-in-swift-concurrency-explained/">Immediate Tasks in Swift Concurrency Explained</a></strong></p><p>Swift 6.2 adds <code>Task.immediate</code>, and this is a good walkthrough of when it actually makes sense to use it. TL;DR: a regular <code>Task</code> gets scheduled to run later, while an immediate task starts right on the caller&#8217;s executor before handing control back. It sounds like a small difference but it matters when you care about ordering, like updating actor-isolated state before the rest of your code continues. The main thing to watch out for is overhang. If you put expensive synchronous work inside an immediate task, you&#8217;re blocking the caller until the first real suspension point.</p><p><strong><a href="https://livsycode.com/best-practices/actors-vs-queues-vs-locks-in-swift/">Synchronization in Swift: Actors vs Queues vs Locks</a></strong></p><p>A lot of teams I know defaulted to actors for everything once Swift 6 came out. Makes sense, the compiler helps you and the ownership model is clear. But this article does a good job of showing why that&#8217;s not always the right call. Locks have lower overhead for small, synchronous operations. Queues give you more control over execution order. Atomics solve a very specific problem and not much else. The part I found most useful is the framing around cognitive load: the lower you go in abstraction, the more you&#8217;re responsible for maintaining the contract yourself, and the compiler won&#8217;t catch you when you get it wrong.</p><p><strong><a href="https://www.massicotte.org/step-by-step-designing-protocols/">Concurrency Step-by-Step: Designing Protocols</a></strong></p><p>If you&#8217;ve been running into weird compiler errors around protocol conformances in Swift 6, this article is probably why. The core insight is that designing a protocol now means thinking from two sides at once: how the protocol works, and what you&#8217;re asking of every type that will conform to it. The default actor isolation setting alone can completely change whether a conformance even compiles. One thing I didn&#8217;t think about before reading this: making a protocol requirement <code>async</code> dramatically relaxes the constraints on conforming types, because synchronous members can satisfy async requirements but not the other way around.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://apps.apple.com/us/app/screenshot-bro/id6760177675">Screenshot Bro</a></strong></p><p>A macOS app for creating and managing App Store screenshots. Handles device mockups, localization across multiple languages, templates, and direct upload to App Store Connect. If you&#8217;ve ever done ASO and had to keep screenshots in sync across 10 localizations in Figma, you know the pain this is trying to solve.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>26 new iOS positions this week  </strong><em>(-7% vs last week </em>&#183; +8% vs last month<em>)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 31% / 69% / 0%</p></li><li><p>Most wanted skills: SwiftUI 62% &#183; UIKit 35% &#183; MVVM 27%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Sr Software Engineer - iOS</strong> at <strong>PayPal</strong> (San Jose, CA) &#8212; UIKit + SwiftUI + CoreData + Combine stack with XCTest/Quick-Nimble testing; building payment experiences for hundreds of millions of users across 200 markets <strong><a href="https://www.linkedin.com/jobs/view/4408567405">&#8594; Apply</a></strong></p><p><strong>iOS Engineer</strong> at <strong>Ibotta</strong> (Denver, CO) &#8212; Swift + UIKit + SwiftUI + MVVM, one of the top-ranked shopping apps on the App Store with millions of MAUs; unit testing framework ownership + direct feature input <strong><a href="https://www.linkedin.com/jobs/view/4406229624">&#8594; Apply</a></strong></p><p><strong>iOS Developer</strong> at <strong>Charles Schwab</strong> (Southlake, TX) &#8212; TDD/ATDD-driven native iOS team building complex trading interfaces and financial visualizations; in-house development with high ownership on a high-visibility platform <strong><a href="https://www.linkedin.com/jobs/view/4406472963">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://livsycode.com/swiftui/when-swiftui-modifiers-hold-onto-memory-longer-than-expected/">When SwiftUI Modifiers Hold onto Memory Longer Than Expected</a></strong></p><p>You pop a screen, expect <code>deinit</code> to fire, and nothing happens. This article looks at exactly that, specifically with <code>onSubmit</code>, <code>searchable</code>, and <code>refreshable</code> inside <code>NavigationStack</code>. Some of it is classic retain cycles in closures, some of it is SwiftUI internal behavior that&#8217;s harder to reason about. The fix is usually a weak capture and making sure you&#8217;re using the right property wrapper for your view model.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:504925}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Have you ever paid for app installs?</p><p><strong>Top Answer:</strong> No, my app grows organically</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">5&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #57]]></title><description><![CDATA[Apple's new CEO, iOS releases, SwiftUI migration, associatedtype explained, refreshable task cancellation, Instruments with AI agents, odometer animation, XcodeBuildMCP, and Meta ads for indie devs]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-57</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-57</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 24 Apr 2026 12:31:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4nhp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4nhp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4nhp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4nhp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4nhp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4nhp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2ef0660-a9b3-4129-9c75-6436a8a0ae9a_2880x1620.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.apple.com/newsroom/2026/04/tim-cook-to-become-apple-executive-chairman-john-ternus-to-become-apple-ceo/">Tim Cook to Become Executive Chairman, John Ternus to Become Apple CEO</a></strong></p><p>Apple announced that Tim Cook will step down as CEO on September 1, 2026, moving to an Executive Chairman role, with John Ternus taking over as the next CEO. </p><p>Ternus has spent 25 years at Apple leading Hardware Engineering, and his fingerprints are on basically everything good in recent hardware: Apple Silicon Macs, AirPods, the current iPhone lineup. </p><p>I&#8217;m happy it&#8217;s a product and engineering guy taking the top job, not someone from finance or operations. The big question now is whether he can bring that same hardware polish to Apple&#8217;s software, which has had a rough couple of years.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04202026a">iOS 26.5 beta 3</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04222026a">iOS 26.4.2</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04222026c">iOS 18.7.8</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://livsycode.com/swiftui/how-i-migrated-300-screens-to-swiftui-and-what-i-learned/">How I Migrated 300 Screens to SwiftUI and What I Learned</a></strong></p><p>We used the exact same approach on my current and previous projects, navigation stays in UIKit, SwiftUI handles layout and view composition. It's becoming a pretty common pattern, and honestly it makes a lot of sense. This write-up is one of the better breakdowns of why that split works and what to watch out for along the way.  They also drew a clear line on performance, scroll-heavy screens with complex interactions stayed on UIKit, everything else moved to SwiftUI.</p><p><strong><a href="https://www.sagarunagar.com/blog/associatedtype-swift-explained-swiftui/">associatedtype in Swift Explained. A Complete Guide with SwiftUI Examples</a></strong></p><p>If you&#8217;ve ever wondered why <code>View</code> has an associated type instead of just returning <code>View</code> from <code>body</code>, this article breaks it down clearly. The short answer is performance: SwiftUI knows exact types at compile time and avoids runtime dispatch, which is a big deal at scale. Sagar walks through the full picture, from basic protocol usage to real architecture patterns with ViewModels. The section on <code>any ViewModel</code> and its limitations is particularly useful, because it&#8217;s easy to reach for that pattern and then hit a wall when you actually need to access the state.</p><p><strong><a href="https://www.avanderlee.com/ai-development/xcode-instruments-time-profiler-improve-performance-with-ai/">Xcode Instruments Time Profiler: Improve Performance with AI</a></strong></p><p>A practical workflow for AI-assisted performance optimization: add signposts to the code you&#8217;re profiling, run the Time Profiler, copy the results, and feed them into your agent as context so it can actually see where the bottlenecks are instead of guessing. Simple idea, but the 25x improvement he got from iterating on it makes a strong case for adding this to your workflow.</p><p><strong><a href="https://antongubarenko.substack.com/p/swiftui-refreshable-task-cancellation">SwiftUI: Refreshable Task Cancellation</a></strong></p><p>If your <code>.refreshable</code> flow sometimes stops halfway through with no obvious error, this article is probably the explanation you&#8217;ve been looking for. <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Anton Gubarenko&quot;,&quot;id&quot;:123970311,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1eb672de-f6cd-47a2-98b2-6de3f5be6ffe_2316x3088.jpeg&quot;,&quot;uuid&quot;:&quot;16166b07-4642-41eb-bc7a-4eb35a889e99&quot;}" data-component-name="MentionToDOM"></span> breaks down a subtle but painful gotcha: mutating <code>State</code> inside a refresh task triggers a redraw, which can cancel the very task that caused it. The fix is usually simple, collect results locally and publish one final update at the end instead of mutating state as you go.</p><div><hr></div><h3>&#128249;<strong> Video</strong></h3><div id="youtube2-0YHKGcHetOA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;0YHKGcHetOA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/0YHKGcHetOA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=0YHKGcHetOA">$36 Per Install to $6: My Meta Ads Lessons as an Indie Dev</a></strong></p><p>An indie dev spent $2,000 learning Meta ads during a flight to Tokyo. A simple Claude-written line of text on a camera roll screenshot beat everything. If you've only ever done ASO and are curious about paid ads, watch this before spending a single dollar.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.xcodebuildmcp.com/">XcodeBuildMCP</a></strong></p><p>XcodeBuildMCP is an MCP server that gives AI agents direct control over Xcode: build, run, test, debug with LLDB, automate the simulator UI, and deploy to a real device. You configure your scheme and simulator once, and the agent handles the rest. It works with Claude Code, Cursor, Windsurf, and others, and in Xcode 26.3 it integrates natively with the built-in coding agents. Over 5,000 stars on GitHub already. If you're experimenting with agentic workflows in your iOS projects, this is worth adding to your setup.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>28 new iOS positions this week  </strong><em>(-43% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 46% / 54% / 0%</p></li><li><p>Most wanted skills: SwiftUI 57% &#183; MVVM 43% &#183; UIKit 36% &#183; Combine 18%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Developer</strong> at <strong>Charles Schwab</strong> (Ann Arbor, MI) &#8212; Builds the thinkorswim&#174; trading platform in Swift with MVVM architecture, async/non-blocking patterns, and socket-based networking; expect deep work on mobile security for one of the most complex financial apps on the App Store <strong><a href="https://www.linkedin.com/jobs/view/ios-developer-at-charles-schwab-4403208808?refId=8CF8x4vyTQaeZWLTN%2B0oVw%3D%3D&amp;trackingId=7R7L48e%2F4RYTuTHZSh%2BWog%3D%3D&amp;position=8&amp;pageNum=0">&#8594; Apply</a></strong></p><p><strong>Sr. iOS Developer</strong> at <strong>Spirit Airlines</strong> (Dania, FL) &#8212; Leads the full iOS ecosystem for a high-traffic airline app (booking, loyalty, guest self-service) using Swift, SwiftUI, and UIKit; owns architectural decisions, CI/CD pipeline design, and mentors junior engineers <strong><a href="https://www.linkedin.com/jobs/view/sr-developer-ios-mobile-at-spirit-airlines-4393150202?refId=8CF8x4vyTQaeZWLTN%2B0oVw%3D%3D&amp;trackingId=ACdMZFgqRZtPcwaPopUScw%3D%3D&amp;position=21&amp;pageNum=0">&#8594; Apply</a></strong></p><p><strong>iOS Engineer</strong> at <strong>Fieldwire by Hilti</strong> (Remote) &#8212; Builds the highest-rated construction app on the App Store, with offline-first architecture and strict Apple Human Interface Guidelines alignment <strong><a href="https://www.linkedin.com/jobs/view/staff-software-engineer-ios-at-favor-delivery-4389839487">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://livsycode.com/swiftui/an-odometer-style-number-animation-in-swiftui/">An Odometer-Style Number Animation in SwiftUI</a></strong></p><p>SwiftUI already has <code>contentTransition(.numericText())</code> built in, but this post takes it one step further: instead of jumping from one value to the next, the number rolls through every intermediate value like an actual odometer.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:500841}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Which tool do you use to monitor network requests in iOS?</p><p><strong>Top Answer:</strong> Proxyman</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">28&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #56]]></title><description><![CDATA[Apple unifies its business tools, ISP explained through a real protocol gone wrong, lazy properties in SwiftUI, network monitoring with AI agents, and a CLI tool for App Store releases]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-56</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-56</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 17 Apr 2026 12:31:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cSHk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cSHk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cSHk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cSHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg" width="1600" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173849,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cSHk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!cSHk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d45464a-aaa8-4749-9560-e5b308cba565_1600x720.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/04/14/apple-business-platform-launches/">Apple Launches New All-in-One Apple Business Platform</a></strong></p><p>Apple merged Apple Business Essentials, Apple Business Manager, and Apple Business Connect into a single free platform. For dev teams, the most useful part is the new &#8220;Blueprints&#8221; feature: you can preconfigure devices with settings, apps, and policies, and new Macs arrive ready to use without any manual setup. One thing that&#8217;s getting pushback: Apple Maps ads are coming this summer as part of the business tools, which feels a bit off-brand for a company that built its reputation on privacy.</p><div><hr></div><h3><strong>&#128640; Releases</strong></h3><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04162026a">Xcode 26.4.1</a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=04132026g">Xcode 26.5 beta 2</a></strong></p></li><li><p><strong><a href="https://www.anthropic.com/news/claude-opus-4-7">Claude Opus 4.7</a></strong></p></li></ul><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://swiftandmemes.com/interface-segregation-principle-in-ios-how-to-prevent-protocol-from-becoming-a-prison/">Interface Segregation Principle In iOS</a></strong><br>ISP is one of those SOLID principles that shows up on almost every iOS interview, yet most developers learn it the hard way in production. The article walks through a real-world scenario where a clean 4-method protocol slowly becomes a 25-method monster, and shows exactly how to prevent that from happening.</p><p><strong><a href="https://www.avanderlee.com/ai-development/network-requests-optimization-using-xcodes-simulator-agents/">Network Requests Optimization using Xcode&#8217;s Simulator &amp; Agents</a></strong></p><p>Most of us only open a proxy tool when something is already broken, which means we miss a lot of issues that are hard to reproduce. The idea here is to keep network monitoring running in the background at all times, and then pipe that real traffic data straight into an AI agent to spot caching gaps, duplicate requests, and slow endpoints.</p><p><strong><a href="https://www.sagarunagar.com/blog/lazy-properties-swiftui-pitfalls/">Lazy Properties in Swift - Why They Don&#8217;t Always Work in SwiftUI</a></strong></p><p><code>lazy</code> is one of those keywords that feels intuitive until you try it inside a SwiftUI view and the compiler just says no. The article explains why it breaks there and what patterns actually work instead, with <code>State</code> and <code>StateObject</code> being the right tools for that job.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://asccli.sh">App-Store-Connect-CLI</a></strong></p><p>If you're still doing releases through the App Store Connect web UI, this tool will change your workflow. It's a CLI that covers pretty much everything: uploading builds, managing TestFlight groups, syncing metadata and screenshots, submitting for review, and more. Works great in CI/CD pipelines too.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>49 new iOS positions this week  </strong><em>(+11% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 51% / 45% / 4%</p></li><li><p>Most wanted skills: SwiftUI 33% &#183; MVVM 31% &#183; UIKit 27% &#183; Core Data 16% &#183; Swift Concurrency 10% &#183; Bazel 10%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS</strong> at <strong>Google</strong> (Mountain View, CA) &#8212; Swift Concurrency stack (Actors, Publishers, GCD) with deep focus on multi-threaded performance, Instruments-based profiling, and accessibility; role sits on the Google Search iOS team building features used by hundreds of millions of users <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-google-search-at-google-4389829342">&#8594; Apply</a></strong></p><p><strong>Lead iOS Engineer</strong> at <strong>Rogo</strong> (New York, NY) &#8212; Founding iOS role building the native app from scratch using SwiftUI + UIKit; Rogo is an AI analyst platform for top investment banks and PE firms with strong product-market fit and backing from world-class investors, rare chance to own mobile architecture at a well-funded AI startup <strong><a href="https://www.linkedin.com/jobs/view/lead-ios-engineer-at-rogo-4389261013">&#8594; Apply</a></strong></p><p><strong>Staff Software Engineer, iOS</strong> at <strong>Favor Delivery</strong> (Texas) &#8212; SwiftUI, XCTest, XCUITest, SPM, and MVVM across a high-volume real-time logistics platform; Staff IC role on the Promotions &amp; Engagement squad with full ownership from development through release <strong><a href="https://www.linkedin.com/jobs/view/staff-software-engineer-ios-at-favor-delivery-4389839487">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://medium.com/grindr-engineering/claude-couldnt-see-its-print-statements-without-xcode-here-s-how-we-fixed-it-0ac4e842a6b2">Claude Couldn&#8217;t See Its Print Statements Without Xcode. Here&#8217;s How We Fixed It</a></strong></p><p>If you're running your iOS app from the terminal instead of Xcode, Claude has no way to see print statements, because the simulator and Claude are two separate processes. The fix is simple: write logs to a file with FileManager, then stream it with <code>tail -f</code>. A small setup, but it makes a real difference for anyone trying to use Claude for agentic iOS debugging.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:496245}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What do you use for loading remote images in your apps?</p><p><strong>Top Answer:</strong> Kingfisher</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">21&#8211;23</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swift-connection-ttpyco4n">2&#8211;3</a> &#8212; <strong><a href="https://swiftconnection.io/">Swift Connection</a></strong> <em>(Paris &#127467;&#127479;)</em></p></li><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #55]]></title><description><![CDATA[Hello Developer April 2026, SwiftUI List alternatives, spec-driven development with AI, and the real cost of vibe coding.]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-55</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-55</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 10 Apr 2026 12:31:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NE4i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NE4i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NE4i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NE4i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NE4i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NE4i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe054ada0-3de9-47b8-b229-1b6c832a2cfc_2048x1152.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/">Hello Developer: April 2026</a></strong></p><p>Apple dropped the April newsletter and the most exciting part for me is WWDC26 taking shape, the community meetup is confirmed for June 10 in Cupertino, and there&#8217;s a live Swift concurrency Q&amp;A with engineers coming on April 23. App Store Connect Analytics also got a huge update with 100+ new metrics, which honestly was long overdue. And if you haven&#8217;t checked the Liquid Glass design gallery yet, it&#8217;s worth a look to see how apps are starting to adopt the new visual direction.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://swiftwithmajid.com/2026/04/06/building-list-replacement-in-swiftui/">Building List Replacement in SwiftUI</a></strong></p><p>If you&#8217;ve been defaulting to <code>List</code> for every scrollable screen, this post is a good reminder that it&#8217;s not always the right call. The author walks through replacing List in their app using <code>ScrollView</code> with lazy stacks and the Container View APIs, and builds some nice reusable primitives. I liked the approach here because it gives you actual control over the look and feel without fighting list-specific modifiers.</p><p><strong><a href="https://tanaschita.com/ios-file-system-overview/">Working with Files and Directories in iOS</a></strong></p><p>This one is more of a reference than a deep dive, but it&#8217;s the kind of article I wish I had bookmarked earlier. It covers the app sandbox structure, the difference between Documents, Library, and tmp, how to read and write files using URL APIs, and how to exclude files from iCloud backups. Nothing groundbreaking if you&#8217;ve been doing iOS for a while, but it&#8217;s a clean and well-organized explanation.</p><p><strong><a href="https://wesleydegroot.nl/blog/asyncimage-in-swiftui">AsyncImage in SwiftUI</a></strong></p><p>AsyncImage has been around since iOS 15, but I still see people reaching for Kingfisher before even trying it. This is a solid overview of what it can do: handling loading states, failure cases, and basic caching out of the box.</p><p><strong><a href="https://nilcoalescing.com/blog/EmbeddingSFSymbolsInSwiftUIText/">Embedding SF Symbols in SwiftUI Text</a></strong></p><p>Didn&#8217;t know you could interpolate an Image directly inside a <code>Text</code> string literal until I saw this. Turns out it works because the literal gets converted to a <code>LocalizedStringKey</code>, which supports <code>Image</code> interpolation. There&#8217;s a gotcha though: styling modifiers don&#8217;t work directly on the interpolated image, so you have to wrap it in another <code>Text</code> first. A bit verbose, but useful when <code>Label</code> just doesn&#8217;t give you enough control over placement.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://antongubarenko.substack.com/p/spec-driven-development-with-opensec-9ea">OpenSpec</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Anton Gubarenko&quot;,&quot;id&quot;:123970311,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1eb672de-f6cd-47a2-98b2-6de3f5be6ffe_2316x3088.jpeg&quot;,&quot;uuid&quot;:&quot;79301828-9bab-4896-b024-b5a0438d965e&quot;}" data-component-name="MentionToDOM"></span> wrote about this tool and I totally agree with the idea behind it. I work in a similar way myself with most of my tasks. Before writing any code with AI, you first agree on a spec: what needs to be built, how it should behave, what the tasks are. Then the assistant implements against that, not just against a vague prompt. The delta specs part is what I find most practical. You don&#8217;t rewrite everything, just describe what&#8217;s changing. Worth trying if your AI sessions feel unpredictable.</p><p><strong><a href="https://www.swift.org/blog/expanding-swift-ide-support/">Expanding Swift&#8217;s IDE Support</a></strong></p><p>Tracy Miranda from the Swift tooling team at Apple announced that the Swift extension is now available on the Open VSX Registry. That means you can use it in VS Code-compatible editors (Cursor/Windsurf), not just Xcode or VS Code. Good to see Swift showing up in more agentic IDEs as the ecosystem keeps growing.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>44 new iOS positions this week  </strong><em>(+83% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 34% / 55% / 11%</p></li><li><p>Most wanted skills: SwiftUI 39% &#183; MVVM 20% &#183; UIKit 20% &#183; Core Data 16%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS</strong> at <strong>Mirage</strong> (New York, NY) &#8212; SwiftUI, AVFoundation, Combine, Core Animation, and Metal at the core of an AI-native video editing platform. Small team with high ownership, solving real generative media problems. Salary: $175K&#8211;$275K <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-mirage-4398081058">&#8594; Apply</a></strong></p><p><strong>Software Engineer, iOS, Google Search</strong> at <strong>Google</strong> (Mountain View, CA / New York, NY / Kirkland, WA) &#8212; Swift Concurrency, Actors, and Publishers on the Google Search App Platform team, owning core infrastructure used by the full Search app. Salary: $147K&#8211;$211K <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-google-search-at-google-4394476199">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-4NOFZhXUHDE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;4NOFZhXUHDE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/4NOFZhXUHDE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=4NOFZhXUHDE">The real cost of vibe coding</a></strong></p><p>I watched this one and recognized myself immediately. The author built a custom terminal, an app store screenshot tool, an AI task manager, all going viral, all in a few weeks. And his actual app, the one that pays the bills, hasn&#8217;t moved in months. His point is that before AI, there was a natural gap between having an idea and building it. A few days would pass, and the bad ideas would die on their own. Vibe coding destroyed that gap. Now every idea gets built immediately, before you even know if it&#8217;s worth building.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:492383}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How many languages does your app support?</p><p><strong>Top Answer:</strong> 2-5</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">14&#8211;23</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li><li><p><a href="https://dev.events/ical/pre-wwdc-bashcade-q78ssfnl">7</a> &#8212; <strong><a href="https://luma.com/jhm03vgs">Pre-WWDC Bashcade</a></strong> <em>(San Jose &#127482;&#127480;)</em></p></li><li><p><a href="https://developer.apple.com/wwdc26/">8&#8211;12</a> &#8212; <strong><a href="https://developer.apple.com/wwdc26/">WWDC26</a></strong> <em>(Global &#127758;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #54]]></title><description><![CDATA[App Store adds 11 new languages, SwiftUI onAppear lifecycle explained, engineers should build skills not features, and the Claude Code source leak]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-54</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-54</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 03 Apr 2026 12:30:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Zw07!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zw07!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zw07!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zw07!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zw07!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zw07!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86d17471-ef3d-47e9-8c8d-4ed29ad31f76_2048x1151.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/?id=97t4mt64">App Store expands support to 11 new languages</a></strong></p><p>Apple added localized metadata support for 11 new languages in App Store Connect, including Bangla, Tamil, Telugu, Gujarati, and several others, with a clear focus on India. If you&#8217;ve been thinking about expanding there, now&#8217;s a good time to add those localizations.</p><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-march-2026/">What&#8217;s new in Swift: March 2026 Edition</a></strong></p><p>The Core Build team just landed a big milestone: Swift Build is now the default build system in Swift's main branch, replacing the old llbuild-based one. Still needs some bug fixes before it ships to everyone, but the direction is clear. Also worth noting: <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/testing/0021-targeted-interoperability-swift-testing-and-xctest.md">ST-0021</a> was accepted, which fixes <code>XCTAssert</code> calls being silently ignored when called inside Swift Testing tests.</p><p><strong><a href="https://developer.apple.com/news/releases/?id=03302026g">Xcode 26.5 beta</a></strong></p><p>The StoreKit update is the most useful addition: you can now test monthly with 12-month commitment billing plans directly in Xcode. The rest is mostly bug fixes.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.swiftyplace.com/blog/swiftui-view-lifecycle-onappear?utm_source=rss">SwiftUI View Lifecycle: When onAppear Actually fires</a></strong></p><p>SwiftUI has two independent tracks: node lifetime (when state is created and destroyed) and visibility (when the view appears on screen). <code>onAppear</code> tracks visibility, not lifetime, which is why it fires on every tab switch in <code>TabView</code> even though your <code>@State</code> is still alive.</p><p><strong><a href="https://ronnierocha.dev/blog/engineers-building-skills-not-features/">Your engineers should be building skills, not just features</a></strong></p><p>Non-engineers are already contributing code with AI tools, but most teams haven't built the scaffolding to make that work well. The idea is simple: a Claude Code skill that documents your patterns is worth more than one feature, because it multiplies everyone who uses it. At first it felt like AI was all about prompt engineering. Now it's clear that skills and subagents are where developers will actually spend their time to keep up the pace.</p><p><strong><a href="https://www.hackingwithswift.com/articles/284/teach-your-ai-to-write-swift-the-hacking-with-swift-way">Teach your AI to write Swift the Hacking with Swift way</a></strong></p><p>Paul Hudson released an <code>AGENTS.md</code> that instructs AI coding tools to write Swift exactly like he does: prefer SwiftData, and drop <code>ObservableObject</code>. There are some genuinely solid rules, like always assuming strict concurrency is on and deleting code before adding more. Worth a read just to steal a few ideas for your own <code>AGENTS.md</code>.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/xrazz/app-store-approval-guide">iOS App Store Approval Checklist</a></strong></p><p>A practical checklist covering everything that gets your app rejected after the build is done: missing legal links, vague pricing, no Restore Purchases button, forgotten test accounts. Nothing groundbreaking, but it&#8217;s the kind of thing you skim once and then wish you&#8217;d read before your last submission. Bookmark before you hit submit on your next release.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>24 new iOS positions this week  </strong><em>(-54% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 33% / 63% / 4%</p></li><li><p>Most wanted skills: SwiftUI 54% &#183; MVVM 33% &#183; UIKit 29% &#183; Core Data 17%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Sr Developer, iOS Mobile</strong> at <strong>Spirit Airlines</strong> (Dania, FL) &#8212; SwiftUI + UIKit + MVVM-C + Async/Await + Swift Package Manager, with full ownership of CI/CD pipeline architecture and an automated testing strategy covering Unit, UI, and Snapshot tests for a high-traffic booking and loyalty app <strong><a href="https://www.linkedin.com/jobs/view/sr-developer-ios-mobile-at-spirit-airlines-4393150202/">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer</strong> at <strong>Intuit</strong> (Mountain View, CA) &#8212; Swift + SwiftUI role focused on shipping AI integrations into production for TurboTax and QuickBooks at scale; you'll own architectural decisions, mentor engineers, and evaluate AI impact on performance with real metrics <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-at-intuit-4382108609/">&#8594; Apply</a></strong></p><p><strong>iOS Software Engineer</strong> at <strong>Garmin</strong> (Chandler, AZ) &#8212; Swift + SwiftUI + Objective-C building iOS software for general aviation products; niche domain with deep Apple ecosystem work and on-site collaboration in Chandler <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-at-garmin-4381921885/">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://build.ms/2026/4/1/the-claude-code-leak/">The Claude Code Leak</a></strong></p><p>Claude Code's source code leaked last week, and the first reaction from developers was pointing at how messy it is. The more interesting take is what that says about code quality in general: one of the most loved developer tools is built on code that most engineers would flag in review, and nobody cares. What matters is that the product works. If you've ever felt guilty about shipping code you're not proud of, this one will make your day.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:488603}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Do you still watch the WWDC keynote live?</p><p><strong>Top Answer:</strong> Yes, every year, it&#8217;s a ritual</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>April</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">7&#8211;23</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/do-i-os-2026-kagscl3">10&#8211;12</a> &#8212; <strong><a href="https://do-ios.com">Do iOS 2026</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #53]]></title><description><![CDATA[WWDC26 is June 8, Swift 6.3 and Xcode 26.4 are out, preparing your codebase for AI agents, modularizing a monolith, and Voice Control in SwiftUI]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-53</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-53</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 27 Mar 2026 12:30:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F0xc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F0xc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F0xc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F0xc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg" width="1456" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F0xc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F0xc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cba653f-6e6c-47d6-8c65-9e5e42de9729_2048x1151.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/wwdc26/">WWDC26 confirmed for June 8</a></strong></p><p>Apple just confirmed WWDC26 kicks off on June 8 at Apple Park. This year&#8217;s official teaser promises &#8220;AI advancements and exciting new software and developer tools,&#8221; which isn&#8217;t exactly a surprise. Community expectations are split between a Siri that actually works and a Snow Leopard-style cleanup year for macOS. Personally, I&#8217;d take either. If you want a shot at attending in person, applications for <a href="https://developer.apple.com/wwdc26/special-event/">the special event</a> are open until March 30.</p><p><strong><a href="https://developer.apple.com/news/?id=hh6v4b55">New In-App Purchase and subscription data in Analytics</a></strong></p><p>App Store Connect Analytics just got a serious upgrade. Over 100 new metrics, cohort analysis, peer group benchmarks, new subscription reports, and more filters.</p><p><strong><a href="https://www.swift.org/blog/swift-6.3-released/">Swift 6.3 is out</a></strong></p><p>The headline feature is probably the official Swift SDK for Android. Community work has been going on for years, and now it&#8217;s an actual official release. Swift keeps expanding outside Apple platforms, and it&#8217;s accelerating.</p><p><strong><a href="https://www.swift.org/blog/swift-6.3-released/">Xcode 26.4 Released</a></strong></p><p>Xcode 26.4 ships with Swift 6.3 and a bunch of improvements to Instruments. Run Comparison is new - it lets you compare call trees across profiling runs directly in Instruments, which makes performance regression hunting a lot less painful. Also, Top Functions mode now shows the most expensive functions across the entire trace regardless of where they&#8217;re called from. Smaller thing, but useful: you can finally remove languages from String Catalogs directly in the editor.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://sundayswift.com/posts/preparing-ios-codebase-for-ai-agents/">Preparing Your iOS Codebase for AI Agents</a></strong></p><p>Drop an AI agent into a large iOS codebase with no guidance, and you get syntactically correct Swift that ignores your architecture, calls <code>xcodebuild</code> with wrong flags, and puts files in the wrong places. This post explains how to fix that. The core idea is hierarchical <code>AGENTS.md</code> files: a root-level operating contract, a subsystem guide for iOS-specific rules, and per-module docs for the kind of knowledge you'd normally only get from someone who's been in that directory for months. Btw, shorter documentation works better. Agents have finite context windows, and every redundant line pushes out actual useful content. If your guide is over 400 lines (I prefer 200), it's probably too long.</p><p><strong><a href="https://livsycode.com/best-practices/how-i-decomposed-a-monolithic-ios-app-into-130-modules-and-reduced-build-time-by-35/">How I decomposed a monolithic iOS app into 130+ modules and reduced build time by ~35%</a></strong></p><p>300 screens, a bridging header from 2015, MVC and MVVM coexisting in the same codebase. The key mistake: feature modules importing each other, which killed SwiftUI previews and created circular dependencies. The fix was an app-level coordinator that owns all cross-feature navigation, while features just expose entry points and signal outcomes. Incremental builds improved by around 35%.</p><p><strong><a href="https://wesleydegroot.nl/blog/focus-state-in-swiftui">Focus State in SwiftUI</a></strong></p><p><code>FocusState</code> has been around since iOS 15, but a lot of codebases still handle focus manually. Wesley de Groot's post covers the basics well: how to bind focus to an enum, auto-focus on appear, and move focus programmatically on form validation. Small thing, but it makes a real difference for keyboard navigation and accessibility.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.sagarunagar.com/blog/swift-algorithms-complete-guide/">Swift Algorithms - Apple&#8217;s Hidden Collection and Sequence APIs You Should Be Using</a></strong></p><p>If you're still writing nested loops and index math by hand, there's a good chance <code>swift-algorithms</code> covers what you need. Apple's open-source package adds focused collection APIs that don't exist in the standard library: <code>chunked</code>, <code>uniqued</code>, <code>indexed</code>, <code>product</code>, combinations, permutations, and more.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>54 new iOS positions this week  </strong><em>(+4% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 43% / 55% / 2%</p></li><li><p>Most wanted skills: SwiftUI 39% &#183; UIKit 28% &#183; Core Data 11% &#183; MVVM 19%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS, Google Search</strong> at <strong>Google</strong> (Mountain View, CA) &#8212; Swift Concurrency, Actors, Publishers, and GCD are core requirements; the role focuses on performance analysis with Instruments and multi-threaded systems &#8212; all for iOS Search used by billions <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-google-search-at-google-4389829342">&#8594; Apply</a></strong></p><p><strong>Lead Software Engineer, iOS/Mobile</strong> at <strong>Beacon AI</strong> (San Carlos, CA) &#8212; SwiftUI, UIKit, Combine, Core Data, Core ML, and on-device AI powering real-time flight safety systems deployed with the DoD and major airlines. Founding-level ownership of the entire iOS platform architecture <strong><a href="https://www.linkedin.com/jobs/view/lead-software-engineer-ios-mobile-at-beacon-ai-4388210004">&#8594; Apply</a></strong></p><p><strong>Lead iOS Engineer</strong> at <strong>Rogo</strong> (New York, NY) &#8212; Founding iOS role at the AI analyst platform used by top Wall Street investment banks and PE funds; stack is SwiftUI + UIKit with full end-to-end ownership from architecture to App Store release <strong><a href="https://www.linkedin.com/jobs/view/lead-ios-engineer-at-rogo-4389261013">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://wesleydegroot.nl/blog/voice-control">Voice Control</a></strong></p><p>Accessibility articles usually focus on VoiceOver, so it's nice to see Voice Control get some attention. The difference matters: VoiceOver is for blind users, Voice Control is for people with motor impairments who can see the screen but can't touch it reliably. The key modifier to know is <code>.accessibilityInputLabels(_:)</code>, which lets you define multiple voice commands for the same element. "Save", "Submit", "Send" - all pointing to one button. Quick read with practical code examples for forms, lists, and custom controls.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:484302}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How long did your last build wait for App Review?</p><p><strong>Top Answer:</strong> 1-3 days</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">30&#8211;31</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacSysAdmin</a></strong> <em>(Gothenburg &#127480;&#127466;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #52]]></title><description><![CDATA[Apple blocks vibe coding apps, Xcode 26.4 RC lands, the iOS dev toolkit beyond Xcode, some vs any explained, compilation cache in practice, String Catalogs tips, and how SwiftUI renders your views]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-52</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-52</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 20 Mar 2026 12:31:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!6B1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6B1G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6B1G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6B1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6B1G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!6B1G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a0f38ba-023b-4347-a046-6d1feeef62ab_1600x900.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/03/18/apple-blocks-updates-for-vibe-coding-apps/">Apple Quietly Blocks Updates for Popular Vibe Coding Apps</a></strong></p><p>Apple started blocking App Store updates for vibe coding apps like Replit and Vibecode. The rule they point to is Guideline 2.5.2, which says apps can&#8217;t execute code that changes their own functionality. And I get it. Technically, these apps generate and run other apps inside themselves. That is an app inside an app, and the guidelines do cover that. But at the same time, vibe coding is a completely new category. These tools didn&#8217;t exist when the rules were written. I think Apple&#8217;s guidelines need an update to handle these edge cases properly. And honestly, it&#8217;s better to create clear rules now than to wait until people find workarounds on their own. Replit already dropped from first to third in the developer tools rankings just because it couldn&#8217;t push updates since January.</p><p><strong><a href="https://developer.apple.com/news/releases/?id=03182026i">Xcode 26.4 Release Candidate</a></strong></p><p>Apple released the Release Candidate for Xcode 26.4 with Swift 6.3 and updated SDKs for all platforms. Instruments got a new Run Comparison feature that lets you compare call trees between different runs, which is great for tracking performance changes. Swift Testing now supports attaching images directly to tests.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.linkedin.com/pulse/your-ios-dev-toolkit-longer-just-xcode-vlad-khambir-ygske/?trackingId=0e2c2IRVSBORr9Kx3b6JXg%3D%3D">Your iOS Dev Toolkit is no longer just Xcode</a></strong></p><p>This one is mine, so I'll keep it short. I wrote about how the iOS developer toolkit has changed over the last year. Xcode is still there for builds and debugging, but the real work now happens around the AI agent. Claude Code, skills, MCPs, voice input, AGENTS.md. The article covers each piece and how they fit together.</p><p><strong><a href="https://www.sagarunagar.com/blog/swift-some-vs-any-opaque-existential-types/">Swift some vs any: Understanding Opaque Types and Existential Types</a></strong></p><p>If you've ever been confused by <code>some</code> and <code>any</code> in Swift, this is a clean breakdown. Sagar walks through what opaque and existential types actually are, how they differ at the compiler level, and why it matters for performance. The part about existential containers and witness tables is especially useful. Most of us use <code>some View</code> every day in SwiftUI without thinking about what's happening behind it.</p><p><strong><a href="https://livsycode.com/best-practices/xcode-26-compilation-cache/">Xcode 26 Compilation Cache</a></strong></p><p>Xcode 26 can now cache compilation results and reuse them when inputs haven't changed. Branch switching, clean builds, CI reruns, all get faster once the cache is warm. The catch? If your build time is mostly scripts or asset processing, you won't notice much. Still, a solid improvement for everyday work.</p><p><strong><a href="https://tanaschita.com/ios-string-catalogs-in-practice/">Working with String Catalogs in iOS projects</a></strong></p><p>A practical guide to <code>.xcstrings</code> files. Covers automatic key detection, manual management, entry states like stale and needs_review, and a useful trick: rename keys directly in the catalog editor so Xcode keeps your translations intact. If you're still managing localization the old way, this is a good starting point.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://charleswiltgen.github.io/Axiom/">Axiom</a></strong></p><p>I mentioned skills in my article this week, and Axiom is one of the best examples of what they can do. Instead of your agent just &#8220;knowing Swift,&#8221; you give it structured rules for how to write code in your project. Axiom covers iOS development end to end: concurrency, SwiftUI performance, database migrations, memory debugging, accessibility, Apple Intelligence. 50 skills total, plus commands and agents. It works as a Claude Code plugin and as an MCP server. If you&#8217;re building with agents and want them to follow real engineering discipline, not just generate code, check this out.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>52 new iOS positions this week  </strong><em>(+13% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 31% / 65% / 4%</p></li><li><p>Most wanted skills: SwiftUI 40% &#183; UIKit 23% &#183; Core Data 21% &#183; MVVM 15%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Swift Platform Experience &#8211; UI Frameworks Engineer</strong> at <strong>Apple</strong> (Cupertino, CA) &#8212; You're not building <em>with</em> UIKit, you're building UIKit itself: touch handling, animation, layout, <code>UICollectionView</code>, <code>UIHostingConfiguration</code>. The role requires 5+ years of hands-on UIKit, strong Swift proficiency, and familiarity with Core Animation and debugging/profiling. A rare chance to shape APIs that every iOS developer depends on <strong><a href="https://www.linkedin.com/jobs/view/swift-platform-experience-%E2%80%93-ui-frameworks-engineer-at-apple-4385652709">&#8594; Apply</a></strong></p><p><strong>iOS Software Engineer, ChatGPT Engineering</strong> at <strong>OpenAI</strong> (San Francisco / New York / Seattle) &#8212; Building and shipping features in the ChatGPT iOS app, with ownership from design through launch and iteration. Stack includes Swift/Objective-C, SwiftUI/UIKit, Core Data, and performance optimization. Cross-functional role where your code reaches millions of daily active users of the world's most-used AI app <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-chatgpt-engineering-at-openai-4375274377">&#8594; Apply</a></strong></p><p><strong>Senior Product Engineer, iOS</strong> at <strong>Sandbar</strong> (New York, NY) &#8212; Early-stage team (ex-Meta, CTRL-labs, Google, Apple) building Stream &#8212; a voice ring and conversational AI interface featured in WSJ, Bloomberg, and Wired. The iOS app handles on-device ML, BLE connectivity, WebSocket-based device-cloud sync, and a novel UIUX layer <strong><a href="https://www.linkedin.com/jobs/view/senior-product-engineer-ios-at-sandbar-4386955583">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-_zmQnn7Ki1E" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_zmQnn7Ki1E&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_zmQnn7Ki1E?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=_zmQnn7Ki1E">SwiftUI Under The Hood: What&#8217;s Really Happening When You iOS Updates</a></strong></p><p>Ever wondered what happens between a @State change and pixels appearing on screen? This video breaks down the SwiftUI rendering pipeline in a way I haven't seen before. The attribute graph, dirty marking, diffing, the two-frame delay, and why your body needs to be cheap.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:480184}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Have you started using agent skills in Xcode?</p><p><strong>Top Answer:</strong> Yes, actively</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">24&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li><li><p><a href="https://dev.events/ical/mac-sys-admin-cvynvgye">29&#8211;2</a> &#8212; <strong><a href="https://macsysadmin.se">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #51]]></title><description><![CDATA[Thread safety in Swift, drop SwiftGen for good, GCD migration traps nobody warns you about, and 9 frontier models in one coding test]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-51</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-51</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 13 Mar 2026 12:30:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QWZJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QWZJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QWZJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg" width="711" height="530.2557427258805" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:487,&quot;width&quot;:653,&quot;resizeWidth&quot;:711,&quot;bytes&quot;:46480,&quot;alt&quot;:&quot;A colored pencil-style sketch representing Apple&#8217;s rainbow logo.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A colored pencil-style sketch representing Apple&#8217;s rainbow logo." title="A colored pencil-style sketch representing Apple&#8217;s rainbow logo." srcset="https://substackcdn.com/image/fetch/$s_!QWZJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QWZJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe26c08cd-ca2e-4612-ba23-fe530a9219be_653x487.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.apple.com/newsroom/2026/03/apple-to-celebrate-50-years-of-thinking-different/">Apple to celebrate 50 years of thinking different</a></strong></p><p>Fifty years. Apple was founded in a garage in 1976, and this week the company is marking the milestone with a letter from Tim Cook. </p><p>What struck me most is the framing. Not &#8220;look what we built&#8221; but &#8220;look what people made possible with our tools.&#8221; For developers, that&#8217;s worth sitting with. You&#8217;re building on a platform that&#8217;s been around half a century and is still moving fast.</p><p><strong><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_4-release-notes">Xcode 26.4 Beta 3</a></strong></p><p>Beta 3 ships with Swift 6.3 and updated SDKs across all platforms.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.sagarunagar.com/blog/thread-safety-in-swift/">Thread Safety in Swift - Preventing Data Races with Locks, Queues, and Actors</a></strong></p><p>Data races are one of those bugs that only show up in production and are nearly impossible to reproduce locally. Sagar Unagar breaks down all the main approaches: serial queues, NSLock, actors, and why immutability is still your best default. The comparison table at the end is worth bookmarking.</p><p><strong><a href="https://appleboy.tech/articles/get-rid-of-your-swiftgen-dependency">Get Rid of Your SwiftGen Dependency</a></strong></p><p>This article makes a solid case for replacing SwiftGen with Xcode&#8217;s built-in symbol generation for strings, colors, and images. The key insight is that the symbols are generated during compilation, so no generated files in your repo, no merge conflicts, no build scripts to maintain. Just enable the right build setting and you get the same compile-time safety you had with SwiftGen.</p><blockquote><p>Worth noting: if you&#8217;re using SwiftGen for fonts, Core Data models, or other custom resource types, this won&#8217;t fully replace it. But for most projects, it&#8217;s one less dependency to keep alive.</p></blockquote><p><strong><a href="https://soumyamahunt.medium.com/what-you-should-know-before-migrating-from-gcd-to-swift-concurrency-74d4d9b2c4e1">What you should know before Migrating from GCD to Swift Concurrency</a></strong></p><p>This one covers the migration gotchas that the official guide skips. The part that stuck with me: actors are not drop-in replacements for serial queues. GCD guarantees FIFO order, Swift Concurrency doesn't, and that difference can introduce data races that are really hard to reproduce. Soumya Mahunt walks through each pitfall with side-by-side code comparisons.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode">Agent skills in Xcode: How to install and use them today</a></strong></p><p>Paul put together a GitHub repository collecting community-built agent skills for Xcode, Claude Code, and Codex. The idea is simple: skills are Markdown files that teach your coding agent things it doesn't already know, like new iOS 26 APIs, deprecated patterns, or SwiftData predicates that compile but crash at runtime. The repo already includes skills for SwiftUI, SwiftData, Swift Concurrency, and Swift Testing, and the list is growing.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>46 new iOS positions this week  </strong><em>(+2% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 30% / 70% / 0% &#128546;</p></li><li><p>Most wanted skills: SwiftUI 33% &#183; UIKit 20% &#183; Combine 11% &#183; MVVM 9%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>Software Engineer, iOS</strong> at <strong>State Farm</strong> (Tempe, AZ &#183; Bloomington, IL &#183; Richardson, TX &#183; Dunwoody, GA) &#8212; SwiftUI + UIKit combined codebase with Swift Concurrency, modular architecture <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-state-farm-4372805457">&#8594; Apply</a></strong></p><p><strong>Software Engineer, iOS</strong> at <strong>Garmin</strong> (Chandler, AZ) &#8212; Swift + SwiftUI for general aviation products; niche domain with real hardware context, peer code reviews, and a path to tech lead on derivative projects <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-at-garmin-4381921885">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://ronnierocha.dev/blog/ai-model-arena-game-hub/">I ran 9 frontier models through the same coding test</a></strong></p><p>One prompt, nine models, same spec. Sonnet 4.6 came out on top with a perfect test score and the best code review result.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:472455}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>Which Apple product from this week&#8217;s lineup are you most excited about?</p><p><strong>Top Answer:</strong> MacBook Pro with M5 Pro/Max</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">9&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #50]]></title><description><![CDATA[Seven new Apple products, SwiftUI Onion Architecture, passkeys done right, and why your coding agent needs access to your analytics]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-50</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-50</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 06 Mar 2026 13:31:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zDiN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zDiN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zDiN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zDiN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg" width="1456" height="963" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:963,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zDiN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zDiN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F030ad408-1ce0-4f31-8c73-7c3bfae89d56_2048x1355.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://developer.apple.com/news/?id=zmqipz05">Hello Developer: March 2026</a></strong></p><p>Apple's March edition is mostly about Xcode 26 coding intelligence. There's a new video, a live Q&amp;A thread on the Developer Forums, and fresh docs on giving external agentic tools access to Xcode.</p><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-february-2026/">What&#8217;s new in Swift: February 2026 Edition</a></strong></p><p>The monthly Swift community roundup is out! Two proposals were recently accepted: <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0506-advanced-observation-tracking.md">SE-0506</a> adds more control over <code>@Observable</code> tracking for advanced use cases like middleware, and <a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0502-exclude-private-from-memberwise-init.md">SE-0502</a> fixes the long-standing issue where adding a private property with a default value would silently break your struct's memberwise initializer.</p><p><strong><a href="https://www.macrumors.com/2026/03/04/apple-unveiled-seven-products-this-week/">Apple Unveiled These Seven New Products This Week</a></strong></p><p>Apple dropped a lot of hardware this week. I won't hide it, the MacBook Neo is my favorite of the bunch. Not that I'm buying one, but it's genuinely exciting to see Apple go after the entry-level market this seriously. $599 powered by A18 Pro, and available in actual fun colors. If you're complaining about 8GB RAM on a $599 laptop, you're probably not the target audience &#128521;</p><div id="youtube2-kBX5WH9b4M4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;kBX5WH9b4M4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/kBX5WH9b4M4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://salgara.substack.com/p/swiftui-swift-effects-a-beautiful?r=5fy5ci&amp;utm_medium=ios&amp;triedRedirect=true">SwiftUI, Swift Effects: A Beautiful Onion Architecture</a></strong></p><p><span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;Salgara&quot;,&quot;id&quot;:35733999,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e109dd9-fd1c-4ffa-848d-b42dff7f1bca_800x800.jpeg&quot;,&quot;uuid&quot;:&quot;1989c836-b415-436e-a8a5-8b2aaf2f1a9e&quot;}" data-component-name="MentionToDOM"></span> published an interesting experiment: what if you structured your entire SwiftUI app as nested views, like DI &#8594; DataStore &#8594; Logger &#8594; Fetch &#8594; ViewState, each layer handling its own concern? I use TCA myself, and I can see the appeal here: no long dependency chains, deterministic testing, and the whole thing fits naturally with how SwiftUI already thinks about composition. It's experimental, but worth reading if you're curious about alternatives to the standard DI approach.</p><p><strong><a href="https://tanaschita.com/ios-authentication-passkeys/">Implementing Passkeys in iOS with AuthenticationServices</a></strong></p><p>Passkeys keep coming up in security discussions, and this is a practical intro to actually implementing them. The article walks through both registration and authentication flows using <code>AuthenticationServices</code>, with code for handling <code>ASAuthorizationController</code> and the delegate callbacks.</p><p><strong><a href="https://www.avanderlee.com/ai-development/using-an-mcp-to-perform-product-optimizations/">Using an MCP to perform product optimizations</a></strong></p><p>Antoine van der Lee connected Amplitude to his coding agent via MCP, and now instead of manually digging through analytics charts, he just asks the agent what to work on next. The result: actual data-driven decisions without leaving the coding context. The combo with agent skills is where it gets really interesting, he prompts marketing psychology skills alongside real conversion numbers to improve upsells in his app. Less guessing, more shipping the right thing.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://www.hackingwithswift.com/articles/282/swiftui-agent-skill-claude-codex-ai">SwiftUI Agent Skill - Write better code with Claude, Codex, and other AI tools</a></strong></p><p>Paul Hudson released an open-source agent skill that teaches your AI coding tools to write better SwiftUI code. Deprecated API warnings, performance patterns, accessibility checks, concurrency tips, it's all in there, based on years of real SwiftUI experience. One command to install, works with Claude Code, Codex, and others. Worth adding to your setup.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>45 new iOS positions this week  </strong><em>(+13% vs last week)</em> <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 47% / 51% / 2%</p></li><li><p>Most wanted skills: SwiftUI 49% &#183; Objective-C 40% &#183; UIKit 24% &#183; MVVM 16% &#183; Core Data 13%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Software Engineer, ChatGPT Engineering</strong> at <strong>OpenAI</strong> (San Francisco, CA) &#8212; working on the ChatGPT iOS app, pure Swift/SwiftUI stack with a team shipping features to hundreds of millions of users <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-chatgpt-engineering-at-openai-4375274377">&#8594; Apply</a></strong></p><p><strong>Mobile Engineer, iOS</strong> at <strong>Ramp</strong> (New York, NY) &#8212; Stack is SwiftUI + Swift Concurrency + The Composable Architecture + Bazel, one of the most modern setups in this week's dataset <strong><a href="https://www.linkedin.com/jobs/view/mobile-engineer-ios-at-ramp-4362814083?refId=A2A2UOeaEdl%2F%2BbZf0%2Bn%2FZQ%3D%3D&amp;trackingId=B%2FatL0XyYUM8cWs59aMO9w%3D%3D&amp;position=4&amp;pageNum=1">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer</strong> at <strong>Speak</strong> (San Francisco Bay Area) &#8212; AI conversation tutor backed by OpenAI, Accel, and Founders Fund; the iOS stack involves SwiftUI, real-time audio streaming (WebSockets, ll-hls), and Bitrise/Jenkins CI, one of the few roles where AI product and mobile streaming actually intersect <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-at-speak-4318185768?refId=wXfLhoaDX1ztf4SVxLd0Ag%3D%3D&amp;trackingId=L6Pl4U%2B0O2h%2FegTJg6b%2FZQ%3D%3D&amp;position=6&amp;pageNum=2">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><p><strong><a href="https://nilcoalescing.com/blog/AdjustingLineHeightInSwiftUIOniOS26/">Adjusting line height in SwiftUI on iOS 26</a></strong></p><p>A quick but useful look at the new <code>lineHeight(_:)</code> modifier coming in iOS 26. You get presets like <code>.loose</code> and <code>.tight</code>, plus more precise options: <code>multiple(factor:)</code>, <code>leading(increase:)</code>, and <code>exact(points:)</code>. The last one is the tricky one &#8212; fixed point values don't scale with Dynamic Type, so text can overlap or get clipped if the user bumps up their font size.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:468514}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>How do you feel about a touchscreen Mac?</p><p><strong>Top Answer:</strong> Pointless for me</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>March</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">9&#8211;30</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #49]]></title><description><![CDATA[Touchscreen Mac is coming, Xcode 26.3 is out, SwiftUI animation process, SE-0508 trailing closures, automated migration tests and OSLog logging]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-49</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-49</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 27 Feb 2026 13:30:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c5DG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c5DG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c5DG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c5DG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg" width="1456" height="721" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:721,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MacBook Pro 13-inch - Apple&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="MacBook Pro 13-inch - Apple" title="MacBook Pro 13-inch - Apple" srcset="https://substackcdn.com/image/fetch/$s_!c5DG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c5DG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faff584f5-6f51-4734-9c4d-80144b04090b_2416x1196.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://9to5mac.com/2026/02/24/new-m6-macbook-pro-details-revealed-including-dynamic-island-touch-more/">Apple has its first touchscreen-equipped Mac coming later this year</a></strong></p><p><a href="https://www.bloomberg.com/news/articles/2026-02-24/apple-s-touch-screen-macbook-pro-to-have-dynamic-island-new-interface">Mark Gurman confirmed</a> the details on the M6 MacBook Pro: OLED display, Dynamic Island replacing the notch, and a touchscreen that complements keyboard and trackpad rather than replacing them. I've long thought that bringing macOS and iPadOS closer together was the next logical step, and it's nice to finally see it materializing. I now have an official excuse for my smudgy screen: it's not a mess, it's touch workflow in action &#128578;</p><p><strong><a href="https://developer.apple.com/documentation/xcode-release-notes">Xcode 26.3 is out, and 26.4 beta is already here</a></strong></p><p><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_3-release-notes">Xcode 26.3</a> just landed on the App Store with agentic coding as the headline feature: Claude Agent and Codex can now work autonomously inside Xcode, exploring your codebase, searching docs, running builds, and even capturing Xcode Previews to verify their work. Meanwhile, Apple has already shipped <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26_4-release-notes">Xcode 26.4 beta 2</a>, focused on refinements: image attachments in Swift Testing, severity levels for test issues, and improvements to String Catalogs.</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.swiftdifferently.com/blog/swiftui/swiftui-animation-with-example">The 4-Step Process I Use to Create SwiftUI Animations</a></strong></p><p>Knowing the APIs isn&#8217;t enough, you can memorize every animation modifier and still produce animations that feel janky or drain battery. This article walks through a real example of rebuilding iOS&#8217;s large title navigation bar animation in a UIKit/SwiftUI hybrid app, and the four-step process the author uses to approach any animation problem. The part about preference keys to avoid triggering hundreds of state updates on every scroll is worth the read alone.</p><p><strong><a href="https://livsycode.com/swift/array-expression-trailing-closures-in-swift/">Array Expression Trailing Closures in Swift</a></strong></p><p><a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0508-array-expression-trailing-closures.md">SE-0508</a> removes a long-standing parsing restriction that prevented trailing closures after array and dictionary type expressions. So <code>[String] { ... }</code> now works as a constructor call, just like it does for any custom type. Not a groundbreaking feature, but if you write builder-style APIs or extensions around Array and Dictionary, this removes an annoying workaround you&#8217;ve probably hit before.</p><p><strong><a href="https://tanaschita.com/testing-database-migrations/">Preventing Forgotten Database Migrations with Automated Tests</a></strong></p><p>Schema changes are inevitable, and forgetting a migration means existing users hit a broken app on update. The approach here is simple: keep a baseline database file from an older version in your test target, copy it to a temp directory in a test, and try to open it with the current persistence stack. If it throws, the test fails. Works with Core Data, SwiftData, and Realm, and takes maybe an hour to set up.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://codakuma.com/swift-logging/">A simple logging framework in Swift</a></strong></p><p>Ever received a bug report that says &#8220;it crashed when I opened the app&#8221; with nothing else to go on? A solid read on building a lightweight wrapper around Apple&#8217;s built-in OSLog, structured logs with categories, automatic rotation, and an export function that pulls the last 24 hours of logs off the device as a text file. No third-party dependencies, no paid services, just clean and practical.</p><div><hr></div><h3><strong>&#128202; iOS Job Market (USA)</strong></h3><p><strong>40 new iOS positions</strong> this week <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ul><li><p>Senior / Mid / Junior &#8212; 45% / 50% / 5%</p></li><li><p>Most wanted skills: SwiftUI 48% &#183; Core Data 28% &#183; UIKit 25% &#183; Objective-C 20% &#183; Combine 18%</p></li></ul><h4><strong>This week&#8217;s picks:</strong></h4><p><strong>iOS Software Engineer, ChatGPT Engineering</strong> at <strong>OpenAI</strong> (San Francisco, CA) &#8212; working on the ChatGPT iOS app, pure Swift/SwiftUI stack with a team shipping features to hundreds of millions of users <strong><a href="https://www.linkedin.com/jobs/view/ios-software-engineer-chatgpt-engineering-at-openai-4375274377">&#8594; Apply</a></strong></p><p><strong>Senior iOS Engineer, App Builds</strong> at <strong>Duolingo</strong> (New York, NY) &#8212; owning the build infrastructure for the world's most downloaded education app, Swift/SwiftUI at serious scale with 300+ A/B experiments running simultaneously <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-app-builds-at-duolingo-4258558564">&#8594; Apply</a></strong></p><p><strong>Staff iOS Engineer</strong> at <strong>Intuit</strong> (New York, NY) &#8212; AI-native fintech behind TurboTax and QuickBooks, SwiftUI focus with explicit push to integrate LLMs into consumer-facing iOS products <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-at-intuit-4376164127/">&#8594; Apply</a></strong></p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-t8NYLDB5Fg8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;t8NYLDB5Fg8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/t8NYLDB5Fg8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong><a href="https://www.youtube.com/watch?v=t8NYLDB5Fg8">Swift Autoclosures - From First Principles to Smarter SwiftUI Validation</a></strong></p><p>You use <code>@autoclosure</code> every day with the nil coalescing operator, but most developers never think about what's actually happening. Worth watching if you've never gone deeper than &#8220;<code>??</code>&#8221;</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:459773}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What slows you down the most in iOS development?</p><p><strong>Top Answer:</strong> Debugging issues</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>February</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">24&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Counted as iOS positions: roles with &#8220;iOS&#8221; in the title that require writing code in Swift.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The iOS Weekly Brief – Issue #48]]></title><description><![CDATA[Apple Experience on March 4, iOS 26.4 betas are out, agentic delivery pipelines, SwiftUI toast above everything, CLI tools over MCP servers, and tracking your Claude Agent from the menu bar.]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-48</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-48</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 20 Feb 2026 13:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vb7G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>&#127381; What&#8217;s New</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vb7G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vb7G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vb7G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vb7G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vb7G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F165d7e96-644a-497c-93f4-9f575fa8ef51_1600x901.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://www.macrumors.com/2026/02/17/apple-event-march-2026-preview/">Apple Experience on March 4</a></strong></p><p>Apple is hosting a special &#8220;Apple Experience&#8221; event on March 4 in New York, London, and Shanghai. It&#8217;s not a traditional keynote, so don&#8217;t expect a live stream. Instead, selected journalists get hands-on time with whatever Apple announces. </p><p><strong><a href="https://developer.apple.com/news/?id=xgkk9w83">Get ready with the latest beta releases</a></strong></p><p>Apple released the first betas of iOS 26.4, iPadOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, and watchOS 26.4. Time to fire up your test devices and check if your apps still behave as expected &#128640;</p><div><hr></div><h3><strong>&#128218; Must Read</strong></h3><p><strong><a href="https://www.donnywals.com/setting-up-a-delivery-pipeline-for-your-agentic-ios-projects/">Setting up a delivery pipeline for your agentic iOS projects</a></strong></p><p>Donny Wals wrote about his CI/CD setup for agentic projects, and the gym story at the start is exactly what good agentic workflow looks like in practice. The <code>agents.md</code> as a living document piece is something I keep coming back to, you add rules every time the agent does something you don't want. The quality of your output is only as good as the guardrails you put in place upfront.</p><p><strong><a href="https://livsycode.com/swiftui/building-a-toast-component-in-swiftui/">Building a SwiftUI Toast in 5 Steps</a></strong></p><p>Toasts are more of an Android thing, but the approach here is solid. A temporary <code>UIWindow</code> placed above the app's main window is the right way to do it if you want the notification to appear above sheets, tab bars, and navigation. The <code>PassThroughWindow</code> implementation with Liquid Glass detection is a nice touch for iOS 26.</p><p><strong><a href="https://ronnierocha.dev/blog/dont-build-mcps-build-cli-tools/">Don&#8217;t Build MCPs, Build CLI Tools</a></strong></p><p>MCP was designed for sandboxed agents without terminal access. If you're using Claude Code, your agent already has a terminal and doesn't need the extra layer. We don't use MCP servers on our end either, and context window bloat is a big part of why. The argument for CLI tools, zero schema overhead, native composability with pipes, no server setup, is hard to ignore.</p><div><hr></div><h3>&#128736;&#65039;<strong> Toolbox</strong></h3><p><strong><a href="https://github.com/artemnovichkov/ClaudeAgentBar">ClaudeAgentBar</a></strong></p><p>A macOS menu bar app that tracks your Claude Agent activity from Xcode: messages, sessions, tool calls, token counts, peak hours. Small tool, but useful if you want to keep an eye on how much your agent is actually doing.</p><div><hr></div><h3><strong>&#127852; One More Thing&#8230;</strong></h3><div id="youtube2-sc6pvW6vQzA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;sc6pvW6vQzA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/sc6pvW6vQzA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Paul Hudson is doing a live stream on February 21 covering exactly what a lot of us are figuring out right now: agentic coding in Xcode 26.3, Claude Code, Codex, Gemini, and the instructions and skills that keep AI on track.</p><div><hr></div><h3><strong>&#128499;&#65039; Weekly Poll</strong></h3><div class="poll-embed" data-attrs="{&quot;id&quot;:452575}" data-component-name="PollToDOM"></div><blockquote><h4>&#128202; <strong>Last Week&#8217;s Poll Results</strong></h4><p>What&#8217;s your main AI coding setup for iOS development?</p><p><strong>Top Answer:</strong> Xcode to build + external to edit</p></blockquote><div><hr></div><h3><strong>&#128467; Upcoming Conferences</strong></h3><p><strong>February</strong></p><ul><li><p><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">24&#8211;27</a> &#8212; <strong><a href="https://developer.apple.com/events/view/upcoming-events?dates=thisMonth">Meet with Apple</a> </strong><em>(Global &#127758;)</em></p></li></ul><p><strong>March</strong></p><ul><li><p><a href="https://dev.events/ical/appdevcon-g5edems7">10&#8211;13</a> &#8212; <strong><a href="https://appdevcon.nl/">AppDevCon</a></strong> <em>(Amsterdam &#127475;&#127473;)</em></p></li></ul><p><strong>April</strong></p><ul><li><p><a href="https://dev.events/ical/try-swift-tokyo-2026-qtcvqlpm">12&#8211;14</a> &#8212; <strong><a href="https://tryswift.jp/en/">Try! Swift Tokyo 2026</a></strong> <em>(Tokyo &#127471;&#127477;)</em></p></li><li><p><a href="https://dev.events/ical/deep-dish-swift-51maqrkd">12&#8211;14</a> &#8212; <strong><a href="https://deepdishswift.com/">Deep Dish Swift</a></strong> <em>(Chicago &#127482;&#127480;)</em></p></li></ul><p><strong>May</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-konf26-smmfwf0m">4&#8211;6</a> &#8212; <strong><a href="https://www.ioskonf.mk">iOSKonf26</a></strong> <em>(Skopje &#127474;&#127472;)</em></p></li><li><p><a href="https://dev.events/ical/swift-craft-2026-uovvq2jd">18&#8211;20</a> &#8212; <strong><a href="https://swiftcraft.uk">Swift Craft 2026</a></strong> <em>(Folkestone &#127468;&#127463;)</em></p></li></ul><ul><li><p><a href="https://dev.events/ical/mau-vegas-2026-j-7rla-8">19&#8211;21</a> &#8212; <strong><a href="https://mauvegas.com/">MAU Vegas 2026</a></strong> <em>(Las Vegas &#127482;&#127480;)</em></p></li></ul><p><strong>June</strong></p><ul><li><p><a href="https://dev.events/ical/m-dev-camp-2026-119dsse0">3&#8211;4</a> &#8212; <strong><a href="https://mdevcamp.eu/">MDevCamp 2026</a></strong> <em>(Prague &#127464;&#127487;)</em></p></li></ul><p><strong>July</strong></p><ul><li><p><a href="https://dev.events/ical/mac-admins-conference-m5nf-4o">7&#8211;10</a> &#8212; <strong><a href="https://macadmins.psu.edu">MacAdmins Conference</a></strong> <em>(State College &#127482;&#127480;)</em></p></li><li><p><a href="https://dev.events/ical/swift-rockies-2026-ksuktdwn">22&#8211;23</a> &#8212; <strong><a href="https://swiftrockies.com">Swift Rockies 2026</a></strong> <em>(Calgary &#127464;&#127462;)</em></p></li></ul><p><strong>September</strong></p><ul><li><p><a href="https://dev.events/ical/swift-island-2026-iit2op2z">7&#8211;11</a> &#8212; <strong><a href="https://swiftisland.nl">Swift Island 2026</a></strong> <em>(Texel &#127475;&#127473;)</em></p></li></ul><p><strong>October</strong></p><ul><li><p><a href="https://dev.events/ical/next-app-devcon-sxp-tij7">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/">Next.App DevCon 2026</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swiftcon-sitqmuut">7&#8211;9</a> &#8212; <strong><a href="https://www.nextappcon.com/swiftcon">SwiftCon</a></strong> <em>(Berlin &#127465;&#127466;)</em></p></li><li><p><a href="https://dev.events/ical/swift-leeds-2026-qun9qvpi">12&#8211;14</a> &#8212; <strong><a href="https://swiftleeds.co.uk">SwiftLeeds 2026</a></strong> (<em>Leeds &#127468;&#127463;</em>)</p></li></ul><p><strong>November</strong></p><ul><li><p><a href="https://dev.events/ical/swiftsonic-26-sxrhbfqd">20&#8211;22</a> &#8212; <strong><a href="https://swiftsonicconf.com">SwiftSonic 26</a></strong> <em>(Nashville &#127482;&#127480;)</em></p></li></ul><div><hr></div><p><strong>&#128075; That&#8217;s it for this week</strong></p><p>If you enjoyed this issue of <strong>The iOS Weekly Brief</strong>, consider forwarding it to a colleague!</p><p>Until next Friday &#8212; keep shipping &#127823;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://iosweeklybrief.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Stay ahead in iOS development with a short, sharp briefing.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>