<?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.
Join readers from 90+ countries, including engineers from Meta, Apple, Amazon, GitHub, Capital One, Uber, and Google.]]></description><link>https://iosweeklybrief.com</link><image><url>https://substackcdn.com/image/fetch/$s_!JCPn!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0ae3ee-7d3b-4f04-985e-0f3f88aab3c1_768x768.png</url><title>The iOS Weekly Brief</title><link>https://iosweeklybrief.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 20 Aug 2026 10:48:04 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 #73]]></title><description><![CDATA[Git Worktree and AI agents, what's new in Swift, testing SwiftUI navigation, mobile platform foundations, Sendable, PhaseAnimator, FocusState, context rot in AI coding, headless Xcode via MCP]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-73</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-73</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 14 Aug 2026 12:31:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PWAL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>Our tools and the way we work keep changing, and Git Worktree is a good example of that. I started using it before the AI era, and it changed how I worked back then, but now, when AI is part of the process, it has changed things even more because I can run a bunch of tasks in parallel with an agent handling all I need, using Worktrees for different intents. </p><p>MCP is another tool that changes everything - Figma MCP for design work and prototyping, or Xcode MCP, which got a great update in Xcode 27 beta 5 that lets us launch an app, tap through it, and test it without even opening Xcode. All of these small additions are changing how our daily work gets done.</p><p>Read more about that below...</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_!PWAL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PWAL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PWAL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PWAL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PWAL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PWAL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;: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_!PWAL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PWAL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PWAL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PWAL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162f175a-895d-4dab-a617-cb30f5ded253_1500x1000.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 aria-hidden="true" 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><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-july-2026/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">What&#8217;s new in Swift</span></a></strong></p><p>The new digest from Swift.org is out! Take a look to catch up with Swift Evolution proposals, new package releases, and updates to tools like SwiftPM and the VS Code extension.</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=08102026l"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27 beta 5</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=08102026f"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 beta 5</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=08102026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6.1</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=08102026d"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 18.7.10</span></a><span data-color="#6aa84f" style="color: rgb(106, 168, 79);"> &#129327;</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://azamsharp.com/2026/08/13/unit-testing-navigation-logic-in-swiftui.html"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Unit Testing Navigation Logic in SwiftUI</span></a></strong></p><p>The article moves navigation decisions out of the view and into a router. Therefore, the routes will be represented as values you can inspect and test without launching the app or writing UI tests. </p><p>I think testing state and testing an actual screen transition are two different things, and using both approaches for the navigation makes sense when you can afford it. But UI tests are expensive, and this approach will help you to be confident with your next release.</p><p><strong><a href="https://www.scottberrevoets.com/2026/08/11/the-foundations-of-a-mobile-platform/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">The foundations of a mobile platform</span></a></strong></p><p>I agree 100%. A platform helps an app scale faster: you stop thinking about how to build a new UI element since it already lives in the design system, or how to ship a release since a process and a team own it. A platform works like rails your app development moves on.</p><p><strong><a href="https://mfaani.com/posts/ai/how-to-use-git-worktree-and-how-its-used-by-ai-agents/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">How to Use Git Worktree? And How It&#8217;s used by AI Agents?</span></a></strong></p><p>I recommend everyone start using worktrees. I used them long before AI era, simply because I was juggling several tasks at once and did not want to switch branches, deal with stashes, etc. With AI, worktrees matter even more, since now I can run more tasks in parallel with an agent handling all of them. If you are looking for a way to boost your workflow, check this out, it makes a huge difference in how much you can get done.</p><p><strong><a href="https://www.avanderlee.com/swift/sendable-protocol-closures/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Sendable and Sendable closures explained with code examples</span></a></strong></p><p>Yeah, I know I share Sendable content often, and I&#8217;ll do it again! This is an important topic, and the explanation is built really well. It walks through implicit conformance, closures, unchecked Sendable, and the newer Mutex approach that removes the need for it in most cases.</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://nilcoalescing.com/blog/PhaseAnimationsInSwiftUI/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Creating multi-step animations with PhaseAnimator in SwiftUI</span></a></strong></p><p><code>phaseAnimator()</code><span> allows you to chain multiple animation states without manually tracking the progression yourself</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;ef94cfdb-522d-4cb5-92d5-b63b739a237f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">.phaseAnimator([Phase.lifted, .tiltedLeft, .tiltedRight, .settled]) { view, phase in
    view
        .scaleEffect(phase.scale) // grows or shrinks per phase
        .rotationEffect(phase.rotation) // tilts per phase
}</code></pre></div><p><strong><a href="https://tanaschita.com/swiftui-focus-state/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Managing focus in SwiftUI with FocusState</span></a></strong></p><p>Use<code> FocusState</code> to observe and move focus between fields</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;d08e09e3-5b9b-47d6-a52e-15e06f6ac43d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">@FocusState private var focusedField: Field?

