<?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>Sun, 04 Oct 2026 22:09:09 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 #80]]></title><description><![CDATA[Apple's smart home lineup, iOS 27.0.1, Xcode 27.2 beta 2, AI and SwiftUI Previews, saving tokens, if let shorthand, iPhone Duo hinge trick, Xcode markdown editor, Explore SwiftUI]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-80</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-80</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 02 Oct 2026 12:31:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bjKA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_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 found that when working with AI, the most important factors are the amount of context and the ability to manage it. In this issue there is an article about using tokens efficiently, and it&#8217;s not only about the cost of your request. If you provide the AI with only the information it needs to carry out the task, everything works more clearly.</p><p>You should always think about the context and start a new session when carrying out a new task, and keep your skills and AGENTS.md files neat and well organised.</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_!bjKA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bjKA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bjKA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bjKA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bjKA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bjKA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc39ac98-06ba-4ea2-892e-e81e04d8cc91_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_!bjKA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bjKA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bjKA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bjKA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc39ac98-06ba-4ea2-892e-e81e04d8cc91_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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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/09/30/apple-home-products-coming-on-october-13/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Three New Apple Smart Home Products Coming on October 13</span></a></strong></p><p>Apple will show a home hub, a new HomePod mini, and a new Apple TV, all built around Siri AI.</p><p>I have a few HomePods and an Apple TV, and I love how well they fit into the Apple ecosystem. But if the AI features are limited to just Siri AI, I&#8217;m not sure it&#8217;s worth upgrading. I&#8217;d love to install AI apps on them, like Meta&#8217;s Muse, and turn that small box next to my TV into my personal assistant. But yeah, will see...</p><div><hr></div><p><strong><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Releases</span></strong></p><ul><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09282026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0.1</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09282026g"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27.2 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/letting-ai-see-swiftui/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Letting AI See SwiftUI: Xcode Preview MCP in Practice</span></a></strong></p><p>It&#8217;s really important to give AI context about the result of its work. For a mobile app, the result is how it looks, and the simplest way to show that is to give the agent access to Previews.</p><p>Xcode already lets agents render Previews through MCP, but the process still has a list of problems. Check out the article to see what exactly can go wrong and how to work around it.</p><p><strong><a href="https://www.avanderlee.com/ai-development/reduce-token-usage-claude-code-codex-cursor/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">How to reduce token usage in Claude Code, Codex, and Cursor</span></a></strong></p><p>Saving tokens isn&#8217;t only about spending less money. It&#8217;s also about how much information you keep in the context, and how much of it the agent needs to do its job. The more useful information gets into the context, the better the agent works.</p><p>That&#8217;s why it&#8217;s important to understand how to use tokens more efficiently. This article goes through the key points that matter for iOS developers.</p><p><strong><a href="https://www.sagarunagar.com/blog/swift-optional-binding-shorthand/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Swift&#8217;s New if let Syntax - Cleaner Optional Unwrapping</span></a></strong></p><p>I always follow how Apple updates Swift and simplifies its syntax, I really love it. I often share these updates as small comments during code review, it&#8217;s a nice way to share knowledge with the team. I like clean code, and Swift is a pretty clean language, so every bit of syntactic sugar is a pure pleasure.</p><p>I think most of you already know about <code>if let user</code>, but I still see the old <code>if let user = user</code> a lot in code reviews. So, just FYI &#128521;</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/AdjustingTheHingeAngleInTheIPhoneDuoSimulator/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Adjusting the hinge angle in the iPhone Duo simulator</span></a></strong></p><p>In Xcode 27.1, hold the Option (&#8997;) key while the iPhone Duo simulator is focused, and a hidden slider appears that lets you set any hinge angle</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DwPn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DwPn!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 424w, https://substackcdn.com/image/fetch/$s_!DwPn!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 848w, https://substackcdn.com/image/fetch/$s_!DwPn!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 1272w, https://substackcdn.com/image/fetch/$s_!DwPn!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DwPn!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif" width="677" height="425.30887096774194" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:779,&quot;width&quot;:1240,&quot;resizeWidth&quot;:677,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;iPhone Duo simulator in Xcode 27.1. Holding Option reveals a slider in the bottom toolbar. Dragging it adjusts the hinge angle, opening the simulated phone from a folded position to fully open as the app layout adapts. Text overlays explain the shortcut and indicate when Option is held.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="iPhone Duo simulator in Xcode 27.1. Holding Option reveals a slider in the bottom toolbar. Dragging it adjusts the hinge angle, opening the simulated phone from a folded position to fully open as the app layout adapts. Text overlays explain the shortcut and indicate when Option is held." title="iPhone Duo simulator in Xcode 27.1. Holding Option reveals a slider in the bottom toolbar. Dragging it adjusts the hinge angle, opening the simulated phone from a folded position to fully open as the app layout adapts. Text overlays explain the shortcut and indicate when Option is held." srcset="https://substackcdn.com/image/fetch/$s_!DwPn!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 424w, https://substackcdn.com/image/fetch/$s_!DwPn!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 848w, https://substackcdn.com/image/fetch/$s_!DwPn!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 1272w, https://substackcdn.com/image/fetch/$s_!DwPn!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb95e28f8-6e75-4564-8921-e051f40aeada_1240x779.gif 1456w" sizes="100vw" loading="lazy"></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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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></li></ul><div><hr></div><h2><strong><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Video</span></strong></h2><div id="youtube2-sp8jrI7jGME" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;sp8jrI7jGME&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/sp8jrI7jGME?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=sp8jrI7jGME"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Xcode 27 Now Has a Markdown Editor</span></a></strong></p><p>It&#8217;s great that Xcode now has a formatting bar with headings, strikethrough, links, lists, and more. In the AI era, we work with markdown files a lot, and I always had the question of which tool is the best for it. Now that Xcode fully supports markdown, I can keep working in my main tool without switching to anything else.</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://exploreswiftui.com/"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Explore SwiftUI Visually</span></a></strong></p><p>I came across this service by accident recently, and I find it really cool and useful. They added a new tab just for iPhone Duo, where you can play with SwiftUI layouts right on the page. It supports different orientations and hinge states: closed, partially open, and fully open.</p><p>I recommend everyone check it out and play with it, it might be useful for your needs too.</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>81 new iOS positions this week  </strong><em>(-12% vs last week &#183; -46% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 51% / 49% / 0%</p></li><li><p>Most wanted skills: SwiftUI 53% &#183; MVVM 36% &#183; UIKit 35% &#183; Combine 31%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Senior iOS Engineer</strong> at <strong>Citizen</strong> (New York, NY) &#8212; Owns the native iOS app behind the #1 safety app in the U.S., built on a TCA codebase with Swift Package Manager and Fastlane, streaming live incident video and alerts to millions of users in real time &#8594; <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-at-citizen-4470022951"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>iOS Engineer</strong> at <strong>Atlys</strong> (United States) &#8212; Builds Atlys&#8217;s AI-first visa app in Swift, SwiftUI, TCA and Swift Concurrency, bringing AI-powered flows like smart document scanning into the visa journey for 1M+ travelers across 127 countries &#8594; <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-at-atlys-4474175108"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Staff iOS Engineer</strong> at <strong>FOX Direct to Consumer</strong> (New York, NY) &#8212; Sets iOS and tvOS architecture across FOX&#8217;s streaming brands (FOX News, FOX Sports, Tubi), combining SwiftUI, MVVM, Swift Concurrency and XCTest while using agentic workflows to ship at speed for an audience of millions &#8594; <strong><a href="https://www.linkedin.com/jobs/view/staff-ios-engineer-at-fox-direct-to-consumer-4465375929"><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;:1384358}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Have you run your app on the iPhone Duo Simulator?</p><p><strong>Top Answer:</strong> No, not yet</p></blockquote><div><hr></div><h2><strong><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">Upcoming Conferences</span></strong></h2><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><p><strong>September 2027</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-dev-uk-ld-4nafw"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">6&#8211;9</span></a> &#8212; <strong><a href="https://www.iosdevuk.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">iOSDevUK</span></a></strong> <em>(Aberystwyth &#127468;&#127463;)</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 #79]]></title><description><![CDATA[iPhone Duo with Xcode 27.1, new AI models, when to use ArrangementView, how State works in SwiftUI, parameterized tests, backporting new APIs, a Gemini features and SwiftFairy for reviewing agent code]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-79</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-79</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 25 Sep 2026 12:31:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ti0Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>iPhone Duo is now available to everyone with Xcode, because you can run the simulator, fold the device, and play with it. </p><p>People online already show interesting ways to use the features of a foldable phone, and Apple published new guidelines and announced workshops, so it looks like Apple is fully in on the foldable story. The simulator is not a real device, and we are still waiting to test our apps on one in person, but I am sure you can find most of the bugs by launching your app in the iPhone Duo Simulator. </p><p>This issue covers the new APIs and tools you should know if you want to support iPhone Duo. And based on last week's poll, most of you plan to support it, which makes me happy &#128522;</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_!ti0Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ti0Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ti0Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ti0Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ti0Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ti0Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg" width="1813" height="908" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:908,&quot;width&quot;:1813,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:227092,&quot;alt&quot;:&quot;Front and rear views of iPhone Duo shown side by side in Star White and Night Sky, displaying desert landscape wallpapers in both light and dark mode.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Front and rear views of iPhone Duo shown side by side in Star White and Night Sky, displaying desert landscape wallpapers in both light and dark mode." title="Front and rear views of iPhone Duo shown side by side in Star White and Night Sky, displaying desert landscape wallpapers in both light and dark mode." srcset="https://substackcdn.com/image/fetch/$s_!ti0Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ti0Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ti0Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ti0Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1230c2b4-8fcd-47f7-9733-c533156bb85e_1813x908.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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=nyuppv9r"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Build for iPhone Duo with new resources</span></a></strong></p><p>Apple released Xcode 27.1 beta with iPhone Duo support &#127881;</p><p>Take a look at <a href="https://developer.apple.com/design/resources/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Apple Design Resources</span>,</a> here you can find Figma and Sketch design kits. There are also <a href="https://developer.apple.com/events/view/upcoming-events?search=workshop"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">workshops</span></a> about how to build apps for all screen sizes. Btw, don&#8217;t forget to update to the new beta to see how your app behaves before the device ships.</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=09212026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.2 beta 2</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09182026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27.1 beta</span></a></strong></p></li><li><p><strong><a href="https://www.anthropic.com/claude-opus-5-5"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Claude Opus 5.5</span></a></strong></p></li><li><p><strong><a href="https://openai.com/index/introducing-gpt-6-sol-and-luna/"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">GPT&#8209;6 Sol and Luna</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.linkedin.com/pulse/copy-swift-practice-stop-designing-screens-bruno-valente-pimentel--fctme/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Stop Designing for Screens</span></a></strong></p><p>As I said before, if you build for iPad, iPhone Duo support comes for free, and it works the other way too. The article explains why and how you should design for flexible, adaptive space instead of one specific device. Great read.</p><p><strong><a href="https://www.avanderlee.com/swiftui/iphone-duo-simulator/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">iPhone Duo Simulator: Testing and optimizing your SwiftUI app</span></a></strong></p><p>Since you now have the complete set of tools for the iPhone Duo, you should begin preparing your app for it. Here you can see the problems you might encounter, how to test your app in different orientations, and which new SwiftUI APIs will assist you in adapting. This isn't a physical device yet, but you can see how your app performs&#8230;</p><p><strong><a href="https://fatbobman.com/en/posts/arrangementview-think-before-you-arrange/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">ArrangementView: Think Before You Arrange</span></a></strong></p><p>The first thing I think of whenever a new API is released is &#8220;Cool, let&#8217;s use it!&#8221; However, new APIs have their own pros and cons, and sometimes the earlier method is simpler, clearer, and has been proven over time. We have a similar situation with <code>ArrangementView</code>. In this article, you can find out where we need to use the new UI component and how to choose between <code>ArrangementView</code> and a simple <code>HStack</code> or <code>ZStack</code>.</p><p><strong><a href="https://www.swiftyplace.com/blog/swiftui-state-property-wrapper"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">What is State actually doing in SwiftUI</span></a></strong></p><p>Many people think the way state works in SwiftUI is magic. But special rules and systems work in the background. In this article, you&#8217;ll learn how one of these mechanisms works and what happens when you use <code>State</code>.</p><p><strong><a href="https://tanaschita.com/testing-swift-testing-parameterized-tests/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Parameterized tests and test organization with Swift Testing</span></a></strong></p><p>A while ago, my team began switching to Swift Testing, and one of my favorite features of the framework is its support for parameterized tests. Instead of writing four separate tests, you can write one test and pass the inputs as arguments. So, a single reusable test can handle all cases. Cool, isn&#8217;t it? The article explains how to set this up and also how to organize a growing suite using tags and nested suites.</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://swiftwithmajid.com/2026/09/22/backporting-swiftui-apis/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Backporting SwiftUI APIs</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;b6ed8ff5-a00b-4b47-9403-2b896da1f63d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// The annotation makes the compiler flag this wrapper once your target reaches the new API
@available(iOS, introduced: 26.0, deprecated: 27.1, message: "Remove the ported version")
extension View {
    @ViewBuilder func portedToolbarVerticalBehavior(disabled: Bool) -&gt; some View {
        if #available(iOS 27.1, *) {
            toolbarVerticalBehavior(disabled ? .disabled : .automatic) // new API on 27.1+
        } else {
            self // nothing to do on older versions
        }
    }
}</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-5yKqzEn_SfU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;5yKqzEn_SfU&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/5yKqzEn_SfU?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=5yKqzEn_SfU"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Fully Working SwiftUI Voice/Vision App Using Gemini</span></a></strong></p><p>Here is a walkthrough of how to create a real-time voice and vision assistant for iOS, something similar to Gemini Live. I have used Gemini in my own side project, and it still amazes me how simple it is to make any app smarter through a basic AI integration.</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://tools.nilcoalescing.com/swiftfairy"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">SwiftFairy</span></a></strong></p><p>This tool checks the Swift and SwiftUI code produced by your AI agent. It provides findings with explanations and code examples. All advices stay outside the agent&#8217;s context, so the agent uses fewer tokens for general background information.</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>92 new iOS positions this week  </strong><em>(+3% vs last week &#183; +96% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 48% / 48% / 4%</p></li><li><p>Most wanted skills: SwiftUI 61% &#183; UIKit 37% &#183; Combine 27% &#183; MVVM 24%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Senior Engineer, iOS</strong> at <strong>Fanatics</strong> (New York, NY) &#8212; Builds Fanatics Live&#8217;s real-time card breaks and auctions in Swift, SwiftUI, and Swift Concurrency using a TCA codebase &#8594; <strong><a href="https://www.linkedin.com/jobs/view/senior-engineer-ios-at-fanatics-4469543561"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Senior iOS Engineer, Media Experience</strong> at <strong>Reddit</strong> (San Francisco, CA) &#8212; Owns the native video architecture behind Reddit&#8217;s Media Experience team, using AVFoundation to push playback quality and live-streaming engagement for a platform with 130M+ daily active visitors &#8594; <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-engineer-media-experience-at-reddit-inc-4468839013"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Staff UX Engineer, iOS Development, Search</strong> at <strong>Google</strong> (Los Angeles, CA) &#8212; Prototypes SwiftUI-driven interfaces for Search on iOS, sitting at the intersection of UX design and engineering with 8+ years of front-end/UX engineering experience expected, including 3+ years in SwiftUI &#8594; <strong><a href="https://www.linkedin.com/jobs/view/staff-ux-engineer-ios-development-search-at-google-4469680205"><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;:1322234}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Are you planning to fully support iPhone Duo in your app?</p><p><strong>Top Answer:</strong> Yes</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/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><p><strong>September 2027</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-dev-uk-ld-4nafw"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">6&#8211;9</span></a> &#8212; <strong><a href="https://www.iosdevuk.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">iOSDevUK</span></a></strong> <em>(Aberystwyth &#127468;&#127463;)</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 #78]]></title><description><![CDATA[iPhone 18 Pro's slow start, new Swift and Xcode releases, Xcode's JSON project format, adapting for iPhone Duo, Swift Testing migration, SwiftUI performance and previews, CrashReportExtension overview]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-78</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-78</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 18 Sep 2026 12:30:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VcPF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>New versions of iOS and Xcode dropped this week, so I hope your apps are ready &#128521; </p><p>This is also the week the first iPhone 18 Pro buyers start getting their preordered devices. I&#8217;m not one of them, though I am picking up a new Apple Watch, since my old one died a couple of weeks before the keynote. Coincidence? I doubt it &#128517;</p><p>I&#8217;m skipping the 18 Pro because I want the flagship, and this year the &#8220;Pro&#8221; label doesn&#8217;t mean that anymore. Yeah, I&#8217;m waiting for the Duo instead, and I&#8217;ve seen a lot of discussions online about its pricing, though, and it is on another level compared to previous iPhones, especially outside the US where it can cost even more...</p><p>That makes engineers and product people wonder whether it&#8217;s worth the effort to fully support it &#129300;</p><p>Nobody used to think seriously about the iPad, and now the concern is that nobody will bother with the Duo either, since the high price will keep the user base small. I don&#8217;t think this is just a repeat of that story. This is a new form factor, and now that Apple has fully committed to it, I think it&#8217;s going to become the new standard. </p><p>Your app gets an opportunity to use everything that this device offers. There are plenty of tutorials on how to jump into the Duo&#8217;s world, and we&#8217;ll go through them in this issue. Being the first one means an opportunity for you to get featured by Apple, which brings a nice wave of extra attention for your app right at launch. And don&#8217;t forget, every feature you build for the Duo also improves your iPad UI/UX along the way, completely for free.</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_!VcPF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VcPF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VcPF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VcPF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VcPF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VcPF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_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_!VcPF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!VcPF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!VcPF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_1600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!VcPF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F58a8dac6-6c74-4c3e-b0c5-05b5ce2e3f0f_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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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/09/15/iphone-18-pro-orders-muted-start/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">iPhone 18 Pro Pre-Orders Off to a Muted Start, Analyst Says</span></a></strong></p><p>Today is the day! If you preordered an iPhone 18 Pro, you should be unboxing it soon &#127881; But there is a problem here - pre-order numbers are not so strong... And honestly, it doesn&#8217;t surprise me. The improvement on last year&#8217;s Pro is quite slight, though the price has increased and for people who live outside the US that rise in price can have a much greater impact. Also, although the new model has the &#8220;Pro&#8221; name attached to it, it is no longer the top model. Many people are still waiting for the Duo.</p><p>I believe some of us are just waiting for the &#8220;XX&#8221; iPhone instead. Yeah, I think Apple could skip iPhone 19, the same way they skipped straight from 8 to X.</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://www.swift.org/blog/swift-6.4-released/"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Swift 6.4</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09142026h"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09162026g"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27.2 beta</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09142026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09162026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.2 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://fatbobman.com/en/posts/from-pbxproj-to-xcproj/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">From pbxproj to xcproj: Xcode Project Configuration Gets a JSON Format</span></a></strong></p><p>Apple released Xcode 27.2 with a new project format. <code>project.pbxproj</code> <a href="https://developer.apple.com/documentation/xcode/updating-your-xcode-project-configuration-file-format#Change-the-project-configuration-file-format-to-JSON"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">has a JSON replacement</span></a>, and I bet you remember your merge conflicts because of that thirty-year-old serialization format &#128517; </p><p>The clean structure is easier for us and for AI agents too. That&#8217;s why Apple tagged this as a Coding Intelligence feature. Agents can read and modify project structure faster, and this is now the default option for new projects.</p><p>I use Tuist and Bazel, and it&#8217;s great to see that Apple pushes native solutions in the same direction third-party tools have been solving for years.</p><p><strong><a href="https://sarunw.com/posts/adapting-your-app-for-iphone-duo/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Adapting your app for iPhone Duo</span></a></strong></p><p>Sarunw published a four-part series about how to adapt your app for the iPhone Duo, based on Apple&#8217;s Design for iPhone Duo talk. If you&#8217;re a reading person, this is a great source with plenty of code examples, screenshots, and explanations. Start with <a href="https://sarunw.com/posts/adapting-your-app-for-iphone-duo/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">part one</span></a> and work through the series.</p><p><strong><a href="https://www.kodeco.com/53560697-moving-from-xctest-to-swift-testing/page/4"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Moving from XCTest to Swift Testing</span></a></strong></p><p>I&#8217;ve covered Swift Testing before, but I have to cover this topic again because it&#8217;s from Kodeco. I used Kodeco&#8217;s (Ray Wenderlich) books and approaches to start my career as an iOS engineer. They break down complex topics into simple steps and use real test projects instead of raw theory. This tutorial walks you through the migration process from XCTest to Swift Testing end-to-end.</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/DiagnosingForEachPerformanceIssuesInSwiftUILazyContainers/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Diagnosing ForEach performance issues in SwiftUI lazy containers</span></a></strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!liwq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!liwq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 424w, https://substackcdn.com/image/fetch/$s_!liwq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 848w, https://substackcdn.com/image/fetch/$s_!liwq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 1272w, https://substackcdn.com/image/fetch/$s_!liwq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!liwq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png" width="2090" height="1143" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1143,&quot;width&quot;:2090,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:405789,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&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_!liwq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 424w, https://substackcdn.com/image/fetch/$s_!liwq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 848w, https://substackcdn.com/image/fetch/$s_!liwq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 1272w, https://substackcdn.com/image/fetch/$s_!liwq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70a26f46-e4be-4a3d-a434-ebc6558ff184_2090x1143.png 1456w" sizes="100vw" loading="lazy"></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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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></li><li><p><strong><a href="https://livsycode.com/swiftui/reusable-swiftui-previews-with-previewmodifier/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Reusable SwiftUI Previews with PreviewModifier</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-5IkUB5IAeQQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;5IkUB5IAeQQ&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/5IkUB5IAeQQ?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=5IkUB5IAeQQ"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">5 Reasons You Need to Immediately Support iPhone Duo</span></a></strong></p><p>I agree with the author here. Get in early on iPhone Duo support. There is a hidden bonus: you&#8217;ll get a great iPad experience for free! As someone who&#8217;s getting the Duo myself, I want to see great apps from the engineers who read this newsletter &#128521;</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://antongubarenko.substack.com/p/ios-27-crashreportextension-framework"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">iOS 27: CrashReportExtension Framework</span></a></strong></p><p><span data-color="#741b47" style="color: rgb(116, 27, 71);"><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;7857a560-306a-41fc-8624-49e44931ba37&quot;}" data-component-name="MentionToDOM"></span></span> dives into the new CrashReportExtension Framework that allows crash inspection outside the crashed process, in a system-managed extension with read-only access to the failed app.</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>89 new iOS positions this week  </strong><em>(+178% vs last week &#183; +29% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 42% / 50% / 8%</p></li><li><p>Most wanted skills: SwiftUI 58% &#183; UIKit 46% &#183; MVVM 18% &#183; Combine 15%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Senior Staff iOS Engineer</strong> at <strong>Cash App (Block)</strong> (San Francisco Bay Area) &#8212; Sets direction for iOS architecture, performance, reliability, and security using Swift, SwiftUI, Combine, and Bazel; builds the native foundations behind Cash App&#8217;s fintech ecosystem for 50M+ MAU &#8594; <strong><a href="https://www.linkedin.com/jobs/view/senior-staff-ios-engineer-at-cash-app-4467414143"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Principal Design Engineer, Mobile (iOS)</strong> at <strong>Salesforce (Slack)</strong> (New York, NY) &#8212; Prototypes directly in Swift, an SwiftUI, exploring WidgetKit, App Intents, Live Activities, and Shortcuts to push Slack&#8217;s iOS design forward; base salary $197,300-$344,700 &#8594; <strong><a href="https://www.linkedin.com/jobs/view/principal-design-engineer-mobile-ios-at-salesforce-4467240669"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Senior iOS Developer</strong> at <strong>TEGNA</strong> (Knoxville, TN) &#8212; Builds TEGNA&#8217;s native news app in Swift, SwiftUI, and Swift Concurrency within an MVVM + Coordinator architecture, tackling video playback and rendering performance across a single codebase powering 50+ local station apps &#8594; <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-developer-at-tegna-4468688802"><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;:1258083}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Will you buy an iPhone Duo?</p><p><strong>Top Answer:</strong> Nah, skipping this one</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/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><p><strong>September 2027</strong></p><ul><li><p><a href="https://dev.events/ical/i-os-dev-uk-ld-4nafw"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">6&#8211;9</span></a> &#8212; <strong><a href="https://www.iosdevuk.com/"><span data-color="#dd7e6b" style="color: rgb(221, 126, 107);">iOSDevUK</span></a></strong> <em>(Aberystwyth &#127468;&#127463;)</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 #77]]></title><description><![CDATA[iPhone Duo tech talks, iOS 27 App Store submissions open, conditional breakpoints, existential any in Swift, Foundation Models with images, iOS 27 launch screens, and an app size tool]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-77</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-77</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 11 Sep 2026 12:31:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VaJG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>The big thing this week is obviously the new iPhone release! The most interesting part for iOS engineers is the layout change. We used to think about one screen, and now we have to think about different states: compact, full-size, or half-folded. This adds an additional complexity, but if your app is built on native SwiftUI or UIKit components instead of custom ones, I think the migration will be simple.</p><p>The other question is the price. This is the most expensive iPhone ever, so how many customers will end up with one? Right now, most apps support iPhone and iPad, but the iPad share is so low that most of us don&#8217;t put much effort into the iPad version when we design a feature. Can we treat iPhone Duo the same way? I don&#8217;t think so... This is a brand new form factor, and I expect most people will upgrade. So we won&#8217;t just need to support this new iPhone, we&#8217;ll also have to go back and think about iPad again, because Duo unfolded is basically an iPad mini that we used to ignore because barely anyone used one, and now a much bigger part of our users will be walking around with exactly that screen in their pocket.</p><p>If you already supported iPad and designed with it in mind, you&#8217;re in good shape here too. If your product was built only around the iPhone, there&#8217;s a lot of hard work ahead &#128556; </p><p>The good news is Apple already released extra guides for developers, and you can read all about it in this issue.</p><p>Also, this week Apple released the Xcode 27 RC, which unlocks submitting apps built on iOS 27 &#127881;</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_!VaJG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VaJG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png 424w, https://substackcdn.com/image/fetch/$s_!VaJG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png 848w, https://substackcdn.com/image/fetch/$s_!VaJG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png 1272w, https://substackcdn.com/image/fetch/$s_!VaJG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VaJG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png" width="1456" height="852" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:852,&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_!VaJG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png 424w, https://substackcdn.com/image/fetch/$s_!VaJG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png 848w, https://substackcdn.com/image/fetch/$s_!VaJG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.png 1272w, https://substackcdn.com/image/fetch/$s_!VaJG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6076da13-7f9b-438d-947c-089ef5b5e7f1_2304x1348.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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/iphone-duo/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Get ready for iPhone Duo</span></a></strong></p><p>Apple opened a hub for iPhone Duo development! Here you can find tech talks on design, adaptive layouts, multiple scenes, camera experiences, and more.</p><p>I hope you already use SwiftUI/native components and avoid custom UI. In this case, the transition will look like magic to you.  Otherwise, hold on tight &#128517;</p><p><strong><a href="https://developer.apple.com/news/?id=k1mtkt1k"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">App Store submissions now open for the latest OS releases</span></a></strong></p><p>Xcode 27 RC is available, so you can start submitting apps built on the latest SDKs to the App Store right now!</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=09092026h"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27 RC</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09092026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 RC</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=09082026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 26.6.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://sarunw.com/posts/iphone-duo-tech-talks/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">A guide to Apple&#8217;s iPhone Duo Tech Talks</span></a></strong></p><p>A walkthrough of all iPhone Duo tech talks with a recommended watch order and a summary. Check this out before watching all of them &#128521;</p><p><strong><a href="https://www.sagarunagar.com/blog/xcode-conditional-breakpoints/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Conditional Breakpoints in Xcode</span></a></strong></p><p>A regular breakpoint stops on every call, even when you only care about one specific case. So let&#8217;s learn how to add a conditional breakpoint so Xcode pauses only when your expression is true. Btw, you can attach actions like a sound or a log to the breakpoint.</p><p><strong><a href="https://sarunw.com/posts/existential-any-in-swift/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Existential any in Swift, and when it becomes required</span></a></strong></p><p><code>any Shape</code> and plain <code>Shape</code> do the same thing, they both cost you performance, but <code>any Shape</code> tells you it&#8217;s happening. Read more to understand the difference.</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://azamsharp.com/2026/09/06/working-with-images-using-foundation-models.html"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Working with Images Using Foundation Models</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;2c6191b4-a9ae-45a9-97b3-3c6911b2bbab&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">@Generable
struct Plant {
    let name: String
    let description: String
}

