<?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:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Daegun Choi on Medium]]></title>
        <description><![CDATA[Stories by Daegun Choi on Medium]]></description>
        <link>https://medium.com/@choiysapple?source=rss-1add52282342------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*zxM0cg9NkLDsgq_JPZrQEg.jpeg</url>
            <title>Stories by Daegun Choi on Medium</title>
            <link>https://medium.com/@choiysapple?source=rss-1add52282342------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 05 Aug 2026 14:56:16 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@choiysapple/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[WWDC26 for UIKit App Developers — Adaptivity]]></title>
            <link>https://medium.com/@choiysapple/wwdc26-for-uikit-app-developers-adaptivity-ef4d23b0b95b?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/ef4d23b0b95b</guid>
            <category><![CDATA[ios-development]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[uikit]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[wwdc]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Tue, 30 Jun 2026 12:38:36 GMT</pubDate>
            <atom:updated>2026-06-30T12:42:41.275Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><em>Quick brief for Adaptivity changes for UIKit based app mentioned from </em><a href="https://developer.apple.com/videos/play/wwdc2026/278/"><em>Modernize your UIKit app</em></a><em> session</em></blockquote><p><em>한국어 독자시라면, </em><a href="https://medium.com/@choiysapple/uikit-%EA%B8%B0%EB%B0%98-%EC%95%B1-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-wwdc26-adaptivity-0d2e316ffab2?postPublishedType=repub"><em>이 링크</em></a><em>로 가주세요.</em></p><blockquote><em>The “What’s new in UIKit” session is gone…! 😱</em></blockquote><p>Instead, <strong>Modernize your UIKit app</strong> seems to be taking its place.</p><p>In that session, Apple talks about how existing apps need to support adaptive UI behavior.<br>̶T̶h̶e̶ ̶F̶o̶l̶d̶a̶b̶l̶e̶ ̶i̶P̶h̶o̶n̶e̶ ̶i̶s̶ ̶r̶e̶a̶l̶!̶</p><p>Let’s quickly go over what kind of adaptivity Apple is asking for, and what we actually need to do.</p><h3>Adaptivity</h3><p>On macOS 27, when you use iPhone Mirroring, the app window can be resized.<br>The same applies to iPhone-only apps running on iPad.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0LXDuhbmSzZ1PoB5.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4WRaTbDETdl35nKg.png" /><figcaption>Default size / Expanded size</figcaption></figure><p>Because of this, apps now need to dynamically adapt to the available scene size at runtime.</p><h3>Changes needed for Legacy API</h3><h3>Changes needed for Legacy API</h3><ul><li>UIScene lifecycle is required starting with iOS 27.</li><li>❌ Don’t use existingAppDelegate lifecycle</li><li>Check whether your app is using UISceneDelegate.</li></ul><blockquote><a href="https://developer.apple.com/documentation/UIKit/transitioning-to-the-uikit-scene-based-life-cycle">Transitioning to the UIKit scene-based life cycle</a><br><a href="https://developer.apple.com/videos/play/wwdc2025/282/">Make your UIKit app more flexible — WWDC25</a></blockquote><h4>Main screen</h4><p>When an iPhone app is mirrored on a Mac the screen associated with the scene can change.</p><p>There are two main patterns for handling this.</p><p><strong>1. Avoid referencing the main screen in your app</strong></p><p>Instead, access the screen dynamically through windowScene.</p><pre>// Use local screen references<br>// Access the correct screen through a windowScene<br>let screen = window?.windowScene?.screen<br><br>// Pass in local screen references<br>func generateThumbnail(_ image: UIImage, screen: UIScreen) -&gt; UIImage {<br>    // existing code, replacing main screen with local screen reference<br>    // ...<br>}</pre><p><strong>2. Remove screen references entirely</strong></p><p><strong>2.1. Use </strong><strong>traitCollection.displayScale</strong></p><p>Replace screen scale usage with traitCollection.displayScale, so the UI can automatically update when traits change.</p><pre>// Replace the screen&#39;s scale with trait collection&#39;s displayScale<br>override func layoutSubviews() {<br>    super.layoutSubviews()<br>  <br>    // layoutSubviews will be called again automatically when displayScale changes<br>    let displayScale = traitCollection.displayScale<br>    // ...<br>}</pre><blockquote><a href="https://developer.apple.com/documentation/uikit/automatic-trait-tracking">Automatic trait tracking</a></blockquote><p>When automatic trait tracking is not available, register for trait changes manually where needed.</p><pre>// Manually register for trait changes<br>let displayScaleTrait: [UITrait] = [UITraitDisplayScale.self]<br><br>registerForTraitChanges(displayScaleTrait) {<br>    (view: GalleryView, previousTraitCollection: UITraitCollection) in<br>    view.cache.invalidate()<br>}</pre><blockquote><a href="https://developer.apple.com/documentation/uikit/adapting-your-app-when-traits-change">Adapting your app when traits change</a></blockquote><p><strong>2.2. Checking screen bounds</strong></p><p>In adaptive environments, the space available to a scene is no longer always the full screen bounds. (<em>i.e.</em> iPhone Mirroring or Split View on iPadOS.)</p><p>So, references to screen bounds should be removed.</p><p>UIWindowScene.effectiveGeometry provides information about the space currently available to your app.</p><p>Monitoring effectiveGeometry:</p><pre>// UIWindowSceneDelegate<br>func windowScene(<br>    _ windowScene: UIWindowScene,<br>    didUpdateEffectiveGeometry previousEffectiveGeometry: UIWindowScene.Geometry<br>) {<br>    let geometry = windowScene.effectiveGeometry<br>    let availableSpace = geometry.coordinateSpace.bounds<br>    // ...<br>}</pre><p>Instead of using the scene’s bounds, use the view’s bounds.</p><pre>// Checking available space<br>override func viewDidLayoutSubviews() {<br>    super.viewDidLayoutSubviews()<br>    let availableSpace = view.bounds.size<br>    // ...<br>}</pre><h4>UIRequiresFullScreen</h4><p>The previously supported UIRequiresFullScreen behavior will be deprecated for iOS 27 or later</p><h4>User interface idiom</h4><p>Even if UIUserInterfaceIdiom returns phone, you can no longer be completely sure whether the app is actually running:</p><ol><li>on a real iPhone,</li><li>on an iPad,</li><li>or through iPhone Mirroring on a Mac.</li></ol><p>Because of this, you should avoid using UIUserInterfaceIdiom for layout decisions.</p><h4>Interface orientation</h4><ul><li>In resizable environments, the old Interface Orientation value is ignored.</li><li>In iPhone Mirroring, the app is always treated as Portrait.</li><li>Use size classes and scene bounds instead.</li></ul><blockquote><em>Device rotation is just an animated bounds change.<br> — Bruce Nilo, WWDC2014</em></blockquote><h3>Testing</h3><h3>Testing</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mHA1Vffq8mbqU3VUtH6psQ.png" /></figure><h3>Agentic coding</h3><h3>Agentic coding</h3><p>Xcode 27 is said to have a deep understanding of adaptivity-related work.</p><p>It includes a skill that can automatically apply many of the changes mentioned above.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CFlXu6fIfyT3z588Lprl3Q.png" /><figcaption>You can try it directly with Xcode Intelligence.</figcaption></figure><h4>Using external Tools</h4><p>You can also export this skill and import it into other agents or tools.<br> ̶S̶e̶e̶m̶s̶ ̶l̶i̶k̶e̶ ̶A̶p̶p̶l̶e̶ ̶k̶n̶o̶w̶s̶ ̶n̶o̶b̶o̶d̶y̶ ̶u̶s̶e̶s̶ ̶X̶c̶o̶d̶e̶ ̶I̶n̶t̶e̶l̶l̶i̶g̶e̶n̶c̶e̶</p><pre>xcrun agent skills export</pre><p>I uploaded the exported skill files to the <a href="https://github.com/ChoiysApple/Xcode-27-Skills">Xcode-27-Skills</a> repository.</p><p>If you want to try UIKit modernization related skills, check <a href="https://github.com/ChoiysApple/Xcode-27-Skills/tree/main/xcode-skills/uikit-app-modernization">uikit-app-modernization</a> from this repository.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ef4d23b0b95b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[UIKit 기반 앱 개발자를 위한 WWDC26 — Adaptivity]]></title>
            <link>https://medium.com/@choiysapple/uikit-%EA%B8%B0%EB%B0%98-%EC%95%B1-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-wwdc26-adaptivity-0d2e316ffab2?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/0d2e316ffab2</guid>
            <category><![CDATA[apple]]></category>
            <category><![CDATA[ios-development]]></category>
            <category><![CDATA[wwdc]]></category>
            <category><![CDATA[uikit]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Tue, 30 Jun 2026 12:14:55 GMT</pubDate>
            <atom:updated>2026-06-30T12:41:21.982Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><a href="https://developer.apple.com/videos/play/wwdc2026/278/"><em>Modernize your UIKit app</em></a><em> 세션에서, UIKit 앱이 필수적으로 대응해야 할 적응형 요소들을 정리해 봅시다.</em></blockquote><p><em>If you are English reader, go to </em><a href="https://medium.com/p/ef4d23b0b95b?postPublishedType=initial"><em>this page</em></a></p><p>이번 WWDC26의 세션을 살펴보면, 평소와는 다른 점이 한가지 있습니다. 바로….</p><blockquote>What’s new in UIKit 세션이 사라졌습니다…! 😱</blockquote><p>대신, <a href="https://developer.apple.com/videos/play/wwdc2026/278/">Modernize your UIKit app</a> 세션이 이를 대체하고 있어요<br>이 세션을 살펴보면 기존 앱에서 적응형 UI가 동작해야 한다는 내용이 있었습니다. <br> ̶아̶이̶폰̶ ̶폴̶더̶블̶ ̶나̶오̶겠̶네̶ ̶이̶거̶</p><p>Apple에서 요구하는 적응형의 모습이 뭔지, 그래서 뭘 해야 하는지 간단하게 정리해 보겠습니다.</p><h3>Adaptivity</h3><p>macOS 27에서 iPhone을 미러링해서 사용하면, 창 크기 변경이 가능합니다.<br>iPad 앱에서 실행되는 iPhone 전용 앱도 동일하게 취급됩니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tOkcqkaLQkTAYS4G4T-PXQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nvWoLPl_W01HHBMDGDXpDQ.png" /><figcaption>기본 크기 / 늘린 크기</figcaption></figure><p>따라서 이제 런타임에 사용 가능한 씬 크기에 맞춰 조정이 필요합니다.</p><h3>Legacy API</h3><h4>App lifecycle</h4><ul><li>UIScene 라이프사이클이 iOS 27부터 필수입니다.</li><li>기존 AppDelegate 사용 ❌</li><li>UISceneDelegate 사용하는지 확인하기</li></ul><blockquote><a href="https://developer.apple.com/documentation/UIKit/transitioning-to-the-uikit-scene-based-life-cycle">Transitioning to the UIKit scene-based life cycle</a><br><a href="https://developer.apple.com/videos/play/wwdc2025/282/">Make your UIKit app more flexible — WWDC25</a></blockquote><h4>Main screen</h4><p>iPhone 앱이 Mac에서 미러링될 때 또는 사용자가 iPad의 앱을 외부 디스플레이로 이동할 때 씬과 연결된 화면이 달라져요</p><p>이를 해결하기 위한 패턴은 크게 두가지입니다.</p><p><strong>1. 앱에서 메인 화면을 참조하지 않도록 하는 것이 중요</strong></p><p>따라서 windowScene에서 화면에 동적으로 접근해야 해요</p><pre>// Use local screen references<br>// Access the correct screen through a windowScene<br>let screen = window?.windowScene?.screen<br><br>// Pass in local screen references<br>func generateThumbnail(_ image: UIImage, screen: UIScreen) -&gt; UIImage {<br>    // existing code, replacing main screen with local screen reference<br>    // ...<br>}</pre><p><strong>2. 화면 참조를 아예 제거하기</strong></p><p><strong>2.1. </strong><strong>traitCollection.displayScale 사용</strong></p><p>Trait 변화를 자동으로 모니터링 해서 UI 업데이트가 되도록 변경:</p><pre>// Replace the screen&#39;s scale with trait collection&#39;s displayScale<br>override func layoutSubviews() {<br>    super.layoutSubviews()<br>    <br>    // layoutSubviews will be called again automatically when displayScale changes<br>    let displayScale = traitCollection.displayScale<br>    <br>    // ...<br>}</pre><blockquote><a href="https://developer.apple.com/documentation/uikit/automatic-trait-tracking">Automatic trait tracking</a></blockquote><p>자동 Trait 추적 사용이 불가능 한 경우, 필요한 곳에 trait 업데이트를 등록:</p><pre>// Manually register for trait changes<br>let displayScaleTrait: [UITrait] = [UITraitDisplayScale.self]<br><br>registerForTraitChanges(displayScaleTrait) {<br>    (view: GalleryView, previousTraitCollection: UITraitCollection) in<br>    view.cache.invalidate()<br>}</pre><blockquote><a href="https://developer.apple.com/documentation/uikit/adapting-your-app-when-traits-change">Adapting your app when traits change</a></blockquote><p><strong>2.2. 화면의 bounds 확인</strong></p><p>이제 적응형 환경에서 Scene이 사용 가능한 공간이 항상 전체 화면(bounds)이 아니게 됩니다. (미러링 또는 iPadOS의 SplitView 상황)</p><p>따라서 bounds 참조를 제거해야 해요</p><p>UIWindowScene.effectiveGeometry는 앱이 사용 가능한 공간의 정보를 제공 합니다.</p><p>effectiveGeometry 모니터링 코드:</p><pre>// UIWindowSceneDelegate<br>func windowScene(<br>    _ windowScene: UIWindowScene,<br>    didUpdateEffectiveGeometry previousEffectiveGeometry: UIWindowScene.Geometry<br>) {<br>    let geometry = windowScene.effectiveGeometry<br>    let availableSpace = geometry.coordinateSpace.bounds<br>    // ...<br>}</pre><p>Scene의 bounds 대신 view의 bounds로 교체:</p><pre>// Checking available space<br>override func viewDidLayoutSubviews() {<br>    super.viewDidLayoutSubviews()<br>    let availableSpace = view.bounds.size<br>    // ...<br>}</pre><h4>UIRequiresFullScreen</h4><p>기존에 지원하던 UIRequiresFullScreen가 Deprecated 됩니다.</p><h4>User interface idiom</h4><p>phone으로 나온다해도, 실제로</p><ol><li>진짜 iPhone에서 실행중인지</li><li>iPad에서 실행중인지</li><li>Mac에서 미러링으로 실행중인지</li></ol><p>확신할 수 없어서, UIUserInterfaceIdiom을 사용을 지양해야 해요.</p><h4>Interface orientation</h4><ul><li>이제 크기 조절이 가능한 환경에서 기존 Interface Orientation 무시됩니다.</li><li>iPhone mirroring에서는 무조건 portrait 처리</li><li>Size 클래스와 scene bounds 사용해서 처리하세요</li></ul><blockquote><em>기기 회전은 단지 애니메이션된 bounds 변경입니다.<br> ㄴBruce Nilo, WWDC2024</em></blockquote><h3>Testing</h3><p>새로운 <a href="https://developer.apple.com/documentation/xcode/device-hub">Device Hub</a> 앱과 Xcode Previews에서 enter resize mode 버튼으로 Resize 모드를 사용해서 테스트 할 수 있습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mHA1Vffq8mbqU3VUtH6psQ.png" /></figure><blockquote><a href="https://developer.apple.com/kr/videos/play/wwdc2026/260"><em>Get the most out of Device Hub</em></a></blockquote><h3>Agentic coding</h3><h4>Xcode Intelligence</h4><p>Xcode 27은 적응성 작업에 대한 깊은 이해를 갖추고 있다고 합니다.<br>위의 변경점을 알아서 해주는 skill을 가지고 있어요.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CFlXu6fIfyT3z588Lprl3Q.png" /><figcaption>Xcode Intelligence를 사용해서 바로 적용해 볼 수 있어요</figcaption></figure><h4>외부 툴 사용하기</h4><p>이 스킬 export해서 다른 agent나 툴에 import 해서 사용이 가능해요. <br> ̶개̶발̶자̶들̶ ̶X̶c̶o̶d̶e̶ ̶I̶n̶t̶e̶l̶l̶i̶g̶e̶n̶c̶e̶ ̶잘̶ ̶안̶쓰̶는̶거̶ ̶들̶켰̶나̶봐̶요̶</p><pre>xcrun agent skills export</pre><p><a href="https://github.com/ChoiysApple/Xcode-27-Skills">Xcode-27-Skills</a> 리포지토리에 export된 스킬 파일들을 올려두었으니, <a href="https://github.com/ChoiysApple/Xcode-27-Skills/tree/main/xcode-skills/uikit-app-modernization">uikit-app-modernization</a> 스킬을 참고해서 사용해도 좋겠습니다.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0d2e316ffab2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Hitchhiker’s Guide to Cupertino — A WWDC26 Recap]]></title>
            <link>https://medium.com/@choiysapple/the-hitchhikers-guide-to-cupertino-a-wwdc26-recap-93796dac37b4?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/93796dac37b4</guid>
            <category><![CDATA[apple]]></category>
            <category><![CDATA[wwdc]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Mon, 15 Jun 2026 14:33:28 GMT</pubDate>
            <atom:updated>2026-06-22T07:01:24.478Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>What do you actually do at WWDC? What can you take away from it?</blockquote><p><em>한국어 독자시라면, </em><a href="https://medium.com/@choiysapple/%EC%BF%A0%ED%8D%BC%ED%8B%B0%EB%85%B8%EB%A5%BC-%EC%97%AC%ED%96%89%ED%95%98%EB%8A%94-%ED%9E%88%EC%B9%98%ED%95%98%EC%9D%B4%EC%BB%A4%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%95%88%EB%82%B4%EC%84%9C-wwdc26-%ED%9B%84%EA%B8%B0-0f4eaec5a68c?postPublishedType=repub"><em>이 페이지</em></a><em>로 가주세요.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*71BiLymsFOxS6xVZ.png" /></figure><p>Hello, This is Daegun Choi.</p><p>This year, I had the chance to attend <strong>WWDC26</strong>.</p><p>Even if you get the opportunity to go to WWDC, it can be surprisingly hard to know what actually happens there. <br>Because of the cost and time commitment, it can feel like a big decision. And if you’re working full-time, it can also be difficult to convince your company to support the trip.</p><p>So in this post, I’d like to share what you can gain from attending WWDC in person.</p><h3>1. How do you get into WWDC?</h3><p>Around April, when Apple announces WWDC, you can apply through the Apple Developer website using your App Store Developer Program membership account.</p><p>Selection is done through a lottery. If you’re selected, you’ll receive an email letting you know.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*dQ90UY9vlVhslVEO.png" /></figure><p>You need to register your <strong>RSVP</strong> within the given period through the email to confirm your attendance.</p><p>If you don’t complete the RSVP, Apple treats it as a cancellation, and the spot may be offered to someone else.</p><p>So even if you don’t get selected at first, keep an eye out. There may still be an additional chance to attend.</p><h3>2. WWDC Week Schedule</h3><blockquote>Events marked with <strong></strong> are official Apple events. <br>The rest are external community events.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2xgXeR4RoLl5gbjt.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Nu9b55uXO7mNjsvw.png" /></figure><h3>June 7 — Sunday</h3><h4> Welcome Reception</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*LGAzzIZxqJhCeLmP.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*D0y6gycjRIYTkPUX.png" /></figure><p>This event takes place at <strong>Infinite Loop</strong>, where you pick up your badge, lanyard, and swag. It’s also a networking event where you can meet other developers.</p><p>Along with the badge, Apple gives you a tote bag with stickers, pins, and a tumbler.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*RATgRzGWFFkVcRQf.png" /><figcaption>Tote bag, Badges, Stickers, Tumblr</figcaption></figure><p>There was also a chance to talk with the <a href="https://developer.apple.com/design/awards/"><strong>Apple Design Award</strong></a> winners.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*FSEWnpQmkR2dwq8V.png" /></figure><p>You could even see the Apple Design Awards trophies in person.</p><h3><a href="https://luma.com/94pquugz">Pre-WWDC Bashcade</a></h3><p>This was a pre-WWDC party hosted by <strong>RevenueCat</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*aB0dzVOC6YtGcLI2.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*WrOagSA9--HeFu7z.png" /><figcaption>Unlimited Foods and Drinks and finally RevenuCat merch</figcaption></figure><p>There was unlimited food and drinks, and even RevenueCat swag.</p><p>I got to meet and talk with many developers attending WWDC, and even some Apple engineers.</p><h3>June 8 — Monday</h3><h3> Session at Apple Park</h3><p>Finally, it was time to enter <strong>Apple Park</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*dN4F8n1D3LiIrQRi.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2LCcLC57qqbKQYP3.png" /></figure><h3>1. Keynote</h3><p>This was an event where everyone watched the Keynote together.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*vUEDj1jtrS70qNt_.png" /></figure><p>Before the Keynote started, we got to see speeches from Craig Federighi and Tim Cook that weren’t available online. It felt special to see Tim Cook’s final Apple Event in person.</p><h3>2. Platform State of the Union</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*zSr9AxSVgREmw62f.png" /></figure><p>The Platform State of the Union was shown in the same area where we watched the Keynote.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MdgjNsxKY38cjFUY.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Bo--uUw5GpduSskf.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fATTRLWQkWADjJsy.png" /><figcaption>Apple Design Awards Winners / Community Leaders / Swift Student Challenge Distinguished Winners</figcaption></figure><p>Unlike the online version, the in-person event also included the Apple Design Awards ceremony, an introduction of community leaders, and an introduction of the Swift Student Challenge Distinguished Winners.</p><p>This year, there were three winners from Korea 🇰🇷</p><h3>3. In-person Labs</h3><p>This is a session where you can talk directly with Apple engineers.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EXG8sCl6E4pnJZ2_.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zeaEUpxB8HXVNbSq.png" /><figcaption>People wearing Green T-shirts are Apple engineers.</figcaption></figure><p>Unlike Android, the iOS app development SDK is not open source, and the documentation can sometimes be lacking. Because of that, this felt like a great opportunity to ask about things that are difficult to solve with publicly available information.</p><p>I do wish I had prepared more questions in advance.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*9Vm9VYPAFCyfP0xB.png" /></figure><p>There was also a <strong>Design Lab</strong>, where you could receive feedback on your app’s design.</p><h3>4. Reception in the Inner Ring</h3><p>Apple opened up the inner ring area of Apple Park.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Ss2t-69wCgHNdBDi.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*tm2PTogB1HBbi2Ye.jpeg" /></figure><p>This was a mixer-style networking event, and also a place where developers could try out newly announced technologies.</p><p>Outside, there was an area called the <strong>Download Station</strong>, with tables equipped with Ethernet cables and charging ports. You could try out new technologies there and talk with other developers.</p><h3>Things You Might Regret Missing</h3><h3>Bonus 1. The App Displays</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*ytmFX9M22riJxj2x.png" /></figure><p>On screens throughout the venue, apps made by WWDC attendees were displayed by color.</p><p>The fun part is trying to find your own app.</p><h3>Bonus 2. Cherries</h3><p>Inside the Inner Ring, there are various fruit trees. Apple grows and harvests the fruit, and visitors can eat it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*pGvlrXTFvMMX5naX.png" /></figure><p>While walking around, you might be offered cherries. They were incredibly fresh and delicious.</p><h3><a href="https://luma.com/y95acvdw?tk=wIwRRm">Beer with Swift @ WWDC26</a></h3><p>This was another community meetup held in the evening.</p><p>I was able to meet and talk with iOS developers from many different countries and domains.</p><h3>June 9 — Tuesday</h3><h3> Mixer at the Apple Developer Center Cupertino</h3><h3>1. Developer Session</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*shHDAWIHw_MZzkJh.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*t9p47msfZSxYxpF0.png" /></figure><p>At the Steve Jobs Theater and Apple Developer Center, Apple hosted overview sessions and demos of the new technologies announced at WWDC.</p><p>The actual speakers presented at the Steve Jobs Theater, while the Apple Developer Center streamed the session live.</p><h3>2. Mixer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*TI6a99LzUR5girv5.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jvESoZWkYoqpaePB.png" /></figure><p>After the Developer Session, there was a mixer with lunch, where attendees could network and discuss the session.</p><p>Apple employees were there as well. You could talk with them, and if you were lucky, you might even receive a pin.</p><p>Absolutely do not bring kimchi fried rice.</p><h3> Movie with Special Guest</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ZYgkx4oYZx_ZFFs4.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*LKS4Dt5YOqmhiCjt.png" /><figcaption>Inside / Outside</figcaption></figure><p>This was an event where attendees watched a movie together at the <strong>Steve Jobs Theater</strong>.</p><p>Before the movie started, there was an interview with a special guest.</p><h3>June 10 — Wednesday</h3><h3><a href="https://developer.apple.com/events/view/8D4G7DD8LR/dashboard"> Apple Developer Community Meetup</a></h3><p>This event focused on developer communities in the Apple ecosystem.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*ED0QWwYNa1ny95pH.png" /></figure><p>Apple introduced communities from around the world, and there was time for networking.</p><p>Since this event was separate from WWDC itself, I was able to meet an even wider range of developers, which was great.</p><p>Recently, Apple has been giving the impression that it really cares about developer communities, and this event made that impression even stronger.</p><h3>3. Event Tips</h3><h3>1. Sessions where it’s worth lining up early</h3><p><strong>Keynote</strong><br>If you get a front-row seat, you can see Tim Cook and Craig Federighi up close.</p><p><strong>Developer Session</strong><br>You need to arrive early if you want to watch the session live at the Steve Jobs Theater.</p><h3>2. Apple events that require separate registration</h3><ul><li>Movie with a Special Guest</li><li><a href="https://developer.apple.com/events/view/8D4G7DD8LR/dashboard">Apple Developer Community Meetup</a></li></ul><h3>3. Attend developer community events during your free time</h3><ul><li><strong>Luma</strong><br>There was a <a href="https://luma.com/wwdcevents?period=past">WWDC26-related event category</a>.</li><li><a href="https://communitykit.social/"><strong>CommunityKit</strong></a><br>These are community events hosted by groups from around the world near Apple Park during WWDC week.</li><li><a href="https://developer.apple.com/community/events/"><strong>Apple Developer/Community-driven events</strong><br></a>Apple also organizes WWDC-related events on the Apple Developer website.</li></ul><h3>4. FAQ</h3><h3>Do they provide food?</h3><p>At official Apple events, plenty of finger food was provided. RevenueCat’s Bashcade also had plenty of food.</p><h3>How do you get around?</h3><p>Unless your accommodation is right next to Apple Park, you’ll need a car.<br>Taking Uber is fine, but renting a car is probably the best option.</p><h3>Places worth visiting nearby</h3><ul><li><strong>Stanford University</strong></li><li><strong>Google Visitor Experience</strong></li><li><strong>Apple Park Visitor Center</strong><br>They sell official Apple merchandise, including sweatshirts, hoodies, tumblers, mugs, and more.</li><li><strong>NASA Visitor Center</strong></li><li><strong>Computer History Museum</strong></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=93796dac37b4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[쿠퍼티노를 여행하는 히치하이커를 위한 안내서 — WWDC26 후기]]></title>
            <link>https://medium.com/@choiysapple/%EC%BF%A0%ED%8D%BC%ED%8B%B0%EB%85%B8%EB%A5%BC-%EC%97%AC%ED%96%89%ED%95%98%EB%8A%94-%ED%9E%88%EC%B9%98%ED%95%98%EC%9D%B4%EC%BB%A4%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%95%88%EB%82%B4%EC%84%9C-wwdc26-%ED%9B%84%EA%B8%B0-0f4eaec5a68c?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/0f4eaec5a68c</guid>
            <category><![CDATA[apple]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[wwdc]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Mon, 15 Jun 2026 13:56:23 GMT</pubDate>
            <atom:updated>2026-06-22T07:02:01.525Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>WWDC에 가면 뭘 하나요? 어떤 걸 얻을 수 있나요?</blockquote><p><em>If you are English reader, go to </em><a href="https://medium.com/p/93796dac37b4?postPublishedType=initial"><em>this page</em></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IYlwfpcvLplFXoil3WERIA.png" /></figure><p>안녕하세요 최대건입니다.<br>이번에 WWDC26 행사에 참석했습니다.</p><p>WWDC에 갈 수 있는 기회가 생겨도 정확히 뭘 하는지 알기가 어렵습니다<br>때문에 비용이나 시간 때문에 부담스럽고, 직장인 분들은 회사의 지원을 설득하기도 어렵습니다.<br>이 글을 통해 WWDC 참여로 어떤 것들을 얻어갈 수 있는지 알려드리겠습니다!</p><h3><strong>1. WWDC에 어떻게 가나요?</strong></h3><p>4월 즈음에 WWDC가 발표되면, Apple Developer 사이트에서 앱스토어 개발자 맴버십 계정으로 신청이 가능합니다.</p><p>추첨으로 진행되고, 당첨되면 이런 식으로 당첨되었다는 메일을 받을 수 있습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/912/1*yknFZ0zXi25gDNrh3eGVFw.png" /></figure><p>메일을 통해 정해진 기간 안에 RVSP를 등록해야 확정입니다!<br>RVSP 등록을 안하면, 불참으로 간주되어 다른 신청자들에게 추가 기회가 돌아갑니다.<br>이런 식으로 낙첨이더라도 추가 당첨 기회가 있으니 눈여겨보세요</p><h3><strong>2. WWDC 주간 일정</strong></h3><blockquote>은 애플의 이벤트입니다. 나머지는 외부 커뮤니티 이벤트</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xlVqHTkAOs-2ello06avTA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*byK2n444H_Nisy-UOxF0xw.png" /><figcaption>행사 내내 사용되는 출입증</figcaption></figure><h4>6/7 일</h4><h4><strong> Welcome reception</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d_nwHsZG7vIXoLG6bFPNvw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zyj6rp7Z95zaLnUGrRtuqQ.png" /><figcaption>Infinite Loop 전경</figcaption></figure><p>Infinite Loop에서 뱃지(출입증 목걸이와 굿즈)를 수령하고, 개발자들과 네트워킹을 하는 행사입니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HI7HqfRwg8zMV97-LrVh4A.png" /><figcaption>출입증과 함께 토트백에 스티커, 뱃지, 텀블러를 같이 줍니다</figcaption></figure><p><a href="https://developer.apple.com/design/awards/">Apple Design Award</a> 수상자들과 대화해볼 수 있는 기회도 있습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ArplSWaHBQt17ODng2LqZA.png" /><figcaption>Apple Design Awards 상패도 볼 수 있었습니다.</figcaption></figure><h4><a href="https://luma.com/94pquugz"><strong>Pre-WWDC Bashcade</strong></a></h4><p>RevenueCat에서 주최한 WWDC 전야제 느낌의 파티입니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t3N-7m7Bu8W17BzOhP8IeA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xIr0BQMWsExPFZ7QoL6HVw.png" /><figcaption>무제한 술과 음식! RevenuCat 굿즈까지!</figcaption></figure><p>WWDC에 참여하는 여러 개발자들, 심지어는 Apple 엔지니어도 만나 이야기해 볼 수 있었습니다.</p><h4>6/8 월</h4><h4><strong> Session at Apple Park</strong></h4><p>드디어 Apple Park에 입성합니다!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RkFSjvQf1K-8YM6yHGO2mA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*syOLSy7fs3nTInsKDV6CHQ.png" /></figure><p><strong>1. KeyNote</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wy9wWGu6ASyEDx5Tl6b7zQ.png" /></figure><p>같이 KeyNote를 시청하는 이벤트입니다.</p><p>KeyNote 시작 전, 온라인에서는 볼 수 없는 패더리기와 팀 쿡의 연설을 볼 수 있었습니다. 팀 쿡의 마지막 Apple Event를 볼 수 있어 특별했네요.</p><p><strong>2. Platform State of Union</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NrcsGzt0VJg3mrFzOL64tQ.png" /></figure><p>KeyNote를 시청했던 같은 곳에서 Platform State of Union을 시청합니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Qxh8StZvlEpTxUwB1kqqGA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e9hgJ6noxEUVEZ70Txz5xg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6HztQOpbP-TVZXfiZOKovg.png" /></figure><p>온라인과는 다르게 Apple Developer Awards 시상식, Community Leader 소개, Student Challenge Distinguished Winner 소개(올해는 한국인이 무려 3명 🇰🇷)를 볼 수 있었습니다.</p><p><strong>3. In-person labs</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cxYyng4VMORj01D_uLdr_w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4e4mxmq0jBJfH43K7--FoQ.png" /><figcaption>색 티셔츠가 Apple Engineers</figcaption></figure><p>Apple 엔지니어들과 직접 면담을 할 수 있는 세션입니다.</p><p>iOS 앱 개발 SDK는 Android와 다르게 오픈소스가 아닌데다가 문서가 부실한 경우가 많은데, 이런 기회에 오픈된 정보로 해결 어려웠던 부분을 해결하기 좋은 것 같네요.<br>미리 질문을 준비해 왔다면 더 좋았을것 같아서 아쉬웠습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IcAJot6vRdvBVTWoWAQm6g.png" /><figcaption>Design Lab</figcaption></figure><p>추가로, Design Lab도 진행하니 앱 디자인에 관한 피드백도 받아볼 수 있습니다.</p><p><strong>4. Reception in the inner ring</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PLFD4x-fFR3d7QLqAd0oFg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SZyQtz4Bv3YQZWpE28867Q.jpeg" /></figure><p>Apple Park의 링 안쪽 공간을 열어줍니다.</p><p>Mixer (네트워킹)과 새롭게 발표된 기술을 받아보는 이벤트입니다.<br>야외에 Download Station이라는 이름으로, 랜선과 충전 포트가 있는 테이블이 있어서 이곳에서 새로운 기술을 시도해 보고 이야기해 볼 수 있어요.</p><p>여기서 Claude 팀도 만나볼 수 있었습니다.</p><p><strong>‼️ 놓치면 약간 아쉬울 수 있는 것들</strong></p><p><strong>번외 1. 앱 전광판</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5Iv_G9D1igRHnhNSlNTrzw.png" /></figure><p>스크린 여기저기에 WWDC 참가자들의 앱이 컬러별로 나와요. 본인의 앱이 있는지 찾아보는게 포인트입니다.</p><p><strong>번외 2. 체리</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*F3J00hwI1gPl6CC08HxaiQ.png" /></figure><p>Inner Ring에는 여러가지 과일 나무가 있고, 애플에서 재배/수확해서 직접 먹습니다.<br>돌아다니다 보면 체리를 주는데, 상당히 신선하고 맛있어요.</p><h4><a href="https://luma.com/y95acvdw?tk=wIwRRm"><strong>Beer with Swift @WWDC26</strong></a></h4><p>저녁에 있었던 또다른 커뮤니티 밋업 행사입니다.<br>다양한 국가, 다양한 도메인의 iOS 개발자를 만나 대화해 볼 수 있었습니다.</p><h4>6/9 화</h4><h4> Mixer at the Apple Developer Center Cupertino</h4><p><strong>1. Developer Session</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OojqvnrspfYpnohwGxw34g.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9j8pZjwGxFBEBWwM3cndWA.png" /></figure><p>Steve Jobs Theater와 Apple Developer Center에서 이번 WWDC에서 추가된 기술들에 대한 전반적인 overview와 시연을 진행합니다.</p><p>실제 연사들은 Steve Jobs Theater에서 세션을 진행하고, Apple Developer Center에서는 실시간 영상을 보는 식으로 진행됩니다.</p><p><strong>2. Mixer</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7rC7nZy3f7pwEOeyAqBT_w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*goYSzYOLbRzLSJWzE0PYAw.png" /><figcaption>절대 김치볶음밥을 가져오지 마시오</figcaption></figure><p>Developer Session 행사 이후, 점심식사와 함께 Developer Session에 대한 Mixer (네트워킹)가 진행됩니다.<br>Apple 직원 분들도 계시는데, 대화 뿐만 아니라 운이 좋으면 뱃지를 받을지도!</p><h4> Movie with Special Guest</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OmcTFyWt6ReE4clwC-5waw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OJNGEgr9sV0aWMxUAaTiDA.png" /><figcaption>Steve Jobs Theater 내부 / 외부 Apple Park 전경</figcaption></figure><p>Steve Jobs Theater에서 같이 영화를 보는 이벤트입니다.<br>영화 시작 전 게스트와의 인터뷰가 있습니다.</p><h4>6/10 수</h4><p><strong> </strong><a href="https://developer.apple.com/events/view/8D4G7DD8LR/dashboard"><strong>Apple Developer Community Meetup</strong></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*30F-KxQ01pz2JqVcwFp8Ew.png" /></figure><p>Apple 생태계의 개발자 커뮤니티가 중심이 되는 행사입니다.<br>전세계에서 활동중인 커뮤니티들을 소개하고, 네트워킹 할 수 있었습니다.<br>게다가 WWDC와는 별개인 행사였기 때문에, 더 다양한 개발자들을 만날 수 있어 좋았습니다.</p><p>특히 요즘 애플이 개발자 커뮤니티를 잘 챙긴다는 인상을 주고 있는데, 이런 인상을 더 확고히 해주었어요.</p><h3><strong>3. 이벤트 관련 팁</strong></h3><p><strong>1. 미리 줄을 서서 일찍 들어가는게 좋은 세션들</strong></p><ul><li><strong>Keynote</strong><br>앞자리에서 팀쿡과 패더리기를 볼 수 있어요</li><li><strong>Developer Session</strong><br>일찍 가야 Steve Jobs Theater에서 라이브로 세션을 볼 수 있어요.</li></ul><p><strong>2. 따로 신청해야 하는 애플 이벤트</strong></p><ul><li>Movie with a special guest</li><li><a href="https://developer.apple.com/events/view/8D4G7DD8LR/dashboard">Apple Developer Community Meetup</a></li></ul><p><strong>3. 남는 시간에 개발자 커뮤니티 이벤트 참석하기</strong></p><blockquote>네트워킹이 이어지도록 LinkedIn 계정을 준비하는걸 추천합니다!</blockquote><ul><li><strong>Luma<br></strong><a href="https://luma.com/wwdcevents?period=past">WWDC26 관련 이벤트 카테고리가 있었어요</a></li><li><a href="https://communitykit.social/"><strong>CommunityKit</strong></a><br>Apple Park 주변에서 전세계 여러 커뮤니티가 WWDC 기간동안 진행하는 커뮤니티 행사들 입니다.</li><li><a href="https://developer.apple.com/community/events/"><strong>Apple Developer/Community-driven events</strong></a><br>애플 개발자 사이트에 WWDC 관련 행사들이 정리되어 있어요.</li></ul><p><strong>4. WWDC 한인타운 찾기!</strong></p><p>매년 한국인들이 정보 공유를 하는 채팅방이 생깁니다!<br>이 톡방에서 애플 굿즈 재입고 되었는지 (⭐️중요), 같이 우버 탈 사람 있는지 등등 도움을 많이 받았어요.</p><h3><strong>4. FAQ</strong></h3><h4>밥 주나요?</h4><p>애플 주관의 행사는 핑거 푸드 형태로 푸짐하게 제공됬고, RevenuCat의 BashCade도 푸짐했어요.</p><h4>이동은 어떻게 하나요?</h4><p>애플파크 바로옆 숙소가 아닌 이상, 차가 필요해요. <br>우버를 타고 다녀도 좋지만, 렌트카를 빌리는 게 가장 좋아요.</p><h4>주변에 갈만한 곳</h4><ul><li>스탠포드 대학교</li><li>Google Visitor Center</li><li>Apple Visitor Center (애플의 공식 굿즈들을 팝니다; 맨투맨, 후드, 텀블러, 머그 등)</li><li>NASA Visitor Center</li><li>Computer History Museum</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0f4eaec5a68c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Checklist when Xcode MCP keep fails]]></title>
            <link>https://medium.com/@choiysapple/checklist-when-xcode-mcp-keep-fails-0e3c4d6a133f?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/0e3c4d6a133f</guid>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[xcode]]></category>
            <category><![CDATA[claude]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Sat, 28 Mar 2026 11:06:52 GMT</pubDate>
            <atom:updated>2026-03-28T11:25:25.748Z</atom:updated>
            <content:encoded><![CDATA[<p>Apple is now providing <a href="https://developer.apple.com/documentation/xcode/giving-agentic-coding-tools-access-to-xcode">MCP for Xcode</a> since Xcode 26.3<br>But There’s some cases that codex or claude code keep failing to connect xcode mcp.</p><p>Here’s some checklist for you to fix this situation.</p><p><a href="https://developer.apple.com/documentation/xcode/giving-agentic-coding-tools-access-to-xcode">Giving external agentic coding tools access to Xcode | Apple Developer Documentation</a></p><h3>Minimum Requirements</h3><p>Before you start, Here’s requirements to use Xcode MCP (which is same with requirements of Xcode Agentic Coding)</p><ol><li>Apple Silicon (Not Intel Mac 😢)</li><li>Xcode 26.3</li><li>MacOS 26</li></ol><h3>1. Settings in Xcode</h3><p>This is setting that enables Xcode mcp. The toggle switch should be on.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fqkiTEYYl0ptb5YxKWD0Mw.png" /><figcaption>Xcode &gt; Settings &gt; Intelligence &gt; Model Context Protocol</figcaption></figure><h3>⭐ 2.️ Check default Xcode version</h3><p>If you installed Xcode from <a href="https://xcodereleases.com/">Xcode Releases</a> or <a href="https://developer.apple.com/download/applications/">Apple Developer</a>, your default Xcode version might be older one.</p><p><strong>Default Xcode version should be 26.3 or above<br></strong>Use xcode-select command to change default setting to your latest Xcode</p><pre>sudo xcode-select -s &lt;path/to/xcode&gt;</pre><h3>3. Allow Claude &amp; Codex to access Xcode</h3><p>Every time Claude &amp; Codex launches, Claude and Codex should get permission from Xcode.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/744/1*CS82F4rK1VepHz_OwZF2Bg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/744/1*WgF8v8q2xJP_xdE7Ptsq2g.png" /></figure><p>Make sure press “<strong>Allow</strong>” from this popup.<br>Accidentally dismissed this? Just <strong>reopen</strong> Claude or Codex.</p><h3>4. Make sure Xcode is running</h3><p>Xcode should be running to use this MCP.<br>But You don’t have to open project’ s window alive. Just not quitting (⌘ + q) is enough.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/216/1*zSfdolGnztfd7JfM6_JeqA.png" /><figcaption>Make sure there’s dot under the Xcode Icon</figcaption></figure><h3>⭐ 5. Check current directory</h3><p>If you run Xcode MCP setting command on terminal, it’s available only at current directory.</p><p>You should run claude mcp add or codex mcp add if you are using xcode mcp on that directory for the first time.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0e3c4d6a133f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WWDC25 — iOS 개발자가 체크해야 할 부분들 (UIKit)]]></title>
            <link>https://medium.com/@choiysapple/wwdc25-ios-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%B2%B4%ED%81%AC%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%B6%80%EB%B6%84%EB%93%A4-uikit-6075741cb4b8?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/6075741cb4b8</guid>
            <category><![CDATA[xcode]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[liquid-glass]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Sun, 21 Dec 2025 15:17:48 GMT</pubDate>
            <atom:updated>2025-12-21T15:17:48.291Z</atom:updated>
            <content:encoded><![CDATA[<h3>WWDC25 — iOS 개발자가 체크해야 할 부분들 (UIKit)</h3><p>WWDC25가 반년정도 지났고, 슬슬 Xcode 26으로 프로젝트를 마이그레이션 마쳐야 할 시기가 다가오고 있습니다. (항상 그렇듯, 이번에도 <strong>4월</strong>까지 마쳐야 합니다.)</p><p><a href="https://developer.apple.com/app-store/submitting/#latest-releases">Submitting - App Store - Apple Developer</a></p><p>신규 SDK 대응은 필요하지만, WWDC 영상들을 여럿 보기에는 시간이 좀 걸리죠</p><p>새로운 변경사항에 대응하기 위해 개인적으로 정리한 내용과, Xcode 26 SDK로 마이그레이션 하면서 신경썻던 부분에 대해 공유하려고 합니다.</p><p>늦게라도 마이그레이션을 시작하시는 분들께 도움이 되었으면 좋겠네요 😀</p><blockquote>‼️ UIkit 베이스의 iOS 프로젝트를 운영하고 있어, SwiftUI와 타 OS에 특화된 내용은 생략되어 있습니다. 양해 부탁드립니다 🙇</blockquote><h3>1. 바로 확인해야 할 부분</h3><h4>1.1. Liquid Glass</h4><p><a href="https://medium.com/@chcs1370/wwdc25-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%94%94%EC%9E%90%EC%9D%B8%EC%9C%BC%EB%A1%9C-uikit-%EC%95%B1-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B8%B0-b53ffb495b67">WWDC25 — 새로운 디자인으로 UIKit 앱 빌드하기</a></p><p>이번 업데이트의 가장 큰 부분은 단연 Liquid Glass 입니다.<br>Liquid Glass가 적용되면 외형이나 레이아웃이 바뀌거나, 원하지 않는 Liquid Glass 효과가 추가되기 때문에 확인이 필요합니다.</p><p><strong>‼️ Navigation Bar</strong>, <strong>Tab bar</strong>, <strong>Toggle Switch</strong>는 꼭 체크해 보시는 것을 추천드립니다.</p><p><strong>UIDesignRequiresCompatibility<br></strong>info.plist에서 UIDesignRequiresCompatibility를 추가해 Liquid Glass 디자인을 비활성화 할 수 있습니다.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*mpYDp69qGqSsS_YXOj7oEA.png" /></figure><ul><li>YES → Liquid glass 기존 디자인으로 빌드</li><li>NO → Liquid glass 디자인으로 빌드</li></ul><p><strong>‼️ </strong>해당 옵션은 <strong>임시로 지원</strong>되는 기능이기 때문에, Liquid Glass 활성화 상태에서도 문제가 없도록 조치가 필요합니다.</p><p>되도록이면 iOS 27이 출시되기 전에 하는게 안전하겠죠?</p><p>참고 자료:</p><ul><li><a href="https://developer.apple.com/documentation/BundleResources/Information-Property-List/UIDesignRequiresCompatibility">UIDesignRequiresCompatibility | Apple Developer Documentation</a></li><li><a href="https://medium.com/@battello.theo/how-to-disable-liquid-glass-when-building-for-ios-26-ed81d03f7633">How to Disable Liquid Glass When Building for iOS 26</a></li><li><a href="https://www.youtube.com/watch?v=y8gnwh2cpxo">How to Temporarily Disable the New Liquid Glass UI in Xcode 26</a></li></ul><h4>2. Swift <strong>Explicit Module</strong></h4><p><strong>Xcode 26.2</strong>에서는 지난 WWDC24에서 소개된 <a href="https://developer.apple.com/kr/videos/play/wwdc2024/10171/">Explicit Modules </a>기능이 기본으로 활성화 되게 변경되었습니다.</p><p>Explicit Modules 기능이 활성화되면, 기존에 암시적으로 프레임워크를 참조하는 모듈에서 빌드 에러가 발생할 수 있습니다. <br>(제 경우에는, 암시적 참조중인 프레임워크들에 대해 ‘Unable to find module dependency…’ 라는 에러가 발생되었습니다.)</p><p>아래 링크를 참조하셔서 수정하실 수 있습니다만, 장기적으로는 모듈 의존성 개선을 고려해 봐야겠습니다.</p><ol><li>후이수님 블로그 포스트 — <a href="https://huisoo.tistory.com/34">[Xcode26] Unable to find module dependency 빌드 에러 해결</a></li><li><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-26-release-notes">Xcode 26 Release Notes</a></li></ol><h4>1.3. Accent</h4><p>Liquid Glass와 함께 새로운 강조 모드가 추가되면서, 강조 모드에서 위젯이 어떻게 보이는지 확인할 필요가 있습니다.</p><p>제 포스트에 사진과 함께 정리되어 있으니, 확인해 보세요</p><p><a href="https://medium.com/@chcs1370/wwdc25-%EC%9C%84%EC%A0%AF%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-27d5ee0611de">WWDC25 — 위젯의 새로운 기능</a></p><h3>2. 추후 검토해 봐야 할 부분</h3><h4>2.1. UIScene으로의 변화</h4><p><a href="https://medium.com/@chcs1370/wwdc25-uikit%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-16598a8ecbd6">WWDC25 — UIKit의 새로운 기능</a></p><p>많은 분들이 UIApplication를 기반으로 프로젝트가 구성되어 계실텐데요 애플이 UIScene 라이프사이클을 사용하도록 변경을 예고했습니다.</p><ul><li>UIApplicaiton 중심 API deprecated 예정<br>(UIWindow 용 init(windowScene:) 생성자만 남을 것)</li><li>iOS 26이후 릴리즈에서, 최신 SDK로 구축된 UIKit 앱은 전부 UIScene 라이프사이클을 사용해야만 실행 가능</li></ul><h4>2.2. Swift 6 vs. Swift 6.2</h4><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F7MGLTYxIlXs%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D7MGLTYxIlXs&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F7MGLTYxIlXs%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/170f0fef8577dc8d5b38acb81a887286/href">https://medium.com/media/170f0fef8577dc8d5b38acb81a887286/href</a></iframe><p>Swift 6를 도입하면 수많은 컴파일 에러를 마주하게 됩니다. Actor를 명시해주느라 너무 많은 작업이 필요했죠.</p><p>Swift 6.2 부터는 Actor가 명시적으로 지정되어 있지 않으면, 암시적으로 @MainActor로 간주하도록 바뀌었습니다.</p><p>아직 Swift 5 버전을 사용중이시라면, Swift 6이 아닌 Swift 6.2로 마이그레이션 하는 것을 고려해볼 만 할 것 같네요.</p><h4>3. 번외: Xcode 추가 기능</h4><p><a href="https://medium.com/@chcs1370/wwdc25-xcode-26%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-7c6b7fb627fe">WWDC25 — Xcode 26의 새로운 기능</a></p><p>Xcode에 Intelligence도입과 더불어, 쉽게 사용해 볼 수 있는 기능들이 추가되었습니다.디버그 관련 기능도 대폭 개선되었네요.</p><p>개인적으로는 Multiple word search와 #Playground를 요긴하게 쓸 것 같네요</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6075741cb4b8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WWDC25 — Xcode 26의 새로운 기능]]></title>
            <link>https://medium.com/@choiysapple/wwdc25-xcode-26%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-7c6b7fb627fe?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/7c6b7fb627fe</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[wwdc]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[xcode]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Sat, 20 Dec 2025 08:40:15 GMT</pubDate>
            <atom:updated>2025-12-20T08:40:15.524Z</atom:updated>
            <content:encoded><![CDATA[<h3>WWDC25 — Xcode 26의 새로운 기능</h3><p><a href="https://developer.apple.com/kr/videos/play/wwdc2025/247/">Xcode 26의 새로운 기능 - WWDC25 - 비디오 - Apple Developer</a></p><h3>Optimizations</h3><ul><li>용량 24% 감소</li><li>타이핑 지연 시간 50% 개선</li><li>워크스페이스 로딩 시간 40% 개선</li></ul><h3>Workspace and editing</h3><h4>Intuitive editor tabs</h4><ul><li>시작 페이지 (검색창, 최근 연 파일)</li><li>⭐️ 상단 탭 고정 기능</li></ul><h4>⭐️ Multiple word search</h4><blockquote>단어가 여러 줄에 나뉘어 있어도 검색하는 기능</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7tuiSYXR7Y7cFFmLYjRzeg.png" /></figure><h4>Coding by voice</h4><ul><li>입코딩 가능</li><li>접근성 기능에 더 가깝고, 신기하지만 실제로 사용할 일을 없을 것 같네요.</li></ul><h4>⭐️ #Playground</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pW2uf39Ijo-7H0aotxx_8Q.png" /></figure><ul><li>빌드 안해보고도 코드 실행, 결과 확인해 볼 수 있는 기능 (Playground 우측 탭 기능)</li><li>breakpoint 찍어서 po 명령어 사용하는것과 비슷하게 사용 가능</li></ul><h4>Icon Composer</h4><blockquote>OS, 테마별 아이콘 생성 기능</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RbhebQy8Wh4tkp33C-9H9Q.png" /></figure><h4>String Catalogs</h4><ul><li>타입 안정성 추가</li><li>온디바이스 모델로 자동 주석</li></ul><h3>⭐️ Intelligence</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HOVkuSZ4r-hPrvb0MczyQQ.png" /></figure><ul><li>gpt에 직접 물어보는 기본 기능</li><li>프로젝트에 연결되어 있기 때문에, 기존 코드 분석 &amp; 수정까지 가능</li><li>프로젝트 맥락에 맞춰 답변할지에 관한 기능 on/off</li><li>gpt가 변경한 히스토리 백업 → 특정 시점으로 롤백, 비교</li><li>Error 발생시 자동 솔루션 제공</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/782/1*vgBrEYz-mmrgRfgx0w_aYg.png" /></figure><ul><li>원하는 모델 임포트 가능</li><li>로컬 모델도 임포트 가능</li></ul><h3>Debugging and performance</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kMmGhXhiVW_D_a_PHeOSiA.png" /></figure><ul><li>Swift Concurrency 디버깅 개선</li><li>Task의 ID 조회 가능</li><li>Task, TaskGroups, Actor 정보 표시</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Z7gjn7waTi0v9ZDvQeqYOg.png" /></figure><ul><li>비공개 리소스 접근(i.e. 카메라) 설명 없이 오류가 발생하는 경우</li><li>이제는 에러에 자세한 설명, 문서까지 제공</li></ul><h3>Instruments</h3><h4>Processor Trace</h4><ul><li>기존에는 주기적 샘플링 (비교적 정확도 떨어짐) → 측정 방법 변경으로 거의 모든 부분을 캡쳐할 수 있음</li><li>Xcode 16.3+</li><li>iPhone 16 or M4</li></ul><h4>CPU Counters</h4><ul><li>CPU 성능 최적화 도구</li><li>병목 체크나, 더 자세한 CPU 사용량 체크</li></ul><h4>SwiftUI Percormance</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/994/1*5BNzYXFQBEWfQOt5DrSmAA.png" /></figure><ul><li>이번 SwiftUI 업데이트로 성능 상당히 개선됨</li><li>SwiftUI 전용 Instruments 지원</li><li>뷰 업데이트 시점 같은 정보 제공, 그래프화까지</li></ul><h4>Power Profiler</h4><ul><li>전력 사용량 체크</li></ul><h4>Trending Insights</h4><ul><li>Xcode 16에서 지원되었던 기능 개선</li></ul><h4>Metrics</h4><ul><li>배터리 사용량, Disk Write, Launch Time, Memory 등의 지표 체크</li><li>비슷한 앱들의 수치 제공</li></ul><h3>Building</h3><h4>Explicit Modules for Swift</h4><p><a href="https://developer.apple.com/videos/play/wwdc2024/10171/">Demystify explicitly built modules - WWDC24 - Videos - Apple Developer</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*80cvhK2aNE9thjkimQbsfw.png" /></figure><ul><li>빌드 파이프라인 분리됨</li><li>모듈 공유로 빌드 효율성 / 신뢰성 강화</li><li>코드 디버깅 속도 향상 (빌드된 모듈 재사용성 향상)</li></ul><h4>Swift Build+</h4><ul><li>스위프트 빌드 엔진개선</li></ul><h3>Enhance Security</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iLFy7OenDWrPvp3ZIe7KWw.png" /></figure><ul><li>Xcode의 Signing &amp; Capabilities에서 지원하는 정보 보호 기능</li></ul><h3>Testing</h3><h4>UI Test Recording</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fIJSxm5s2gWtu2Uowk_i0A.png" /></figure><ul><li>시뮬레이터에서 유저 인터렉션 녹화</li><li>녹화된 내용으로 UI 테스트 코드 자동 생성</li></ul><h4>Test Report</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WaEZbApTOtADQZAeKF44vg.png" /></figure><h4>XCTHitchMetric</h4><blockquote>UI테스트에서 발견되는 끊김 현상 기록</blockquote><pre>// XCTHitchMetric<br>func testScrollingAnimationPerformance() throws {<br>    // Custom performance test measure options.<br>    let measureOptions = XCTMeasureOptions()<br>    measureOptions.invocationOptions = .manuallyStop<br>    // App being tested.<br>    let app = XCUIApplication()<br>    // Launch app and get reference to scroll view.<br>    app.launch()<br>    let scrollView = app.scrollViews.firstMatch<br>    measure(metrics: [XCTHitchMetric(application: app)], options: measureOptions) {<br>        scrollView.swipeUp(velocity: .fast)<br>        stopMeasuring()<br>        scrollView.swipeDown(velocity: .fast)<br>    }<br>}</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7c6b7fb627fe" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WWDC25 — 위젯의 새로운 기능]]></title>
            <link>https://medium.com/@choiysapple/wwdc25-%EC%9C%84%EC%A0%AF%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-27d5ee0611de?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/27d5ee0611de</guid>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Sat, 20 Dec 2025 08:19:07 GMT</pubDate>
            <atom:updated>2025-12-20T08:24:48.254Z</atom:updated>
            <content:encoded><![CDATA[<h3>WWDC25 — 위젯의 새로운 기능</h3><p><a href="https://developer.apple.com/kr/videos/play/wwdc2025/278/">위젯의 새로운 기능 - WWDC25 - 비디오 - Apple Developer</a></p><h3>Widgets in new places</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/690/1*Kp6md5vGOhXXXmnHNW5SiQ.png" /></figure><h4>Accented Rendering mode</h4><ul><li>Liquid Glass 스타일 위젯</li><li>투명 스타일 위젯</li><li>투명 + tint color가 들어간 스타일 위젯</li><li>랜더링 방식<br>1. 위젯 컨텐츠가 강조 모드로 변경, tint color가 흰색으로 강제 지정<br>2. 뒷배경 삭제<br>3. 뒷배경을 유리 또는 tint color 효과로 변경</li><li>특정 위젯의 경우에는, 해당 랜더링에 대응하는 처리 필요</li></ul><h3>강조 모드 대응</h3><pre>struct MostFrequentBeverageWidgetView: View {<br>    @Environment(\.widgetRenderingMode) var renderingMode<br><br>    var entry: Entry<br><br>    var body: some View {<br>        ZStack {<br>            if renderingMode == .fullColor {<br>                Image(entry.beverageImage)<br>                    .resizable()<br>                    .aspectRatio(contentMode: .fill)<br>                LinearGradient(gradient: Gradient(colors: [.clear, .clear, .black.opacity(0.8)]), startPoint: .top, endPoint: .bottom)<br>            }<br>            VStack {<br>                if renderingMode == .accented {<br>                    Image(entry.beverageImage)<br>                        .resizable()<br>                        .widgetAccentedRenderingMode(.desaturated)<br>                        .aspectRatio(contentMode: .fill)<br>                }<br>                BeverageTextView()<br>            }<br>        }<br>    }<br>}</pre><ul><li>./widgetRenderingMode 환경 변수를 사용해 랜더링 모드 판단</li><li>widgetAccentedRenderingMode modifier에서 강조 모드에서 보여질 방식 설정</li></ul><h3>widgetAccentedRenderingMode</h3><h4>1. nil</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/993/1*oIoyTK95z3YLnNDvhnxMBA.png" /></figure><ul><li>기본 tint color가 이미지에 적용</li><li>iOS와 macOS는 tint color가 흰색으로 변경된 후 적용</li></ul><h4>2. accented</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1006/1*bICUJrKbd4Dul2Dt4GuTaA.png" /></figure><ul><li>이미지가 accentColor로 변경</li><li>iOS와 macOS는 흰색 / WatchOS의 경우는 와치페이스의 색상이 accentColor</li></ul><h4>3. desaturated</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/981/1*WVbn-yxID06jqueeHWUIpA.png" /></figure><ul><li>이미지 색상 채도가 낮아지는 옵션</li><li>iOS, WatchOS 동일하게 표출</li></ul><h4>4. accentedDesaturated</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1005/1*WhCHmkIY4KbTok0wpmQc3g.png" /></figure><ul><li>.desaturated + tint color 적용</li></ul><h4>5. fullColor</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/928/1*GfsBY0UpbSViI4UK_W4BHQ.png" /></figure><ul><li>이미지 풀컬러로 그대로 표출</li><li>WatchOS에서는 와치페이스와 어울리도록 이 옵션이 무시됨</li></ul><h3>Relevance widgets</h3><ul><li>WatchOS에서 필요할 때만 Widget이 Smart Stack에 표출되게 하는 기능</li></ul><h3>Widget push updates</h3><blockquote><em>여러 플랫폼에서 위젯을 최신 상태로 업데이트 하는 방법</em></blockquote><h4>TimelineReloadPolicy</h4><blockquote><em>일정 간격으로 업데이트 할 때 사용</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/632/1*Vh7wJAWKZst_DG-DIKrmIA.png" /></figure><ul><li>WidgetKit이 Widget에 타임라인 요청</li><li>Widget은 TimelineReloadPolicy를 포함한 타임라인 정보 반환</li><li>WidgetKit에서 위젯을 업데이트할 적절한 시간 결정</li></ul><h4>Widget Center API → reloadAllTimelines</h4><blockquote><em>주로 앱 내에서 컨텐츠가 변경되는 경우</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/630/1*oCXvB4e_fIRq_sAzykIyZg.png" /></figure><ul><li>위젯 컨텐츠가 오래되어 업데이트가 필요함을 WidgetKit에 알림</li><li>WidgetKit이 위젯에 타임라인 요청</li><li>Widget에서 타임라인 갱신</li></ul><h4>Widget push update</h4><blockquote><em>서버나 다른 기기에서 데이터가 변경되는 경우</em></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/899/1*kCSVVFhwUnEj4NNyQol5IA.png" /></figure><ul><li>APNs를 통해서 WidgetKit에 업데이트 요청을 전달하는 방식</li><li>여러 기기에 있는 모든 위젯 최신화할 때 사용</li></ul><h4>Adding push notification support</h4><p><strong>1. </strong><strong>WidgetPushHandler 를 Widget Configuraion에 추가</strong></p><pre>// pushTokenDidChange 메서드로 서버에 푸시 토큰 &amp; 위젯 정보 전송<br>struct CaffeineTrackerPushHandler: WidgetPushHandler {<br>    func pushTokenDidChange(_ pushInfo: WidgetPushInfo, widgets: [WidgetInfo]) {<br>        // Send push token and subscription info to server<br>    }<br>}</pre><pre>// pushHandler 를 사용해 푸시 알림에 대한 지원 등록<br>struct CaffeineTrackerWidget: Widget {<br>    var body: some WidgetConfiguration {<br>        StaticConfiguration(<br>            kind: Constants.widgetKind,<br>            provider: Provider()<br>        ) { entry in<br>            CaffeineTrackerWidgetView(entry: entry)<br>        }<br>        .configurationDisplayName(&quot;Caffeine Tracker&quot;)<br>        .pushHandler(CaffeineTrackerPushHandler.self)<br>    }<br>}</pre><p><strong>2. Push Notification entitlement 추가</strong></p><ul><li>푸시를 사용하는 기능이니, entitlement 작업이 필요합니다.</li></ul><p><strong>3. Widget update 푸시 요청 구성</strong></p><pre>:method = POST<br>:scheme = https<br>:path = /3/device/&lt;DEVICE_TOKEN&gt;<br><br>// Headers<br>host = api.sandbox.puth.apple.com<br>apns-push-type = widgets<br>apns-topic = com.example.myApp.push-type.widgets   // 앱 번들 ID<br>{<br>    &quot;aps&quot;: {<br>        &quot;content-changed&quot;: true<br>    }<br>}<br></pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=27d5ee0611de" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WWDC25 — UIKit의 새로운 기능]]></title>
            <link>https://medium.com/@choiysapple/wwdc25-uikit%EC%9D%98-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B8%B0%EB%8A%A5-16598a8ecbd6?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/16598a8ecbd6</guid>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Thu, 18 Dec 2025 11:45:05 GMT</pubDate>
            <atom:updated>2025-12-18T11:50:22.929Z</atom:updated>
            <content:encoded><![CDATA[<h3>WWDC25 — UIKit의 새로운 기능</h3><p><a href="https://developer.apple.com/kr/videos/play/wwdc2025/243/">UIKit의 새로운 기능 - WWDC25 - 비디오 - Apple Developer</a></p><h3>New design system</h3><blockquote>Liquid Glass 디자인에 맞게 변경되었습니다</blockquote><h3>Containers and adaptivity</h3><blockquote>iPadOS와 MacOS에서 반응형 UI 관련 부분이 변경되었습니다.</blockquote><h3>The menu bar</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1pbSKAfGHFQ-wh-CGgeC2g.png" /></figure><ul><li>iPad에 macOS의 메뉴 막대가 등장합니다.</li><li>기존 Storyboard로 지원하던 menubar 미지원이기 때문에 직접 구현해야 합니다.</li></ul><h3>Architectural improvements</h3><h4>Automatic observation tracking</h4><blockquote><em>UIKit에서 Swift Observable 지원 기능 추가</em></blockquote><ul><li>layoutSubViews() 처럼 update 메서드에 연결 → 수동 setNeedsLayout 없어도 된다!</li><li>Info.plist의 UIObservationTrackingEnabled 추가해 재배포하면 iOS 18 에서도 지원 가능 (iOS 26에선 default)</li></ul><pre>// Using an Observable object and automatic observation tracking<br>@Observable class UnreadMessagesModel {<br>    var showStatus: Bool<br>    var statusText: String<br>}<br>class MessageListViewController: UIViewController {<br>    var unreadMessagesModel: UnreadMessagesModel<br>    var statusLabel: UILabel<br>    override func viewWillLayoutSubviews() {<br>        super.viewWillLayoutSubviews()<br>        statusLabel.alpha = unreadMessagesModel.showStatus ? 1.0 : 0.0<br>        statusLabel.text = unreadMessagesModel.statusText<br>    }<br>}</pre><ul><li>@Observable 객체인 UnreadMessagesModel 가 변경<br> → viewWillLayoutSubviews() 가 동작하면서 자동으로 화면 업데이트</li></ul><pre>// Configuring a UICollectionView cell with automatic observation tracking<br>@Observable class ListItemModel {<br>    var icon: UIImage<br>    var title: String<br>    var subtitle: String<br>}<br>func collectionView(<br>    _ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath<br>) -&gt; UICollectionViewCell {<br>    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: &quot;Cell&quot;, for: indexPath)<br>    let listItemModel = listItemModel(for: indexPath)<br>    cell.configurationUpdateHandler = { cell, state in<br>        var content = UIListContentConfiguration.subtitleCell()<br>        content.image = listItemModel.icon<br>        content.text = listItemModel.title<br>        content.secondaryText = listItemModel.subtitle<br>        cell.contentConfiguration = content<br>    }<br>    return cell<br>}</pre><ul><li>cell에 관찰 추적을 지원하는 configurationUpdateHandler 사용</li><li>해당 메서드 내부의 handler closure에서 @Observable 사용 → 모델 handler를 재실행해 cell 업데이트</li></ul><h3>New UI update Method → updateProperties()</h3><ul><li>UIView 와 UIViewController 에 추가된 메서드</li><li>layoutSubviews() 직전에 실행 But 독립적이기 때문에 레이아웃 강제 없이 속성 무효화 / 세밀한 업데이트 가능</li><li>layoutSubviews() 대체가 아닌 보완 (콘텐츠 추가, 스타일 적용 등)</li><li>setNeedsUpdateProperties() 를 호출해 수동으로 트리거 가능</li></ul><pre>// Using automatic observation tracking and updateProperties()<br>@Observable class BadgeModel {<br>   var badgeCount: Int?<br>}<br>class MyViewController: UIViewController {<br>   var model: BadgeModel<br>   let folderButton: UIBarButtonItem<br>    override func updateProperties() {<br>        super.updateProperties()<br>        if let badgeCount = model.badgeCount {<br>            folderButton.badge = .count(badgeCount)<br>        } else {<br>            folderButton.badge = nil<br>        }<br>   }<br>}</pre><ul><li>BadgeModel 이 변경될 떄 마다 updateProperties() 가 실행되어 badge 업데이트</li><li>layoutSubviews() 대신 updateProperties() 를 사용하면, 크기 설정 같은 코드는 동작하지 않음 → 불필요한 작업을 줄이고 성능 개선</li></ul><h3>Update passes</h3><h4>기존 Update passes</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Q3SPt89u9UOMK_d5ksSPqA.png" /><figcaption>스크린에 UI가 표시되기 전까지의 Flow</figcaption></figure><ol><li>layout pass가 먼저 실행<br>- 최상위 계층에서 부터 각 뷰의 traits 업데이트 &amp; layoutSubViews() 실행</li><li>레이아웃이 자리를 잡으면 display pass 실행<br>- 각 뷰에서 draw() 실행<br>- 더이상 어떤 뷰에도 display pass가 필요 없을 때 까지 반복</li><li>두 pass가 모두 끝나면 다음 프레임 랜더링, 화면에 UI 표시</li></ol><h3>신규 Update passes</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nfZfz4VX1bYsHHjRJgsIag.png" /></figure><ul><li>layout pass 중간에 updateProperties() 추가</li><li>trait 업데이트 직후에 실행되기 때문에, <strong>trait을 안전하게 read 가능</strong></li><li>layoutSubViews() 직전에 실행되기 때문에 <strong>미리 레이아웃 무효화 가능</strong></li></ul><h3>Automatically flush updates with animations</h3><h3>기존 Animation 동작 (iOS 18 이하)</h3><pre>// Manually animating changes with Observable objects<br>UIView.animage {<br>        // Set the new badge color on the Observable model object<br>        model.badgeColor = .red<br>// Manually flush updates on the view with animation<br>        badgeView.layoutIfNeeded()<br>}</pre><ul><li>수동으로 trait과 View 의존성을 유지하면 오류가 빈번하다</li><li>업데이트 or 애니메이션이 너무 많거나 적게 생성</li></ul><h3>Automatic flush update (iOS 26)</h3><ul><li>flushUpdates 라는 새로운 애니메이션 추가</li><li>보류하던 업데이트를 애니메이션 직전/직후에 적용 → layoutIfNeeded() 호출 필요 없음</li><li>flushUpdates 를 적용하려면 변경사항이 무조건 클로저 내에 있어야 한다</li></ul><pre>// Using the flushUpdates animation option to automatically animate updates<br>// Automatically animate changes with Observable objects<br>UIView.animate(options: .flushUpdates) {<br>    model.badgeColor = .red<br>}</pre><ul><li>@Observable 객체인 badgeColor 를 사용하는 모든 뷰가 업데이트 자동 사용</li></ul><pre>// Automatically animate changes to Auto Layout constraints<br>UIView.animate(options: .flushUpdates) {<br>    // Change the constant of a NSLayoutConstraint<br>    topSpacingConstraint.constant = 20<br>    // Change which constraints are active<br>    leadingEdgeConstraint.isActive = false<br>    trailingEdgeConstraint.isActive = true<br>}</pre><ul><li>Constraint에서도 당연히 사용 가능</li></ul><h3>Scene updates</h3><blockquote><em>SwiftUI와 UIKit의 혼용</em></blockquote><ul><li>UIHostingSceneDelegate 추가</li><li>해당 delegate를 사용하는 UIkit 앱에서 SwiftUI Scene 지원 → UIKit에 VisionOS의 몰입형 공간과 볼륨 사용 가능</li></ul><h3>General enhancements</h3><h4>HDR color support</h4><ul><li>이미지 뿐만 아니라 UI에도 HDR 색상 사용 가능</li><li>기본 색상 값 + 노출 값</li><li>기본 Color Picker에서도 노출값 지원</li></ul><pre>// Create an HDR red relative to a 2.5x peak white<br>let hdrRed = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0, linearExposure: 2.5)</pre><h3>Swift nofications</h3><blockquote><em>기존 NSNotificaiton이 NotificaitonCenter으로 변경</em></blockquote><ul><li>Strongly typed Payload → 이제 일일이 타입캐스팅 안해도 된다</li><li>Swift Concurrency 호환성 개선</li></ul><pre>// Adopting Swift notifications<br>override func viewDidLoad() {<br>    super.viewDidLoad()<br>    let keyboardObserver = NotificationCenter.default.addObserver(<br>        of: UIScreen.self<br>        for: .keyboardWillShow<br>    ) { message in<br>        UIView.animate(<br>            withDuration: message.animationDuration, delay: 0, options: .flushUpdates<br>        ) {<br>            // Use message.endFrame to animate the layout of views with the keyboard<br>            let keyboardOverlap = view.bounds.maxY - message.endFrame.minY<br>            bottomConstraint.constant = keyboardOverlap<br>        }<br>    }<br>}</pre><h3>Embrace flexibility</h3><ul><li>UIScene 으로의 변화 필요</li><li>UIApplicaiton 중심 API deprecated 예정</li><li>UIWindow 용 init(windowScene:) 생성자만 남을 것</li><li>iOS 26이후 릴리즈에서, 최신 SDK로 구축된 UIKit 앱은 전부 UIScene 라이프사이클을 사용해야만 실행 가능</li><li>UIRequieresFullScreen 이 deprecated 예정 (iPadOS)</li></ul><h3>OpenURL supprots file URLs</h3><blockquote><em>기존 openURL메서드에 파일 URL도 허용</em></blockquote><ul><li>앱에서 미지원하는 문서도 사용가능</li><li>앱에서 미지원 되는 문서는 시스템이 외부 앱을 실행하고 URL을 따라 전달</li></ul><h3>SF Symbols 7</h3><ul><li>애니메이션 모드 추가</li><li>버튼 Configuration에 적용 가능하도록 지원</li><li>컬러 랜더링 모드 추가</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=16598a8ecbd6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WWDC25 — 새로운 디자인으로 UIKit 앱 빌드하기]]></title>
            <link>https://medium.com/@choiysapple/wwdc25-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%94%94%EC%9E%90%EC%9D%B8%EC%9C%BC%EB%A1%9C-uikit-%EC%95%B1-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B8%B0-b53ffb495b67?source=rss-1add52282342------2</link>
            <guid isPermaLink="false">https://medium.com/p/b53ffb495b67</guid>
            <category><![CDATA[ios-26]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[uikit]]></category>
            <category><![CDATA[liquid-glass]]></category>
            <category><![CDATA[wwdc25]]></category>
            <dc:creator><![CDATA[Daegun Choi]]></dc:creator>
            <pubDate>Thu, 18 Dec 2025 11:34:27 GMT</pubDate>
            <atom:updated>2025-12-18T11:52:59.541Z</atom:updated>
            <content:encoded><![CDATA[<h3>WWDC25 — 새로운 디자인으로 UIKit 앱 빌드하기</h3><p><a href="https://developer.apple.com/kr/videos/play/wwdc2025/284/">새로운 디자인으로 UIKit 앱 빌드하기 - WWDC25 - 비디오 - Apple Developer</a></p><h3>Tab views and split views</h3><h4>UITabBarController</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/552/1*-3p-Fef-uReHWCp-m0czfQ.png" /><figcaption>기존처럼 영역을 차지하는게 아니라, 컨텐츠 위에 떠있는 느낌으로 변경</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/526/1*NNtfcYECWqStY9mhnDsJqQ.png" /><figcaption>스크롤시 최소화</figcaption></figure><pre>// Minimize tab bar on scroll<br>tabBarController.tabBarMinimizeBehavior = .onScrollDown</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/544/1*bFn0MS7OtexA5_mVkc-MMg.png" /><figcaption>AccessaoryView 추가됨</figcaption></figure><pre>// Add a bottom accessory<br>let nowPlayingView = NowPlayingView()<br>let accessory = UITabAccessory(contentView: nowPlayingView)<br>tabBarController.bottomAccessory = accessory</pre><h3>Navigation and toolbars</h3><blockquote>네비게이션 바의 디자인이 변경되었습니다.</blockquote><h4>Navigation의 BarButton</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/556/1*vH5xNDX2YuqTxtA8FCarpw.png" /><figcaption>barButton 알아서 그룹핑됩니다.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G9YoFpYHNxqoPDwnAsTnuA.png" /><figcaption>BarButtons 에 liquid glass스러운 옵션들 추가됩니다.</figcaption></figure><h4>Titles and Subtitles</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/564/1*ZAIvKnQCKhCT3kCbWaJlTw.png" /><figcaption>타이틀 부분 UI 변경되고, subtitle 영역이 추가됩니다.</figcaption></figure><pre>navigationItem.title = &quot;Inbox&quot;<br>navigationItem.subtitle = &quot;49 Unread&quot;</pre><h4>Bar Background</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/1*4tFkElkjZA9yeT_qkZFzbg.png" /><figcaption>투명한 bar 배경이 디폴트로 변경됩니다.</figcaption></figure><h4>네비바 스크롤 시 보이는 Edge Effect가 다른 부분에도 적용됩니다.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/512/1*q8JjUM3C8SfnemSUV4mSDw.png" /><figcaption>스크롤 뷰 위에 겹치는 뷰</figcaption></figure><pre>let interaction = UIScrollEdgeElementContainerInteraction()<br>interaction.scrollView = contentScrollView<br>interaction.edge = .bottom<br>buttonsContainerView.addInteraction(interaction)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*KME2OuL0OZqXEuv-fqfVVA.png" /><figcaption>기존처럼 보이게 설정</figcaption></figure><pre>scrollView.topEdgeEffect.style = .hard</pre><h4>스크롤 동작</h4><blockquote>1. 화면 스와이프 도중에 스크롤 가능하도록 변경됩니다.<br>2. 화면 끝이 아니더라도 스와이프 백 가능하도록 변경됩니다</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/990/1*gt8qV3Prh0_PzyVZEuGkIw.png" /></figure><h4>스와이프 정책 &amp; 커스텀</h4><ul><li>스와이프 백 될지 안될지는 시스템이 알아서 판단</li><li>스와이프 액션 같은게 있는 경우, 뒤로가기 안함</li><li>상호작용 가능한 UI가 없는 경우, 뒤로가기 지원</li><li>스와이프 기능 우선순위 설정 <br>→ 추가된 `interactiveContentPopGestureRecognizer`에 스와이프 백 실패 조건 정의</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pk5t4kvNnC9kl1bsK__6Cg.png" /></figure><h3>Presentation</h3><ul><li>Popover UI 변경</li><li>Sheet → 26 부터는 커스텀 배경 지우는걸 권장</li><li>Action Sheet의 source 추가<br>→ 기존에는 그냥 다른 곳 터치시 내려갔으나 이제 source를 정의하지 않으면 cancel 버튼 표시</li></ul><h3>Search</h3><p>상단에 위치했던 서치바가 이제 하단으로 이동</p><h4>UISwitch</h4><p>UISwitch 등의 컴포넌트 크기 변경됨<br> → <strong>기존 UI 해치지 않는지 확인 필요</strong></p><h4>UIButton</h4><p><em>Configuration</em> 에 <em>.glass()</em> 추가, 색조 커스텀 가능</p><h4>UISlider</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OjnJg3oG3w-Ctxce-DuRZQ.png" /></figure><ul><li>모멘텀, 스트레치 애니메이션 지원</li><li>눈금 추가 기능 + 값 제한 가능 (값 단위 설정, 10 씩만 설정 가능하거나 등등)</li><li>슬라이더 안에서 움직일 수 있는 범위 제한 기능</li><li>thumb 핸들 없앨 수 있음 <em>slider.sliderStyle = .thumbless</em></li></ul><h3>Custom elements</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/526/1*itmNK-ySb3uXFCAq4AFG0g.png" /></figure><ul><li>Liquid Glass ≠ UIBlurEffect</li><li>글래스 이벤트는 상호작용 가능한 레이어</li><li>다른 UI의 최상단에 위치</li><li>UIView 처럼 여러 커스텀 가능, 다크모드 지원, 애니메이션</li></ul><pre>// Adopting glass for custom views<br>let effectView = UIVisualEffectView()<br>addSubview(effectView)<br>let glassEffect = UIGlassEffect()<br>// Animating setting the effect results in a materialize animation<br>UIView.animate {<br> effectView.effect = glassEffect<br>}</pre><pre>// Animating glass out using dematerialize animation<br>UIView.animate {<br> effectView.effect = nil<br>}</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b53ffb495b67" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>