TextField("Email", text: $email)
    .focused($focusedField, equals: .email)
    .onSubmit { focusedField = .password } // move focus forward</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-PYvtR0yPq6M" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;PYvtR0yPq6M&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/PYvtR0yPq6M?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=PYvtR0yPq6M"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Why Context Rot Hurts Your AI Coding Session (How to fix it)</span></a></strong></p><p>A good explanation of why long AI sessions degrade over time, and how to fix it. My approach is to prepare a plan first and delegate the implementation to sub-agents, since each one has a separate context window (keep in mind this gets expensive in tokens fast). I agree with the recommendation to start a new thread per feature and keep repeating context outside the conversation, but I don&#8217;t recommend a manual compaction since it can drop important details from the context.</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/headless-xcode-from-prompt-to-simulator-with-mcp"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Headless Xcode: From Prompt to Simulator with MCP</span></a></strong></p><p>Xcode 27 beta 5 adds a preview of an MCP server experience that runs without an open Xcode workspace. Claude Code Agent can now build a project, render previews, and tap through a full flow on the simulator.</p><p>It is not a replacement for UI tests, because for those we use mocked data, but it could be a replacement for smoke testing.</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>67 new iOS positions this week  </strong><em>(+34% vs last week &#183; +103% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 21% / 79% / 0%</p></li><li><p>Most wanted skills: SwiftUI 46% &#183; UIKit 31% &#183; MVVM 19% &#183; Core Data 7%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>iOS Engineer</strong> at <strong>Opal Electronics</strong> (San Francisco Bay Area) &#8212; SwiftUI + UIKit codebase controlling hardware cameras and peripherals over BLE and Wi-Fi &#8594; <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-at-opal-electronics-4453313609"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Senior iOS Engineer</strong> at <strong>Brick</strong> (Chicago, IL) &#8212; SwiftUI/UIKit across NFC, Bluetooth, and a real-time backend that powers app blocking and notification management; senior scope means owning architecture and system design, not just shipping features &#8594; <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-at-brick-4451957239"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>iOS Mobile Software Engineer</strong> at <strong>ADT</strong> (Irving, TX) &#8212; Swift + SwiftUI + async/await for a consumer security app used by hundreds of thousands of users daily; role covers customer-facing features, core architecture, and AI-assisted development tooling on a high-traffic production codebase &#8594; <strong><a href="https://www.linkedin.com/jobs/view/ios-mobile-software-engineer-at-adt-4444512079"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">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;:986354}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>How do you write most of your code these days?</p><p><strong>Top Answer:</strong> AI implements, I review the code</p></blockquote><div><hr></div><h2><strong><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Upcoming Conferences</span></strong></h2><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><li><p><a href="https://dev.events/ical/appdevcon-2027-sfwujnrs"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">16&#8211;18</span></a> &#8212; <strong><a href="https://appdevcon.nl/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Appdevcon 2027</span></a></strong> <em>(Amsterdam &#127475;&#127473;)</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 #72]]></title><description><![CDATA[New App Store creative assets, an on-device Media Intelligence framework, MainActor protocol isolation, SwiftUI's ContentBuilder for non-view types, testing SwiftData, and a URLSession API client]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-72</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-72</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 07 Aug 2026 12:31:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RGV8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>Testing is becoming a big deal for me. We write a huge amount of code now, and AI can help with automating tests, it can suggest test cases and write them fast, but I noticed that the quality of these tests could be better... It adds unnecessary tests or tests that check the wrong thing. One of the articles in this issue talks about testing SwiftData operations, which really means testing Apple&#8217;s own framework instead of your business logic, and that connected with what I have been seeing. Usually, your AI agent does not know what deserves a test, and you end up with a bunch of tests that look good on paper but give you no real confidence.</p><p>TDD approach helps me a lot. I can just describe what needs to be tested, approve those tests first, and only then let the AI agent implement the code to make them pass. It is easy to review test scenarios, though. If you do it backwards, you will have tests that describe what the code already does, and some of them overlap or test the same thing twice.</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_!RGV8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RGV8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RGV8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RGV8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RGV8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RGV8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg" width="2048" height="953" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:953,&quot;width&quot;:2048,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:278497,&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_!RGV8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RGV8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RGV8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RGV8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fb624c5-1185-477d-8684-331e66774236_2048x953.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 aria-hidden="true" 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><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=kug6m2ea"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Get ready for new creative assets on the App Store</span></a></strong></p><p>Apple shared best practices and free design templates for the new creative assets announced back in June. You can now show your brand, seasonal content, or new features, not just your app in use, across your product page, search results, and Apple Ads.</p><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://antongubarenko.substack.com/p/ios-27-media-intelligence-framework"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">iOS 27: Media Intelligence</span></a></strong></p><p>Apple added a new framework in iOS 27 beta that works with photo and video collections instead of single images, grouping the same person across your photos and finding highlights in video. I love that this runs entirely on the device, you know I always get excited about that &#128517; This is a free, easy-to-implement feature if your product touches this kind of functionality</p><p><strong><a href="https://www.swiftbysundell.com/articles/swift-protocols-and-the-main-actor/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Swift protocols and the main actor</span></a></strong></p><p>Marking a protocol with MainActor changes the isolation of any type that conforms to it, and actors cannot conform to such a protocol at all. The article walks through why that happens and shows a way to handle this using per-requirement isolation instead of isolating the whole protocol.</p><p><strong><a href="https://artemnovichkov.com/blog/using-swiftui-contentbuilder-with-non-view-types"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Using SwiftUI&#8217;s ContentBuilder with Non-View Types</span></a></strong></p><p>Xcode 27 removes the View constraint from ViewBuilder&#8217;s buildBlock, so ContentBuilder can now assemble types that have nothing to do with views. The article shows how to bring the same syntax down to iOS 17 by adding your own buildBlock overload with parameter packs.</p><p><strong><a href="https://azamsharp.com/2026/08/02/building-testable-swiftdata-apps.html"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Building Testable SwiftData Applications</span></a></strong></p><p>SwiftData&#8217;s CRUD operations just work, and there is no need to test them. Only business rules deserve unit tests. In-memory stores keep tests isolated, and the new ResultsObserver in iOS 27 lets you test aggregate logic outside of SwiftUI views entirely. I 100% agree with this approach. Testing an already built framework isn&#8217;t your job, that&#8217;s on the framework developers, in this case Apple.</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://tanaschita.com/swift-urlsession/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Building a reusable API client with URLSession in Swift</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-bnPB4e_j1fI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;bnPB4e_j1fI&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/bnPB4e_j1fI?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=bnPB4e_j1fI"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Is the indie dream dead?</span></a></strong></p><p>I agree with this. It used to be that most of your effort went into coming up with an idea and building it, and then you would get a wave of users for that effort. Now coming up with an idea and building it takes far less, but the users are not there, and without them none of it matters&#8230;</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://github.com/migueldeicaza/AgenticSwift"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">AgenticSwift</span></a></strong></p><p>A Swift macro package that adds an ai body macro, you declare a function without a body, describe what it should do in a string, and Codex generates the Swift implementation at compile time &#129327; I&#8217;ll be honest, I have not used this approach. I stopped writing code in the editor a while ago, even function names. My workflow is discussing a detailed plan with AI, how to implement something, how it should look architecturally, and only then it move to implementation that I will review later. This approach is for people who still write code manually.</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>50 new iOS positions this week  </strong><em>(+56% vs last week &#183; +35% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 22% / 76% / 2%</p></li><li><p>Most wanted skills: SwiftUI 58% &#183; UIKit 32% &#183; Combine 18% &#183; MVVM 12%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Member of Technical Staff (iOS Engineer, Computer Growth)</strong><span> at </span><strong>Perplexity</strong><span> (San Francisco, CA) &#8212; Growth engineering for Perplexity's agentic AI suite (Perplexity, Comet, and Computer) on iOS: end-to-end ownership of install, onboarding, in-app purchase, lifecycle messaging, and retention surfaces, with server-driven and flag-driven experimentation patterns to ship without waiting on release cycles. Salary $220K&#8211;$405K</span> <strong><a href="https://www.linkedin.com/jobs/view/member-of-technical-staff-ios-engineer-computer-growth-at-perplexity-4447408280"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>Software Engineer, iOS/Mobile &#8212; Electronic Flight Bag (EFB)</strong><span> at </span><strong>Beacon AI</strong><span> (San Carlos, CA) &#8212; SwiftUI + UIKit + Swift Concurrency (async/await) for safety-critical iPad EFB apps: real-time aviation instrument rendering, offline-first architecture, location services, and hardware integration with edge devices handling millions of wind and weather data points in flight</span> <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-mobile-electronic-flight-bag-efb-at-beacon-ai-4447713045"><span>&#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;:938597}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>How do you handle reviewing AI-generated pull requests?</p><p><strong>Top Answer:</strong> I skim and trust the tests/CI</p></blockquote><div><hr></div><h2><strong><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Upcoming Conferences</span></strong></h2><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 #71]]></title><description><![CDATA[Apple and the AI race, iOS 26.6, everything new in Xcode 27, code signing and provisioning, why AI broke code review, designing modular iOS architecture, SwiftUI glass buttons and blend modes]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-71</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-71</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 31 Jul 2026 12:30:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Uh5B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>There was an interview this week that confirmed something I have been saying for a while now - Apple could benefit from staying out of the AI race. While the rest of the world keeps going crazy over AI, Apple has stayed calm.</p><p>Funny enough, the same kind of calm does not exist on the other side of AI. The amount of code being generated keeps growing, but the number of developers doing code review stays the same, if not smaller &#128556; It is something I also touch on further in this issue.</p><p>There is a lot more happening in iOS this week, so keep reading...</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_!Uh5B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uh5B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Uh5B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Uh5B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Uh5B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uh5B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc157138-258f-4437-97db-4cfbcd533d2f_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_!Uh5B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Uh5B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Uh5B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Uh5B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc157138-258f-4437-97db-4cfbcd533d2f_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 aria-hidden="true" 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><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/07/27/ed-zitron-apple-watch-it-burn-ai-bubble-bursts/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Apple Will &#8216;Watch Everything Burn&#8217; When AI Bubble Bursts - Ed Zitron</span></a></strong></p><p>There is an interview this week in which a well-known AI critic explains why he thinks the whole AI industry is a bubble and what happens to Apple once it pops. His main point is that Apple stayed out of the race, and that decision might save the company when things fall apart for everyone else.</p><p>I have been saying that for a long time. I don&#8217;t think this was Apple&#8217;s plan from the beginning, though... I think Apple was late, and by the time it noticed, the race went crazy. As a result, there is a good chance Apple wins here, but not because it planned to.</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=07272026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6</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.appcoda.com/xcode-27/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">What&#8217;s New in Xcode 27</span></a></strong></p><p>I am a huge fan of Xcode and I never understood why it gets such a low rating on the App Store &#128517; </p><p>AI made things a bit less rosy, since Xcode still lacks some features other IDEs already have, but this release still brings a lot of great stuff, especially around AI and fast prototyping. I really like the prototyping part, it is not just for engineers, even product managers could use it to quickly put together a prototype with AI. This article covers everything in one place, so I recommend checking it out.</p><p><strong><a href="https://tanaschita.com/ios-code-signing-provisioning/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Understanding code signing and provisioning in iOS</span></a></strong></p><p>If you work in a feature team at a large company, this topic probably never comes up, but if you are at a small company, you usually deal with certificates and releases yourself. Even if that is not your situation right now, I recommend taking a look. You never know when you might start your own project or join a startup, and this knowledge will be useful for you.</p><p><strong><a href="https://swiftandmemes.com/ai-broke-code-review-heres-how-to-rebuild-it/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">AI Broke Code Review. Here&#8217;s How to Rebuild It</span></a></strong></p><p>Not gonna lie, this is a problem. Coding is fast now, but specs could be better, and AI fills gaps with something that sounds ok but is not accurate or doesn&#8217;t even make sense. We produce more code, sometimes worse code, while the review process and resources stay the same.</p><p>My personal advice: keep pull requests small. Small changes are easier for AI to implement, and they statistically get reviewed and commented on more often than large ones, which people approve with an &#8220;LGTM&#8221; comment.</p><p><strong><a href="https://blog.jacobstechtavern.com/p/modular-ios-architecture"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Designing The Perfect Modular Architecture</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;dec5b1f5-cbdd-4a84-9b3c-c7dcd3e9dd6d&quot;}" data-component-name="MentionToDOM"></span> breaks down modular iOS architecture using everything he learned across 10 years of building apps.</p><p>Architecture is very important, especially now that the focus in engineering is more about design rather than writing code. I recommend everyone spend time understanding the key aspects of architecture, and this article can really help you with that.</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://livsycode.com/swiftui/changing-the-shape-of-glass-buttons-in-swiftui/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Changing the shape of glass buttons in SwiftUI</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;cf306f17-70d6-44a1-a8b7-e3d66dadcc20&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">Button {
} label: {
    Image(systemName: "sun.max")
}
// tells SwiftUI to use a circle for the border platter, not just clip the result
.buttonBorderShape(.circle)
.buttonStyle(.glass)</code></pre></div></li><li><p><strong><a href="https://nilcoalescing.com/blog/BlendModesInSwiftUI/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Blend modes in SwiftUI</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;d9123248-ca6c-4eb0-a29d-7de1392f3175&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">ZStack {
    BirdFrameOne()
    BirdFrameTwo()
        .blendMode(.darken)
}</code></pre></div></li></ul><div><hr></div><h2><strong><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Video</span></strong></h2><div id="youtube2-j43EHrHQIas" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;j43EHrHQIas&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/j43EHrHQIas?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=j43EHrHQIas"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">SwiftRockies 2026 The Myth of the Self Taught Developer</span></a></strong></p><p>Stuart argues that no developer is truly self-taught, since we all learn through community in one way or another.</p><p>I agree with that in a way, but to me self-taught is about finding that community yourself and deciding what from it matters to you. I also feel like I am part of that community. With readers from more than 90 countries subscribed to this newsletter, I try to add my own piece to it too, and maybe by reading my newsletter each week, you end up learning something from that community as well &#128588;</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://github.com/AvdLee/Xcode-Disk-Cleanup-Agent-Skill"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Xcode-Disk-Cleanup-Agent-Skill</span></a></strong></p><p>An agent Skill that finds where Xcode is eating your disk space, from Derived Data to old Simulator runtimes, and shows you recoverable GiB with evidence before touching anything.</p><p>I constantly run into this problem, Xcode eats up disk space without me noticing. I consider this skill a must-have for any iOS developer!</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>32 new iOS positions this week  </strong><em>(+10% vs last week &#183; -14% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 34% / 63% / 3%</p></li><li><p>Most wanted skills: SwiftUI 43% &#183; UIKit 28% &#183; MVVM 15% &#183; Core Data 9%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Software Engineer, iOS</strong><span> at </span><strong>Current</strong><span> (New York, NY) &#8212; Swift Concurrency model (required), UIKit for native layouts, gRPC/Protobuf for networking; 6M+ members managing their finances. $150K&#8211;$200K</span> <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-current-4443578903"><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;:892369}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Have you shipped a feature using Apple&#8217;s Foundation Models yet?</p><p><strong>Top Answer:</strong> Yes, in production</p></blockquote><div><hr></div><h2><strong><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Upcoming Conferences</span></strong></h2><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 #70]]></title><description><![CDATA[Claude now runs your app in the iOS Simulator, Apple's Foundation Models and testing them properly, adaptive non-modal panels and widgets in SwiftUI, a tool that keeps your AI agent up to date on WWDC]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-70</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-70</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 24 Jul 2026 12:31:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jcMN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>I keep hearing debates about which model is the best, but I don&#8217;t think it matters here. It is important where that model lives and how easy it is to use. Let&#8217;s take a look at Gemini, I don&#8217;t like it as a model, it doesn&#8217;t fit my workflow the way Claude or GPT does. But Gemini is in every Google tool, and it changes the whole picture. I think Anthropic&#8217;s decision with the iOS Simulator support was a great idea. It definitely lowers the first step for someone who wants to try building an app.</p><p>One of our product managers used Claude to create a prototype and show it running on the web. Setting up Xcode, installing simulators, wiring up a project, none of that is trivial if you have never done it. Now you can just ask Claude to draw an iPhone screen and show you how it looks. This tells me the demand for fast prototyping is real, and it comes from product people, not developers. You don&#8217;t need a designer or an engineer to test an idea, you can just look at it yourself. If it feels right, you move it into the professional lane, hand it to people who design and architect the thing properly, and build it for real.</p><p>I&#8217;d put this feature in the hands of non-developers more than developers. It&#8217;s a great tool for someone who never wrote a line of code and wants to see their idea come to life.</p><p>On the downside, lowering the barrier means more slop in the App Store. But to be fair, people who wanted to ship an app had every tool they needed for that already, Claude, MCP, etc. Writing the code was never the hard part, and real software engineers don&#8217;t get paid for typing code. There&#8217;s a lot more to shipping software than that, and none of it goes away just because building a prototype got easier.</p><p>It&#8217;s probably still rough around the edges today, but I like where this is heading. I can imagine a Zoom call where someone throws out an idea, we write a few prompts, and a prototype shows up right there while we&#8217;re still talking, no Figma file, nothing prebuilt. Then we take that prototype, write the spec from it, figure out the architecture, connect a backend, and ship the real feature.</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_!jcMN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jcMN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jcMN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jcMN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jcMN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jcMN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58439246-0057-40c0-9a13-4f4849f9da58_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_!jcMN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jcMN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jcMN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jcMN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58439246-0057-40c0-9a13-4f4849f9da58_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 aria-hidden="true" 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><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/07/21/claude-code-ios-simulator/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Claude Code Can Now Build and Test iOS Apps in Apple&#8217;s Simulator</span></a></strong></p><p>Anthropic released a public beta that has an integration with iOS Simulator. Now Claude Desktop can build, launch and tests your app right there, with a live panel showing the simulator.</p><p>The test loop got a lot simpler with this change, I see real value here for quick prototyping, testing an idea fast and showing it to someone. I don&#8217;t see this as a professional tool yet though... For real production work I&#8217;d use an MCP to have the right level of control.</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=07202026m"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27 beta 4</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=07202026g"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 beta 4</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=07202026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6 RC</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.kodeco.com/53631607-getting-started-with-apple-s-foundation-models"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Getting Started with Apple&#8217;s Foundation Models</span></a></strong></p><p>This is not the first article covering Foundation Models, but I found it really easy to follow. If you have not started digging into this yet, I recommend checking it out. Adding an AI feature to your app has never been this simple before.</p><p><strong><a href="https://livsycode.com/swift/foundation-models-utilities/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Foundation Models Utilities</span></a></strong></p><p>If you already went through the first article and got familiar with Foundation Models, this is a good next step to extend what you can do with it. Apple published a separate open-source package on top of the framework that connects your session to hosted models through the Chat Completions protocol, gives you a few strategies to manage the context window as your session grows, and lets you load instructions only when the model needs them through runtime skills.</p><p><strong><a href="https://nilcoalescing.com/blog/BuildingAdaptiveNonModalPanelsInSwiftUI/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Building adaptive non-modal panels in SwiftUI</span></a></strong></p><p>I&#8217;m not a big fan of custom solutions, but sometimes Apple&#8217;s component just does not match how you want the feature to behave. Bottom sheets are a good example, in every app I&#8217;ve worked on we wanted them to behave differently than Apple intended. It&#8217;s great to see this built with SwiftUI, no third party library, custom layout, custom drag handling, adaptive positioning across rotation, all from scratch, amazing work!</p><p><strong><a href="https://tanaschita.com/widgetkit-building-widgets-with-swiftui/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Building widgets with WidgetKit and SwiftUI</span></a></strong></p><p>I don&#8217;t use widgets that often myself, but every app should have one if it makes sense for the product. A widget is another entry point into your app, sitting right there on the home screen next to your app icon. If it fits your use case, this is a good place to start.</p><p><strong><a href="https://nilcoalescing.com/blog/GeometryCompositingAndDrawingGroupsInSwiftUI/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Geometry, compositing and drawing groups in SwiftUI</span></a></strong></p><p><code>geometryGroup()</code>, <code>compositingGroup()</code>, <code>drawingGroup()</code>, three modifiers with a similar name, but very different jobs. Let&#8217;s read the article to understand where and when you need to use all of them.</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://www.sagarunagar.com/blog/swiftui-textselection-ios-27/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">SwiftUI Text Selection Improvements in iOS 27</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;9a81b51b-1256-4fa5-aabc-1e08aa5178fb&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">Text("""
    SwiftUI makes it easy to build beautiful apps across Apple platforms.