let attachment = Attachment(uiImage) // wrap the UIImage
let response = try await session.respond(generating: Plant.self) {
    "What plant is this?"
    attachment // image and prompt go together
}
// follow-up questions reuse the same session, no need to re-attach the image</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-hD224of2J78" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;hD224of2J78&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/hD224of2J78?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=hD224of2J78"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">iOS 27 Launch Screens Done Right: Simple to Fully Custom</span></a></strong></p><p>Two ways to build a launch screen in Xcode, with light/dark assets and constraints for iPhone/iPad. The number of clicks and simulator resets just to test something Apple now mandates says a lot... While Apple pushes us to use SwiftUI, you still can&#8217;t set up a launch screen properly with it &#128556;</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://blog.jacobstechtavern.com/p/app-size-101"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">OpenBundle</span></a></strong></p><p>A free and open-source tool that runs locally and analyzes your .ipa to show where the size comes from. I see popular apps ship at hundreds of megabytes. I&#8217;ve done this kind of size audit before, it is great to have something like this on hand instead of digging through the bundle 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>32 new iOS positions this week  </strong><em>(-79% vs last week &#183; -52% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 6% / 94% / 0%</p></li><li><p>Most wanted skills: SwiftUI 31% &#183; UIKit 19% &#183; Core Data 3% &#183; Combine 3%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Senior iOS Developer</strong> at <strong>Syndesus, Inc.</strong> (San Francisco Bay Area, remote-first) &#8212; Swift, SwiftUI, and UIKit stack on an AI-native B2C platform; owns major parts of the iOS experience end to end &#8594; <strong><a href="https://www.linkedin.com/jobs/view/senior-ios-developer-remote-in-san-francisco-at-syndesus-inc-4465324988"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>iOS Developer</strong> at <strong>Adobe</strong> (San Jose, CA) &#8212; Swift, SwiftUI across modern iOS frameworks, building Adobe Fresco, the drawing app redefining mobile art tools &#8594; <strong><a href="https://www.linkedin.com/jobs/view/ios-developer-at-adobe-4453796395"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Nuuly iOS Engineer</strong> at <strong>Nuuly</strong> (Philadelphia, PA) &#8212; Swift, SwiftUI, and UIKit on a small collaborative team owning the full lifecycle of URBN&#8217;s rental-fashion mobile experience &#8594; <strong><a href="https://www.linkedin.com/jobs/view/nuuly-ios-engineer-at-nuuly-4453226319"><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;:1200259}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Do you see yourself building for both iOS and Android?</p><p><strong>Top Answer:</strong> Curious, might try 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>September</strong></p><ul><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 #76]]></title><description><![CDATA[Goodbye, Tim Cook, New iOS beta, Claude and GPT models, Porting an iOS app to Android, MVVM without overengineering, SwiftUI data dependencies, layout without UIScreen.main, and SF Symbols superpowers]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-76</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-76</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 04 Sep 2026 12:31:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!94gf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.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 noticing how the mood around cross-platform development changes. I was never a fan of cross-platform, but I understood the business value, since you write the code once and run it on two platforms. Now with AI, we can write the code twice, and it still takes LESS time than writing it once the old way. Moreover, once you build a new feature on iOS, porting it to Android is quite simple, and in this issue you will find a great article about that, so take a look &#128521; </p><p>A couple of months ago, I started working on both iOS and Android projects, and I can say from experience that it is cool. I even started a new initiative on our team called Platform Union, where iOS and Android engineers come together to share knowledge, look at each other&#8217;s tools, codebases, and approaches to unblock themselves and start contributing to the other platform. </p><p>And it is not only about writing code, there are also a lot of other useful cases here: you can help each other with testing and debugging, and you start thinking in terms of mobile as a whole instead of just an iOS or an Android platform.</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_!94gf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!94gf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!94gf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!94gf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!94gf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!94gf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cea25a36-86e9-4104-8c49-601f04f025eb_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_!94gf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg 424w, https://substackcdn.com/image/fetch/$s_!94gf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg 848w, https://substackcdn.com/image/fetch/$s_!94gf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_1600x800.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!94gf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcea25a36-86e9-4104-8c49-601f04f025eb_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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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/08/31/read-tim-cooks-full-memo-to-apple-employees-on-his-last-day-as-ceo/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Tim Cook&#8217;s full memo to Apple employees on his last day as CEO</span></a></strong></p><p>Tim Cook wrote a farewell memo to Apple employees on his last day as CEO. I remember when Cook became CEO after Steve Jobs, and it was clear that Apple turned into a company that focused on making money. Apple achieved huge success under Cook, but a part of me still misses the new, innovative products Apple used to ship regularly. Ternus comes from an engineering background; I hope for more innovation-driven solutions.</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=08312026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 beta 8</span></a></strong></p></li><li><p><strong><a href="https://www.anthropic.com/claude-fable-and-mythos-5-1"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Claude: Fable 5.1 and Mythos 5.1</span></a></strong></p></li><li><p><strong><a href="https://openai.com/index/gpt-6-astra/"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">GPT 6 Astra</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://medium.com/@Sergey.Zhuravel/how-we-built-an-android-app-in-one-month-from-an-existing-ios-project-using-claude-code-f17332e349a6"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">How We Built an Android App in One Month from an Existing iOS Project Using Claude Code</span></a></strong></p><p>Sergey described how his team ported an iOS app to Android in a month using Claude Code. With AI, I now do both iOS and Android stories myself, and I think the mobile engineer role covering both platforms is becoming the new best practice. I like that UI stays separate on each platform instead of getting shared through something like Flutter or React Native. Cross-platform was great for writing the code once for both platforms, but now AI lets you write native code twice as fast as you used to write it once.</p><p><strong><a href="https://www.avanderlee.com/swiftui/mvvm-architectural-coding-pattern-to-structure-views/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">MVVM in SwiftUI: Using view models without overengineering</span></a></strong></p><p>I&#8217;ve used a Redux-like architecture for the last three years and LOVE IT, but MVVM is my pick for most projects. Every other pattern comes with a learning curve and boilerplate to set up, and MVVM lets you just sit down and write code without any overhead. Let&#8217;s read this one to better understand when a SwiftUI view needs a view model and when it doesn&#8217;t.</p><p><strong><a href="https://nilcoalescing.com/blog/SwiftUIDataDependenciesAndTheirEffectOnViewUpdates/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">SwiftUI data dependencies and their effect on view updates</span></a></strong></p><p>An excellent explanation of the main wrappers to handle data in SwiftUI. It is important to understand the differences between them to update your views appropriately.</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/uikit/effective-geometry-layout-without-uiscreen-main/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Effective Geometry: Layout Without UIScreen.main</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;2c6191b4-a9ae-45a9-97b3-3c6911b2bbab&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// Use scene geometry instead of UIScreen.main
let bounds = windowScene.effectiveGeometry.coordinateSpace.bounds</code></pre></div></li><li><p><strong><a href="https://tanaschita.com/swiftui-toolbar-visibility-overflow/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Managing toolbar visibility and overflow in SwiftUI</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;b848f573-a04c-46e3-9810-e7c7359483ef&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">// Push less important items into the overflow menu
.toolbar {
    ToolbarItemGroup { /* Undo, Redo */ }
        .visibilityPriority(.high)

    ToolbarOverflowMenu {
        Button("Delete", role: .destructive, action: delete)
    }
}</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-IoyROmCkFcQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;IoyROmCkFcQ&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/IoyROmCkFcQ?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=IoyROmCkFcQ"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">These Apple Icons Can Do WHAT?!</span></a></strong></p><p>Sean explains what SF Symbols can do beyond being a basic icon set, and shows how to prompt an AI agent with the right terminology to get the best results. This is a great tool when you&#8217;re building a prototype or your own app and want interesting icons and animations without extra effort. Apple designers made these symbols, so they blend into any iOS app without looking out of place.</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://proxyman.com/"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Proxyman</span></a></strong></p><p>Proxyman replaced Charles as my preferred tool for inspecting HTTP traffic on macOS. It has a native app and an incredible UI/UX. I wish Xcode had a built-in equivalent for this kind of debugging, but it is what it is...</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>150 new iOS positions this week  </strong><em>(+219% vs last week &#183; +200% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 42% / 56% / 2%</p></li><li><p>Most wanted skills: Most wanted skills: SwiftUI 59% &#183; UIKit 37% &#183; MVVM 31% &#183; Combine 27%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>Staff Software Engineer, iOS</strong> at <strong>PayPal (Venmo)</strong> (Austin, TX) &#8212; Strong Swift and multi-threaded/async-focused role consuming GraphQL and REST APIs with MVC/MVVM patterns, setting technical direction for Venmo&#8217;s iOS app; base pay $160,500&#8211;$238,700 &#8594; <strong><a href="https://www.linkedin.com/jobs/view/staff-software-engineer-ios-at-paypal-4462741614"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Software Engineer III - iOS</strong> at <strong>JPMorganChase</strong> (New York, NY) &#8212; Ships production Swift code with XCTest/XCUITest coverage and enterprise AI-assisted tooling for the bank&#8217;s Business Access &amp; Tools platform; $137,750&#8211;$185,000 &#8594; <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-iii-ios-at-jpmorganchase-4460806319"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Software Engineer, iOS/Mobile &#8212; Electronic Flight Bag (EFB)</strong> at <strong>Beacon AI</strong> (San Carlos, CA) &#8212; Builds Swift/SwiftUI/UIKit iPad apps rendering real-time wind and weather data with zero lag that must stay fully operational offline &#8594; <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-mobile-electronic-flight-bag-efb-at-beacon-ai-4460199548"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><div><hr></div><div class="poll-embed" data-attrs="{&quot;id&quot;:1143537}" data-component-name="PollToDOM"></div><h2><strong><span data-color="#3d85c6" style="color: rgb(61, 133, 198);">Weekly Poll</span></strong></h2><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>How do you feel about the foldable iPhone?</p><p><strong>Top Answer:</strong> Curious but not sold yet</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 #75]]></title><description><![CDATA[Apple's event, a new domain for SIWA, Embedded Swift, isolating geometry for smooth animations, the physics behind build systems, how Claude recovered deleted work, and item-based alerts in SwiftUI]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-75</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-75</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 28 Aug 2026 12:01:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wxrm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>Apple announced the date for their event, and I am beyond excited! I used to buy every single S version of the iPhone, and every time it felt like I was holding a completely new device. The peak of that feeling for me was the upgrade to the iPhone X.</p><p>When the iPhone X came out, it was a device on a completely different level, we had Face ID for the first time, we got surgical-grade stainless steel, there were great cameras, an OLED display, etc.</p><p>After that, I stopped seeing that same leap, it was not the same feeling I had with the X. I entered a competition for the best pet project in my country, and I won, and the prize was an iPhone 12 Pro. That was great, I got a new iPhone, but this time I felt no new emotions with it. I did not notice any real difference between the iPhone X and the iPhone 12 Pro. That was the first time I thought that Apple&#8217;s magic was gone&#8230;</p><p>And it kept going that way, the iPhone 13-17 came out, and none of them added anything that really pulled me in, so yes, I am still sitting here with my iPhone 12 Pro &#128556; And that is awful, because every year I really want to upgrade, I wait for the new iPhone, and I end up disappointed because I am waiting for something new and they just give me a new camera! Sure, the newer iPhones added some AI-related features, but let us be honest, those features are pretty mediocre and don&#8217;t change your user experience in any meaningful way.</p><p>Now, when the new foldable iPhone comes out this year, that will finally be the year I happily replace my old iPhone 12 Pro. I know it will be expensive, because even if you look at the foldable Samsung phones, they are also very expensive, nowhere close to regular non-foldable devices. But you know what, I just want to feel that Apple magic again and finally hold it in my hands, to feel what I felt many years ago when I bought the iPhone X. To show you how serious my intentions are, I recently even considered buying that Samsung foldable, because I want a new device that badly... But I keep believing in Apple, and I hope that on September 9 they will show me my next iPhone, an iPhone I will happily put in my pocket, right after I pull all the money out of it to pay for it &#128517;</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_!wxrm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wxrm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wxrm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wxrm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wxrm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wxrm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81b47ec8-e8db-4fa1-b626-c95f6b198f63_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_!wxrm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wxrm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wxrm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_2048x1152.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wxrm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81b47ec8-e8db-4fa1-b626-c95f6b198f63_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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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=s6spdug0"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Apple Event Announced for September 9: Surprise and Shine</span></a></strong></p><p>Apple confirmed the date for its fall event, I expect to see a new iPhone 18 and the first foldable iPhone! Prices will climb again due to ongoing memory shortages. This time I want a surprise, guys. Apple even put it right in the slogan - &#8220;Surprise and Shine.&#8221; I hope they do not let me down...</p><p><strong><a href="https://developer.apple.com/news/?id=1ptvdtcm"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">New domain for Sign in with Apple</span></a></strong></p><p>Apple issues private relay addresses on <code>private.icloud.com</code> instead of <code>privaterelay.appleid.com</code>. Old addresses keep forwarding mail without any changes. Don&#8217;t forget to allowlist the new domain.</p><p><strong><a href="https://www.swift.org/blog/embedded-swift-improvements-coming-in-swift-6.4/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Embedded Swift Improvements Coming in Swift 6.4</span></a></strong></p><p>Swift 6.4 closes more gaps between Embedded Swift and the full language. I have not worked with Embedded Swift myself yet, but I am always happy to see any updates to what it can do.</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=08242026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 beta 7</span></a></strong></p></li><li><p><strong><a href="https://developer.apple.com/news/releases/?id=08102026g"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">Xcode 27 beta 6</span></a></strong></p></li><li><p><strong><a href="https://www.apple.com/newsroom/2026/08/apple-introduces-m6-and-m5-ultra-for-a-big-leap-in-performance-and-ai-compute/"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">M6 and M5 Ultra</span></a></strong></p></li><li><p><strong><a href="https://www.apple.com/newsroom/2026/08/apple-unveils-a-more-powerful-mac-mini-featuring-the-all-new-m6-and-m5-pro/"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">New Mac mini</span></a></strong></p></li><li><p><strong><a href="https://www.apple.com/newsroom/2026/08/apple-introduces-new-mac-studio-with-m5-max-and-m5-ultra/"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">New Mac Studio</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.sagarunagar.com/blog/swiftui-geometrygroup/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">SwiftUI geometryGroup() - Isolate View Geometry for Smooth Animations</span></a></strong></p><p>Animations have many different edge cases. For instance, child views within an animated container may drift apart and animate independently instead of moving as a single unit. I had a similar bug before, and the <code>geometryGroup</code> function saved my day.</p><p><strong><a href="https://tuist.dev/blog/2026/08/25/the-physics-of-build-systems"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">The physics of build systems</span></a></strong></p><p>Tuist explained why more processor cores or a bigger cache do not automatically make your build faster. Take a look if you want to understand what limits build speed.</p><p><strong><a href="https://danielsaidi.com/blog/2026/08/27/some-things-are-never-truly-lost"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Some things are never truly lost - How git recovered two weeks of deleted work</span></a></strong></p><p>The author accidentally reset a branch with two weeks of work, and force pushed the mistake straight to GitHub. Claude Code saved the situation - found the last commit before the reset and restored the branch with a single command. An ideal example of AI powers, when you do not know something and want options for solving the problem, or even a command you have never used in your entire career. The article gives you a good understanding of how branch deletion works, recommend you to check this out.</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/swiftui-alert-identifiable-data/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Presenting alerts and confirmation dialogs from identifiable data in SwiftUI</span></a></strong></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">.alert("Delete task?", item: $taskToDelete) { task in
    Button("Delete", role: .destructive) { delete(task) }
} message: { task in
    Text("Are you sure you want to delete \(task.title)?")
}</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-lL6hQym_4Jg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;lL6hQym_4Jg&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/lL6hQym_4Jg?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=lL6hQym_4Jg"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Performance is more than just speed</span></a></strong></p><p>In this episode, the guys cover common mistakes when adopting Swift concurrency, plus a deep look at what happens when your app starts. Good watch if you want to understand what slows an app down and why.</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/XCTestHTMLReport/XCTestHTMLReport"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">XCTestHTMLReport</span></a></strong></p><p>The tool turns your raw xcresult bundles into an Xcode-like HTML report for unit and UI tests. You get a shareable report you can send to anyone on the team, or even feed to AI for analysis, without needing Xcode installed to open it. The visualization is great, and attachments such as screenshots and videos are included.</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>69 new iOS positions this week  </strong><em>(+0% vs last week &#183; +116% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 25% / 75% / 0%</p></li><li><p>Most wanted skills: SwiftUI 46% &#183; UIKit 29% &#183; MVVM 28% &#183; Combine 16%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>UX Engineer, iOS Development, Search</strong> at <strong>Google</strong> (San Francisco, CA) &#8212; Requires 3+ years of SwiftUI as part of an 8-year front-end/UX engineering bar; a rare hybrid role building both prototypes and production UI directly for Google Search&#8217;s iOS experience &#8594; <strong><a href="https://www.linkedin.com/jobs/view/ux-engineer-ios-development-search-at-google-4454778553"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>iOS Engineer II (AI Experiences)</strong> at <strong>WHOOP</strong> (Boston, MA) &#8212; Swift feature work wired directly into WHOOP Coach, the company&#8217;s generative-AI health coach, plus full release ownership (build variants, signing, Firebase, App Store submission) on a wearable-health app used by elite athletes and teams worldwide &#8594; <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-ii-ai-experiences-at-whoop-4444943999"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Software Engineer, iOS</strong> at <strong>Cape</strong> (New York, NY) &#8212; SwiftUI, Combine, and Swift Concurrency (async/await) building the iOS app for a from-scratch, privacy-first mobile carrier network that just closed its Series C &#8594; <strong><a href="https://www.linkedin.com/jobs/view/software-engineer-ios-at-cape-4317482419"><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;:1082930}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Do you think developers should pay Apple&#8217;s commission?</p><p><strong>Top Answer:</strong> Yes, it makes sense</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 #74]]></title><description><![CDATA[Apple's new EU terms, structs vs classes, migrating to Swift Testing, tracking app state with StateReporter, responding to geometry changes in SwiftUI, the new Data Detector, and DeviceHub in Xcode 27]]></description><link>https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-74</link><guid isPermaLink="false">https://iosweeklybrief.com/p/the-ios-weekly-brief-issue-74</guid><dc:creator><![CDATA[Vlad Khambir]]></dc:creator><pubDate>Fri, 21 Aug 2026 12:29:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!M5cp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>This week I&#8217;ve been thinking about...</strong></p><p>Since my first iOS device, I have always installed iOS beta versions because I wanted to gain new experiences that nobody else had yet. There is an interesting moment when iOS was released to everyone, and for me, this version had already gotten boring &#128517;</p><p>That&#8217;s why I keep going with betas: if I don&#8217;t install the beta, I end up sitting on one version longer than everyone else.</p><p>What&#8217;s cool is that Apple made betas public a long time ago, since before you needed a developer account to install them. And I can tell that when you pay for a developer account just because you need to install a new beta, willingly or not, you start thinking, maybe I should start developing some software, since I&#8217;m already paying for it, right?</p><p>Anyway, a new beta came out again this week, and the release is coming soon. I hope you&#8217;ve prepared all your apps. You install betas too, because you&#8217;re software engineers, and you must be sure your users get a good user experience.</p><p>In this issue, a few topics are available in beta, so I&#8217;d strongly recommend checking them out before the release. Once everything is out, you&#8217;ll be armed with new tools and new capabilities to make your software development process even better than it was before.</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_!M5cp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M5cp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg 424w, https://substackcdn.com/image/fetch/$s_!M5cp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg 848w, https://substackcdn.com/image/fetch/$s_!M5cp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!M5cp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M5cp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg" width="1306" height="735" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:735,&quot;width&quot;:1306,&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_!M5cp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg 424w, https://substackcdn.com/image/fetch/$s_!M5cp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg 848w, https://substackcdn.com/image/fetch/$s_!M5cp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!M5cp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68d5a6c3-ca0a-436a-aa1b-d07ac1bacedd_1306x735.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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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/08/apple-announces-changes-for-apps-in-the-european-union/"><span data-color="#3c78d8" style="color: rgb(60, 120, 216);">Changes for apps in the European Union</span></a></strong></p><p>Apple is releasing new terms for developers in the EU, you should check this out.</p><p>Believe me or not, but I think Apple deserves that commission. Without the App Store many of us wouldn&#8217;t have a way to make money from an app. Apple gives you the platform and handles the payment infrastructure, it&#8217;s worth something anyway.</p><p>I&#8217;m curious about the 5% commission on transactions that are outside Apple&#8217;s systems... Tracking purchases without touching App Store infrastructure sounds like a hard problem to solve &#129300;</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=08172026a"><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">iOS 27.0 beta </span></a><span data-color="#6aa84f" style="color: rgb(106, 168, 79);">6</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://dkvekariya.medium.com/swift-structs-why-apple-chooses-value-types-over-classes-f60b79aa3659"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Swift Structs: Why Apple Chooses Value Types Over Classes</span></a></strong></p><p>A great breakdown of the difference between structs and classes with every nuance and use case: mutating methods, computed properties, property observers, etc.</p><p><strong><a href="https://www.avanderlee.com/swift-testing/modern-unit-test/"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">Swift Testing explained with code examples</span></a></strong></p><p>For our project, we started migrating to Swift Testing, and it&#8217;s been cool so far. Apple lets both frameworks live in the same target, it means you migrate when you want and what you want. For example, I use Swift Testing for new tests and convert old ones whenever I have time. No pressure to do it all at once.</p><p>The framework is easy to pick up and well documented. I recommend you take a look at this tutorial, it walks through the key concepts you need to get started.</p><p><strong><a href="https://antongubarenko.substack.com/p/ios-27-statereporter"><span data-color="#674ea7" style="color: rgb(103, 78, 167);">iOS 27: StateReporter</span></a></strong></p><p>With iOS 27, you will get a framework that allows you to attach application state to performance diagnostics. MetricKit and Instruments will tell you what your app was doing during a hang. That&#8217;s cool, because now you don&#8217;t need to guess between a suspicious interval and your own signposts.</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/RespondingToGeometryChangesInSwiftUI/"><span data-color="#e69138" style="color: rgb(230, 145, 56);">Responding to geometry changes in SwiftUI</span></a></strong></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">.onGeometryChange(for: Bool.self) { geometry in
    // Derive only the boolean we need, not the raw size
    geometry.size.height &gt; geometry.size.width
} action: { usesVerticalLayout in
    // Called only when the result differs from before
    self.usesVerticalLayout = usesVerticalLayout
}</code></pre></div></li></ul><ul><li><p><strong><a href="https://antongubarenko.substack.com/p/ios-26-data-detector"><span data-color="#e69138" style="color: rgb(230, 145, 56);">iOS 26: Data Detector</span></a></strong></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;swift&quot;,&quot;nodeId&quot;:&quot;f4cd703d-bfb8-43fd-9efb-e4fc92db046b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-swift">for await match in text.dataDetectorMatches([.emailAddress]) {
    if case let .emailAddress(email) = match.details {
        print(email.emailAddress)
    }
}</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-sWLHTF-dqjk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;sWLHTF-dqjk&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/sWLHTF-dqjk?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=sWLHTF-dqjk"><span data-color="#cc0000" style="color: rgb(204, 0, 0);">Device Hub Explained - What Every Apple Developer Should Know</span></a></strong></p><p>As I mentioned before, this whole resizable simulator thing feels like a hint at some new iPhone form factor, will see see where that goes soon! In the meantime, DeviceHub has a lot of useful features, and this video walks through all of them well.</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://obsidian.md/"><span data-color="#a64d79" style="color: rgb(166, 77, 121);">Obsidian</span></a></strong></p><p>I use Obsidian for my daily notes, weekly worklogs, performance reviews, etc. I also connect it with Claude Code, it allows you to find and add information fast. If you are not using a proper notes app yet, check this out.</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>69 new iOS positions this week  </strong><em>(+3% vs last week &#183; +138% vs last month)</em> </p><ul><li><p>Senior / Mid / Junior &#8212; 25% / 75% / 0%</p></li><li><p>Most wanted skills: SwiftUI 49% &#183; UIKit 28% &#183; MVVM 13% &#183; Core Data 9%</p></li></ul><h4>This week&#8217;s picks:</h4><p><strong>iOS Engineer II</strong> at <strong>Expedia Group</strong> (Chicago, IL) &#8212; SwiftUI-based codebase powering one of the world&#8217;s largest travel booking platforms; mid-level scope covering features, performance, and quality across a high-traffic production app. Salary $111K&#8211;$155.5K &#8594; <strong><a href="https://www.linkedin.com/jobs/view/ios-engineer-ii-at-expedia-group-4454957653"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Nuuly iOS Engineer</strong> at <strong>Nuuly</strong> (Philadelphia, PA) &#8212; SwiftUI + UIKit stack with unit testing explicitly required; Nuuly is URBN&#8217;s clothing subscription rental service, shipping to hundreds of thousands of subscribers on a pure iOS consumer product &#8594; <strong><a href="https://www.linkedin.com/jobs/view/nuuly-ios-engineer-at-nuuly-4453226319"><span data-color="#0b5394" style="color: rgb(11, 83, 148);">Apply</span></a></strong></p><p><strong>Member of Technical Staff, iOS</strong> at <strong>Mercor</strong> (San Francisco, CA) &#8212; SwiftUI codebase deeply embedded with AI throughout the stack; Mercor is an AI-powered hiring platform. Salary $130K&#8211;$400K &#8594; <strong><a href="https://www.linkedin.com/jobs/view/member-of-technical-staff-ios-at-mercor-4442196955"><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;:1036929}" data-component-name="PollToDOM"></div><blockquote><p><strong>&#128202; Last Week&#8217;s Poll Results</strong></p><p>Do you use Git Worktree in your workflow?</p><p><strong>Top Answer:</strong> Yes</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 #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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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 buttonBase-GK1x3M"><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" class="icon-noB79L"><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 buttonBase-GK1x3M"><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 icon-noB79L"><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></channel></rss>