""")
    // on iOS 27 this now gives you native range selection, no code changes needed
    .textSelection(.enabled) </code></pre></div></li></ul><div><hr></div><h2><strong><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Video</span></strong></h2><div id="youtube2-TL8Pn3Oq3N4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;TL8Pn3Oq3N4&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/TL8Pn3Oq3N4?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=TL8Pn3Oq3N4"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Evaluating Apple Intelligence Features in Xcode</span></a></strong></p><p>Don&#8217;t forget that shipping an AI feature also means testing it, and this video walks through how to do that in the right way, using a new Evaluations framework in Xcode 27.</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://wwdc.ai/"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">wwdc.ai</span></a></strong></p><p>If you don't have time to sit through every WWDC session but want your AI agent to know what was announced, this tool is for you. It feeds your agent all the content it needs from every WWDC 2026 session, so it stays up to date with the latest changes Apple presented.</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>29 new iOS positions this week  </strong><em>(-12% vs last week &#183; -19% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 41% / 59% / 0%</p></li><li><p>Most wanted skills: SwiftUI 52% &#183; UIKit 28% &#183; Combine 21% &#183; MVVM 14%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Software Engineer, iOS</strong><span> at </span><strong>Current</strong><span> (New York, NY) &#8212; Swift Concurrency model (required), UIKit for native layouts, gRPC/Protobuf for networking; 6M+ members managing their finances. $150K&#8211;$200K</span> <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-current-4443578903"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>Software Sr Engineer, iOS</strong><span> at </span><strong>RSA Security</strong><span> (Remote) &#8212; Swift + SwiftUI/UIKit, MVVM/Clean Architecture, Apple Security framework + CryptoKit + Keychain API; building RSA SecurID mobile authentication for 12,000 organizations and 25M enterprise identities. $100K&#8211;$140K</span> <strong><a href="https://www.linkedin.com/jobs/view/software-sr-engineer-ios-at-rsa-security-4442212454"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>Sr Engineer, iOS</strong><span> at </span><strong>Target</strong><span> (Brooklyn Park, MN) &#8212; SwiftUI + TCA architecture powering the Target app; major iOS engineering investment at one of the US's largest retailers, millions of daily users</span> <strong><a href="https://www.linkedin.com/jobs/view/sr-engineer-ios-at-target-4443014135"><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;:846804}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>What&#8217;s your experience with iOS 27 so far?</p><p><strong>Top Answer:</strong> Installed the beta, loving it</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/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 #69]]></title><description><![CDATA[Apple vs OpenAI, iOS 27 public beta, building reusable SwiftUI views and keeping SwiftData out of your UI, SDD and agentic workflows for iOS, plus a smarter way to collect user bug reports]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-69</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-69</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 17 Jul 2026 12:32:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lcCa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>iOS 27 public beta is out, and it looks like one of the most stable betas we have seen in a while! I can even recommend installing it. Most of the new features are about AI, and Siri is smart, can you believe it?</p><p>Also, Apple filed a lawsuit against OpenAI this week. I go into the details further down, but honestly this was expected... Apple sees OpenAI as a competitor. They&#8217;re both strong companies, each missing exactly what the other one has. I remember thinking a long time ago that Apple should just buy them &#128517; Apple has a history of acquiring businesses, and owning OpenAI could have put them in a great spot in the AI world today. Still, I think Apple is doing well on its own, and this new version of iOS with cool AI features confirms it.</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_!lcCa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lcCa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lcCa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lcCa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lcCa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lcCa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.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;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!lcCa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lcCa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lcCa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lcCa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F65c48ad6-ebfa-44e4-b5fa-bf8d61e062ac_1600x800.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 aria-hidden="true" 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><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/07/10/apple-sues-openai-trade-secret-theft/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Apple sues OpenAI, accuses ex-employees of stealing trade secrets</span></a></strong></p><p>This connects directly to something I mentioned last week. We talked about who has the better position in the AI race: a company with hardware and no AI, or a company with AI and no hardware and infrastructure to run it on. Apple is years ahead on hardware, OpenAI is ahead on the AI, and now both companies are trying to close their own gap. </p><p>Given that, this lawsuit doesn&#8217;t come as a surprise...</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=07132026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6 beta 5</span></a></strong></p></li><li><p><strong><a href="https://www.macrumors.com/2026/07/13/apple-seeds-ios-27-public-beta-1/"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27 Public Beta</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://alexanderweiss.dev/blog/2026-07-12-the-anatomy-of-a-reusable-swiftui-view"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">The Anatomy of a Reusable SwiftUI View</span></a></strong></p><p>A design system is one of the smartest investments you can make! If your codebase does not have one, that is a great opportunity for the next six months &#128517; Here you can find how to build custom SwiftUI components step by step, and keep custom APIs close to Apple&#8217;s native ones. </p><p>When you spend most of your time on a project with a design system, it becomes easy to forget how native components behave <em>(trust me)</em>. Matching naming, data flow, and interaction patterns to Apple&#8217;s own APIs closes that gap between custom and native elements. Do not reinvent the wheel, and keep watching how Apple builds its own components and just mirror that behavior.</p><p><strong><a href="https://emredegirmenci.substack.com/p/spec-kit-spec-driven-development"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Spec Kit (Spec-Driven Development) in an iOS Project</span></a></strong></p><p>I don&#8217;t use a dedicated SDD framework yet, but I follow the approach behind it. Before implementing a feature, I prepare a spec based on resources like Figma and Jira, combined with my codebase, to generate the specification my agents then work from.</p><p>A dedicated SDD tool like Spec Kit still feels like overhead to me, but the approach itself is great!</p><p><strong><a href="https://medium.com/@matej-kokosinek/ios-agentic-workflow-setup-2026-2c9092fc2427"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">iOS Agentic workflow setup</span></a></strong></p><p>I have not set this up myself, but I see the benefit. I like the approach of saving problem-solving context into memory files, it is similar to what happens with SDD. You get a history of specs and past decisions, so a problem already solved once stays recorded instead of getting re-diagnosed.</p><p>I work directly with my agent while implementing, but let&#8217;s be real - we don&#8217;t need to write the code, we need to prepare specs. When the spec is ready, you hand it to an agent, and it delivers a result without any work on your end. The coding gets done by the agent, and you just need to do the final review and merge into main, easy peasy.</p><p><strong><a href="https://tanaschita.com/swiftdata-persistence-boundaries/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Keeping SwiftData behind a boundary</span></a></strong></p><p>I remember the same problem with UIKit and Core Data <em>(I&#8217;m so old, damn&#8230;)</em>. Apple mixes database framework knowledge into the UI layer, and that goes against all rules! It always looked wrong to me, so I recommend building wrappers to avoid this and mocking things in tests.</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/EquatablePropertiesInObservableClasses/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Equatable properties in Observable classes</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;8b08cbb2-90a5-4877-bc11-b3dcb505fc02&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// Without Equatable, every assignment triggers a view update
struct DeliveryProgress: Equatable {
    var totalStops: Int
}</code></pre></div></li><li><p><strong><a href="https://www.scottberrevoets.com/til/liquid-glass-can-be-gradually-rolled-out/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Liquid Glass can be gradually rolled out</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;bff1e50c-fd3d-4322-a80b-c58d7a1ba72f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// requires app restart to take effect
UserDefaults.standard.set(true, forKey: "com.apple.SwiftUI.IgnoreSolariumOptOut")</code></pre></div></li></ul><div><hr></div><h2><strong><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Video</span></strong></h2><div id="youtube2-_oRgdlJUD18" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_oRgdlJUD18&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/_oRgdlJUD18?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=_oRgdlJUD18"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">iOS 27 Hands-On: Top 5 New Features!</span></a></strong></p><p>The public beta of iOS 27 is out, and it looks like one of the most stable betas Apple has shipped in a while. Here&#8217;s a rundown of the key new additions.</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://github.com/AvdLee/Diagnostics"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Diagnostics</span></a></strong></p><p>Really useful when a user attaches everything you need upfront, because otherwise you get a review or a bug report, you need more details to fix it, and by the time you try to reach out the user is already gone. I&#8217;ve used similar setups before, just custom-built ones, and here you get a library! Bonus: your coding agent can read the report directly and connect it to your codebase.</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>33 new iOS positions this week  </strong><em>(-30% vs last week &#183; -31% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 30% / 67% / 3%</p></li><li><p>Most wanted skills: SwiftUI 48% &#183; UIKit 36% &#183; MVVM 18% &#183; Combine 15%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Software Engineer 3, iOS</strong><span> at </span><strong>Branch</strong><span> (Minneapolis, MN) &#8212; 100% Swift + SwiftUI codebase with Combine and async/await throughout; modular architecture powering instant-pay and earned-wage-access products for working Americans</span> <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-3-ios-at-branch-4440309618"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>Software Engineer, iOS/Mobile</strong><span> at </span><strong>Beacon AI</strong><span> (San Carlos, CA) &#8212; Swift + SwiftUI + async/await on real-time, safety-critical aviation apps; DoD contracts and major airline partnerships, small team with full ownership</span> <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-mobile-at-beacon-ai-4441286218"><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;:802209}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>How often do you still search outside your AI agent ?</p><p><strong>Top Answer:</strong> Rarely</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/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 #68]]></title><description><![CDATA[Apple's new AI-powered developer search, custom bindings in SwiftUI, Sendable, how Apple Photos recognizes faces on-device, the Translation framework, a performance skill for your coding agent]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-68</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-68</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 10 Jul 2026 12:31:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_ty8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>I watched a video this week debating who&#8217;s actually winning the AI race, the companies building the AI itself, or the companies building the hardware it runs on. I&#8217;d say that the hardware matters more. I believe we will be able to run local models for all kinds of tasks, with unlimited tokens, and it is exciting, isn&#8217;t it? You can already see some examples of this in Apple&#8217;s ecosystem, like the on-device face recognition example in this issue, which feels magical but runs entirely on your device. I think the same approach is coming for AI models too. Apple owns a lot: the iPhone, Mac, Apple Watch, their own App Store. They&#8217;re behind on AI itself, but they&#8217;re the platform everyone else runs on. We all love Claude, we all love ChatGPT, but we&#8217;re using them on an iPhone or a Mac either way. So I don&#8217;t think Apple is losing here at all. There&#8217;s a full video on this in the issue if you want to dig deeper.</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_!_ty8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_ty8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_ty8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_ty8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_ty8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_ty8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg" width="1456" height="501" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:501,&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_!_ty8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_ty8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_ty8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_ty8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dfe3504-a924-4f05-b740-4017ed51034e_2281x785.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 aria-hidden="true" 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><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/search/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Ask Apple Developer</span></a></strong></p><p>Apple rolled out a new AI search tool on their developer website called Ask Apple Developer. Instead of giving you a list of links, it generates an answer based on Apple&#8217;s own documentation, API references, and WWDC sessions.</p><p>As I mentioned, I&#8217;m skeptical about this&#8230; Scoping an AI search to just official Apple knowledge is useful, but I can&#8217;t really picture myself switching over to this site to search for something. I&#8217;ll most likely keep asking my AI agent instead, since it already has internet access and can pull in tutorials, community discussions, and real code on top of the official docs.</p><p><strong><a href="https://www.swift.org/blog/whats-new-in-swift-june-2026/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">What&#8217;s new in Swift: June 2026 Edition</span></a></strong></p><p>It covers everything from WWDC26 announcements to new package releases. There&#8217;s also a good rundown of the language proposals currently in review, including withDeadline for putting time limits on async operations.</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=07062026m"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27 beta 3</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=07062026g"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 beta 3</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=07062026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6 beta 4</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://nilcoalescing.com/blog/CustomBindingsInSwiftUIClosuresVsSubscripts/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Custom bindings in SwiftUI: closures vs subscripts</span></a></strong></p><p>Natalia compares two ways to build a custom binding in SwiftUI, using <code>get</code> and <code>set</code> closures vs a labeled subscript on the model. It&#8217;s cool to know that the closure version can cause extra view re-renders that SwiftUI can&#8217;t handle properly. Yeah, the same problem in code can be solved in more than one way, and usually the choice matters. In SwiftUI, picking the wrong approach can cost you performance...</p><p><strong><a href="https://tanaschita.com/swift-concurrency-sendable/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Understanding Sendable in Swift</span></a></strong></p><p><span>I like this </span>explanation about<span> </span><code>Sendable</code><span> in Swift concurrency. It covers everything you need: value types, classes, actors, and when to use </span><code>@unchecked Sendable</code><span>. Easy to follow, so I'd recommend it even if you think you already understand how Sendable works.</span></p><p><strong><a href="https://blog.jacobstechtavern.com/p/apple-photos-and-face-recognition"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Apple Photos and Face Recognition in 512-D Hyperspace</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;ddee41b8-1944-42ad-bc4a-5d42d8426aa4&quot;}" data-component-name="MentionToDOM"></span> breaks down how Apple Photos identifies people across your library. I like that this all happens locally, it&#8217;s a good reminder of what Apple&#8217;s hardware can pull off without touching a server. Jacob rebuilt the whole thing himself and put the sample project on GitHub, and I&#8217;d recommend digging into it, this is exciting to take a look at how this is working under the hood.</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://wesleydegroot.nl/blog/translation-framework-in-swift"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Translation framework in Swift</span></a></strong></p><p>As someone who speaks English as a second language, I really appreciate when apps build this in, since having a quick translation available right there is really handy</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;6e7195f3-55af-49b2-b4a6-9134609fff7f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">.translationPresentation(isPresented: $showTranslation, text: text) { translatedText in
    text = translatedText
}</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-eWKY0OnPByg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;eWKY0OnPByg&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/eWKY0OnPByg?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=eWKY0OnPByg"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Apple Lost the AI Race</span></a></strong></p><p>This is shot in a really fun format! Marques and MKBHD (lol) arguing both sides of the debate solo, and it&#8217;s put together well. I agree with the take that AI&#8217;s future is on-device, and on the question of whether an AI company builds their own hardware or Apple just makes their AI good enough, I lean toward the second option, since create something like Apple already has (hardware and infrastructure) is an incredibly hard challenge.</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://github.com/Livsy90/iOS-Performance-Agent-Skills"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">iOS-Performance-Agent-Skills</span></a></strong></p><p>Another day, another skill, and at this point I feel like we&#8217;re drowning in them &#128517; But this one is great, it covers launch performance, profiling, SwiftUI, concurrency, and runtime costs all in one bundle! We already talked about performance earlier in this issue, so if you want your coding agent thinking about it too, just add this skill.</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>47 new iOS positions this week  </strong><em>(+27% vs last week &#183; +52% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 28% / 72% / 0%</p></li><li><p>Most wanted skills: SwiftUI 38% &#183; UIKit 19% &#183; Combine 9% &#183; Core Data 6%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Software Engineer, iOS/Mobile - Electronic Flight Bag (EFB)</strong><span> at </span><strong>Beacon AI</strong><span> (San Carlos, CA) &#8212; SwiftUI, Swift Concurrency, async/await, Mapbox/MapKit on iPad EFB apps that process real-time aviation data (wind/weather/navigation) with offline-first architecture and external hardware integration</span> <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-mobile-electronic-flight-bag-efb-at-beacon-ai-4437474845"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">&#8594; Apply</span></a></strong></p><p><strong>Senior iOS Engineer, Media Foundations</strong><span> at </span><strong>Reddit, Inc.</strong><span> (United States, Remote) &#8212; Native iOS-only team using Swift, building the media infrastructure layer (video/audio playback, streaming) that serves Reddit's 126M+ daily actives</span> <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-media-foundations-at-reddit-inc-4436879719"><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;:753371}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Which model do you default to for daily coding?</p><p><strong>Top Answer:</strong> I mix models depending on task</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/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 #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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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></channel></rss>