<?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[Curated iOS]]></title><description><![CDATA[iOS newsletter covering topics like Live Activities, Push Notifications, Xcode, SwiftUI, UIKit, and more.]]></description><link>https://curatedios.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!WdiJ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4eeab05a-080f-489f-9540-ebdf2363b40a_256x256.png</url><title>Curated iOS</title><link>https://curatedios.substack.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 12 May 2026 20:49:39 GMT</lastBuildDate><atom:link href="https://curatedios.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Artjoms Vorona]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[curatedios@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[curatedios@substack.com]]></itunes:email><itunes:name><![CDATA[Artjoms Vorona]]></itunes:name></itunes:owner><itunes:author><![CDATA[Artjoms Vorona]]></itunes:author><googleplay:owner><![CDATA[curatedios@substack.com]]></googleplay:owner><googleplay:email><![CDATA[curatedios@substack.com]]></googleplay:email><googleplay:author><![CDATA[Artjoms Vorona]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[#41 - In App Purchases]]></title><description><![CDATA[How to implement StoreKit 2]]></description><link>https://curatedios.substack.com/p/41-in-app-purchases</link><guid isPermaLink="false">https://curatedios.substack.com/p/41-in-app-purchases</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 11 Mar 2026 08:22:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c1983f23-d52d-4ab2-a097-db8f04bb89b0_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>As developers, there are number of reasons why we build apps. It could be as part of our 9-5 jobs, just for fun to gain knowledge of new technologies, to make world better, or to gain the income.</em></p><p><em>If you haven&#8217;t yet added In-App Purchases to your app, this issue of the Curated iOS newsletter is for you.</em></p><p></p><div><hr></div><h3><strong>Sponsor</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://insertaffiliate.com/" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0tIg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 424w, https://substackcdn.com/image/fetch/$s_!0tIg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 848w, https://substackcdn.com/image/fetch/$s_!0tIg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 1272w, https://substackcdn.com/image/fetch/$s_!0tIg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0tIg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png" width="1456" height="836" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:836,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1118562,&quot;alt&quot;:&quot;Insert Affiliate&quot;,&quot;title&quot;:&quot;Insert Affiliate&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://insertaffiliate.com/&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://curatedios.substack.com/i/187764337?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Insert Affiliate" title="Insert Affiliate" srcset="https://substackcdn.com/image/fetch/$s_!0tIg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 424w, https://substackcdn.com/image/fetch/$s_!0tIg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 848w, https://substackcdn.com/image/fetch/$s_!0tIg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 1272w, https://substackcdn.com/image/fetch/$s_!0tIg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F658c8036-4cff-4e00-961a-da7d7d0d059b_2560x1470.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://insertaffiliate.com/">Drive More App Revenue - Track In-App Affiliate Purchases with Confidence</a><br></strong>Struggling to grow your iOS app? Insert Affiliate helps you recruit affiliates, activate your users, and track in-app purchases and subscriptions with full attribution.</p><div><hr></div><p></p><p><strong>Implementing subscriptions In-App Purchases with StoreKit 2<br></strong>In this article, we can learn how to setup in-app subscription locally via Xcode for development, enable them in App Store Connect for production, and also how to present <code>SubscriptionStoreView</code> with available products.<strong><br><a href="https://www.createwithswift.com/implementing-subscriptions-in-app-purchases-with-storekit-2/">Read on Create with Swift</a></strong></p><p></p><p><strong>Migrating an iOS app from Paid up Front to Freemium<br></strong>Donny Wals explores how to switch from a paid up-front model to freemium model in the existing app. Check out his code example of the StoreKit implementation to identify users who paid for the app before the transition to the new pricing model.<strong><br><a href="https://www.donnywals.com/migrating-an-ios-app-from-paid-up-front-to-freemium/">Read on Donny Wals blog</a></strong></p><p></p><p><strong>In-App Purchase<br></strong>Here is the official StoreKit Framework documentation to support In-App Purchases and interactions with the App Store.<br><strong><a href="https://developer.apple.com/documentation/storekit/in-app-purchase">Read on Apple Developer</a></strong></p><p></p><div><hr></div><p><em>Btw, you can also subscribe to my second publication <strong><a href="https://surprisingtechstories.substack.com">Surprising Tech Stories.</a></strong></em></p><div><hr></div><p></p><p><strong>What&#8217;s new in StoreKit and In-App Purchase<br></strong>If you already familiar with StoreKit, here is WWDC25 video to learn about the latest enhancements in StoreKit API.<strong><br><a href="https://developer.apple.com/videos/play/wwdc2025/241/">Watch on Apple Developer</a></strong></p><p></p><p><strong>Mastering StoreKit 2 and Wallet Integration<br></strong>In the previous articles we&#8217;ve learn about the StoreKit implementation details in our apps, while this one guides us through integrating Wallet Passes.<strong><br><a href="https://medium.com/@amir.daliri/mastering-storekit-2-and-wallet-integration-8931c015811e">Read on Medium</a></strong></p><p></p><p><strong>iOS In-App Subscription Tutorial with StoreKit 2 and Swift<br></strong>Normally, I do not add articles from the companies (except big tech engineering blogs), but this time I allowed myself an exception. This step-by-step guide by RevenueCat is too good to miss.<br><strong><a href="https://www.revenuecat.com/blog/engineering/ios-in-app-subscription-tutorial-with-storekit-2-and-swift/">Read on RevenueCat</a></strong><br></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Launching Surprising Tech Stories]]></title><description><![CDATA[Surprising Tech Stories]]></description><link>https://curatedios.substack.com/p/launching-surprising-tech-stories</link><guid isPermaLink="false">https://curatedios.substack.com/p/launching-surprising-tech-stories</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Thu, 19 Feb 2026 09:57:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d646d638-0271-453d-b743-6c49dc510c5d_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey!</strong> &#128075;<br><br><em>I&#8217;ve launched a new newsletter -<strong> Surprising Tech Stories.</strong> </em></p><div><hr></div><p>While working on <strong>Curated iOS</strong>, I&#8217;ve constantly come across many interesting, unexpected, and sometimes even funny stories from tech history. For example,  how Apple once had iPod Socks among its products, or that the initial concept of YouTube was an online dating site.<br><br>So I decided to create a separate space where I can share these discoveries with you.<br><br>If you enjoy tech history or surprising and funny stories - you&#8217;ll like this one.</p><p>Here is the <a href="https://surprisingtechstories.substack.com/p/its-not-only-iphone">first issue</a>.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:188018640,&quot;url&quot;:&quot;https://surprisingtechstories.substack.com/p/its-not-only-iphone&quot;,&quot;publication_id&quot;:8016268,&quot;publication_name&quot;:&quot;Surprising Tech Stories&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!BOF4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F029feceb-2f06-43a3-8356-59dfc4907508_256x256.png&quot;,&quot;title&quot;:&quot;It's Not Only iPhone&quot;,&quot;truncated_body_text&quot;:&quot;Hello &#128075;&quot;,&quot;date&quot;:&quot;2026-02-19T07:34:49.070Z&quot;,&quot;like_count&quot;:0,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:161431092,&quot;name&quot;:&quot;Artjoms Vorona&quot;,&quot;handle&quot;:&quot;artjoms&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f46ca51e-bb56-487d-8462-0cc0910d1993_560x560.jpeg&quot;,&quot;bio&quot;:&quot;&#128241;iOS &amp; tvOS developer&quot;,&quot;profile_set_up_at&quot;:&quot;2023-08-06T07:43:43.775Z&quot;,&quot;reader_installed_at&quot;:&quot;2024-10-05T21:58:25.987Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:1843705,&quot;user_id&quot;:161431092,&quot;publication_id&quot;:1857044,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:true,&quot;publication&quot;:{&quot;id&quot;:1857044,&quot;name&quot;:&quot;Curated iOS&quot;,&quot;subdomain&quot;:&quot;curatedios&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;iOS newsletter covering topics like Live Activities, Push Notifications, Xcode, SwiftUI, UIKit, and more.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4eeab05a-080f-489f-9540-ebdf2363b40a_256x256.png&quot;,&quot;author_id&quot;:161431092,&quot;primary_user_id&quot;:161431092,&quot;theme_var_background_pop&quot;:&quot;#2096FF&quot;,&quot;created_at&quot;:&quot;2023-08-06T07:44:38.536Z&quot;,&quot;email_from_name&quot;:&quot;Curated iOS&quot;,&quot;copyright&quot;:&quot;Artjoms Vorona&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false}},{&quot;id&quot;:8201283,&quot;user_id&quot;:161431092,&quot;publication_id&quot;:8016268,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:8016268,&quot;name&quot;:&quot;Surprising Tech Stories&quot;,&quot;subdomain&quot;:&quot;surprisingtechstories&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Unexpected and even fun stories in tech companies history.\n&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/029feceb-2f06-43a3-8356-59dfc4907508_256x256.png&quot;,&quot;author_id&quot;:161431092,&quot;primary_user_id&quot;:null,&quot;theme_var_background_pop&quot;:&quot;#FF6719&quot;,&quot;created_at&quot;:&quot;2026-02-14T10:16:48.365Z&quot;,&quot;email_from_name&quot;:&quot;Surprising Tech Stories&quot;,&quot;copyright&quot;:&quot;Artjoms Vorona&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;homepage_type&quot;:&quot;newspaper&quot;,&quot;is_personal_mode&quot;:false}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;status&quot;:{&quot;bestsellerTier&quot;:null,&quot;subscriberTier&quot;:null,&quot;leaderboard&quot;:null,&quot;vip&quot;:false,&quot;badge&quot;:null,&quot;paidPublicationIds&quot;:[],&quot;subscriber&quot;:null}}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://surprisingtechstories.substack.com/p/its-not-only-iphone?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!BOF4!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F029feceb-2f06-43a3-8356-59dfc4907508_256x256.png"><span class="embedded-post-publication-name">Surprising Tech Stories</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">It's Not Only iPhone</div></div><div class="embedded-post-body">Hello &#128075;&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">3 months ago &#183; Artjoms Vorona</div></a></div><p>Take a look, subscribe, and share it with friends.<br><br>Important: <strong>Curated iOS</strong> is not going anywhere. I&#8217;ll continue delivering focused iOS development topics as usual.</p><div><hr></div><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#40 - SwiftUI Custom View Modifiers]]></title><description><![CDATA[Making the code more readable and flexible]]></description><link>https://curatedios.substack.com/p/40-swiftui-custom-view-modifiers</link><guid isPermaLink="false">https://curatedios.substack.com/p/40-swiftui-custom-view-modifiers</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 04 Feb 2026 11:45:35 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9715ae60-f4eb-4ac1-8c28-375b83dcf0f5_654x325.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>SwiftUI makes it super easy to compose and customise view, but as the UI grows, the same modifiers start appearing everywhere. This is when custom View Modifiers can be a great help.<br><br>In this issue, I&#8217;ve curated a number of articles about creating custom modifiers -  when they really help, and when simpler approach might be a better choice.</em></p><div><hr></div><p><strong>Create a Custom View Modifier in SwiftUI<br></strong>Starting with the basics, here&#8217;s a short article covering the creation of a simple custom view modifier. Did you know we can enhance custom modifiers by passing parameters?<br><strong><a href="https://medium.com/@jpmtech/create-a-custom-view-modifier-in-swiftui-b028d22162c3">Read on Medium</a></strong></p><p></p><p><strong>Crafting Effective SwiftUI ViewModifiers<br></strong>This video tutorial by Stewart Lynch will help us understand deeper how view modifiers work and they can improve code readability.<strong><br><a href="https://www.youtube.com/watch?v=XU7wdjPCXLw">Watch on YouTube</a></strong></p><p></p><p><strong>View Composition using ViewModifiers in SwiftUI<br></strong>In this article, Antoine van der Lee explains how view components can improve the development process by extracting logic into the reusable components.<br><strong><a href="https://www.avanderlee.com/swiftui/view-composition-viewmodifiers/">Read on Antoine van der Lee blog</a></strong></p><p></p><p><strong>Add custom views and modifiers to the Xcode Library<br></strong>Xcode Library is a great way to drag and drop available SwiftUI views into the Xcode Previews canvas and code. <br>Did you know you can add your own custom views and modifiers to the Xcode Library?<strong><br><a href="https://developer.apple.com/videos/play/wwdc2020/10649/">Watch on Apple Developer</a></strong></p><p></p><p><strong>Why a custom ViewModifier is often useless<br></strong>The convenience of custom View Modifier is undeniable. However, as Vincent Pradeilles shows in his article, in most cases they aren&#8217;t really needed, and there are simpler ways to achieve the same view modification result. <strong><br><a href="https://www.swiftwithvincent.com/blog/why-a-custom-viewmodifier-is-often-useless">Read on Swift with Vincent blog</a></strong><br></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em><br><br><br></p>]]></content:encoded></item><item><title><![CDATA[#39 - Liquid Glass It Is]]></title><description><![CDATA[Or not yet?]]></description><link>https://curatedios.substack.com/p/39-liquid-glass-it-is</link><guid isPermaLink="false">https://curatedios.substack.com/p/39-liquid-glass-it-is</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 21 Jan 2026 07:09:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5226b03d-d44f-42b4-9273-a105bd329851_988x558.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>I did update to iOS 26 almost on day one, and I think this UI change, which adopts the new Liquid Glass design, is one of the best (for me). </em></p><p><em>However, not everyone thinks the same. The latest reports suggest that the  install rate of iOS 26 is one the worst compared to previous releases.<br><br>Today I&#8217;ve collected a few interesting articles on Liquid Glass implementation.</em></p><div><hr></div><p><strong>Grow on iOS 26: Liquid Glass Adaptation in UIKit + SwiftUI Hybrid Architecture<br></strong>Practical experience with Liquid Glass adoption in a UIKit + SwiftUI app. This article covers various refactoring solutions used in the Grow - health management app.<strong><br><a href="https://fatbobman.com/en/posts/grow-on-ios26/?utm_source=fatbobman%20weekly%20issue%20111&amp;utm_medium=web">Read on Fatbobman blog</a></strong></p><p></p><p><strong>Liquid Glass Migration &#8212; Real world Example</strong><br>A tale in four parts on how to migrate a typical iOS app to Liquid Glass. Matej Koko&#353;inek walks us through updating TabBars, sheets, toolbars and navigation stacks.<br><strong><a href="https://medium.com/@matej-kokosinek/liquid-glass-migration-real-world-example-part-1-c1a840dd270f">Read on Medium</a></strong></p><p></p><p><strong>Build a UIKit app with the new design<br></strong>Here&#8217;s how you can create your UIKit app with the new design. Check out the official Apple Developer video covering key changes on tab views, split views, bars, presentations, search, and controls.<strong><br><a href="https://developer.apple.com/videos/play/wwdc2025/284/">Watch on Apple Developer</a></strong></p><p></p><p><strong>Understanding SwiftUI&#8217;s liquid glass button styles<br></strong>Natascha Fadeeva shows different ways to apply Liquid Glass styles to SwiftUI buttons. <strong><br><a href="https://tanaschita.com/swiftui-glass-button-style/">Read on Tanaschita blog</a></strong></p><p></p><p><strong>Disable or Opt-Out Liquid Glass in SwiftUI and UIKit | iOS 26<br></strong>In case your app&#8217;s current design doesn&#8217;t work well with Liquid Glass, here&#8217;s how you can temporary opt-out. <br><strong><a href="https://medium.com/@satish24sp/disable-or-opt-out-liquid-glass-in-swiftui-and-uikit-ios-26-5c6d55d3e8e5">Read on Medium</a></strong></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#38 - Engineering blogs]]></title><description><![CDATA[Knowledge transfer by tech companies in FY25]]></description><link>https://curatedios.substack.com/p/38-engineering-blogs</link><guid isPermaLink="false">https://curatedios.substack.com/p/38-engineering-blogs</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Mon, 22 Sep 2025 06:25:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9c301720-a874-4c85-965e-39346f0c695a_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>The</em> <em>iOS community is full of great developers who constantly write articles about building for Apple platforms. But there&#8217;s another great opportunity to learn new things - engineering blogs maintained by the tech companies. <br><br>Most of time, these blogs feature articles on non-mobile development, so finding iOS-related can be a challenge.<br><br>Each September, I look back and collect the most interesting iOS articles from engineering blogs published over past fiscal year.</em></p><div><hr></div><p><strong>How we sped up Android and iOS builds by 68% on CI<br></strong>Every detail counts: faster build times &#8594; better developer experience &#8594; happier developers. That&#8217;s the Duolingo approach. <br><br>In this article, we can learn how the team improved iOS and Android build times from 50 to under 20.<strong><br><a href="https://blog.duolingo.com/sped-up-android-ios-builds/">Read on Duolingo blog</a></strong></p><p></p><p><strong>How we think about Threads&#8217; iOS performance<br></strong>At the time of writing, the article bellow notes that the Meta Threads app had over 300 million monthly users. Measuring performance is crucial - from how quickly the app launches to how long does it takes users to post a photo or video.<br><br>The Threads iOS team disclosures some interesting app performance metrics, such as time-to-network-content or creation-publish success rate.<br><strong><a href="https://engineering.fb.com/2024/12/18/ios/how-we-think-about-threads-ios-performance/">Read on Engineering at Meta</a></strong></p><p></p><p><strong>A Behind-the-Scenes Look at How We Release the Spotify App (Part 1)<br></strong>Releasing an application to the App Store is one of the most important parts of the development process - this is when users get access to new features. That&#8217;s why it&#8217;s important to have a clear process in place. For small teams and projects, this can be straightforward. But for large like Spotify, the release process can be a real challenge.<br><br>Here&#8217;s how Spotify makes sure every new feature release doesn&#8217;t negatively impact the user experience. For them, it&#8217;s not just about releasing the main app  but also building the necessary tools to support it. <strong><br><a href="https://engineering.atspotify.com/2025/4/how-we-release-the-spotify-app-part-1">Read on Spotify Engineering</a></strong></p><p></p><p><strong>Understanding and Improving SwiftUI Performance<br></strong>For apps like Airbnb, performance is crucial.<br>But how can SwiftUI performance be improved at scale?</p><p>In this article, Cal Stephens and Miguel Jimenez from Airbnb:<br>- Discuss how SwiftUI's built-in diffing algorithm impacts the performance<br>- Explain the techniques Airbnb used to improve SwiftUI performance<strong><br><a href="https://medium.com/airbnb-engineering/understanding-and-improving-swiftui-performance-37b77ac61896">Read on Airbnb Engineering</a></strong></p><p></p><p><strong>Integrating Extensions into Large-Scale iOS apps<br></strong>Lyft has a highly modular codebase which brings various challenges when developing a separate application extension for the booking rides in Apple Maps.<br><br>In this article, Max Husar and Artur Stepaniuk explore how to manage  dependency constraints (including RAM and binary size limitations), share app extension development takeaways, and provide SiriKit integration tips.<strong><br><a href="https://eng.lyft.com/integrating-extensions-into-large-scale-ios-apps-8f15dc5f3be9">Read on Lyft Engineering</a></strong></p><p></p><p><strong>Xcode Migrations: From Stone Age to AI Mastery<br></strong>Do you think updating the code to the new iOS version is a pain?<br>No, the real one is migrating to the new Xcode!<br><br>Here is how Radu Dan and his team at Qonto are improving the Xcode migrations.<br>I personally liked the idea of the Xcode checker script.<br><strong><a href="https://medium.com/qonto-way/xcode-migrations-from-stone-age-to-ai-mastery-d2590657e809">Read on Qonto Way blog</a></strong></p><div><hr></div><p><em>If you missed last year&#8217;s Engineering blogs issue in Curated iOS, you can find it <a href="https://curatedios.substack.com/p/15-engineering-blogs">here</a>.</em></p><div><hr></div><p><strong>Unfold's Modern Mobile Release Process and the Subtle Art of Making Them Boring<br></strong>This is the second article I&#8217;m sharing about releases in this newsletter issue. But this time, the authors from Squarespace describe their release process as boring - because they don&#8217;t think much about it anymore. <br><br>It wasn&#8217;t always like this. In the past, the process often slowed mobile teams down. Here is how Squarespace moved from an eventful release process to a boring.<br><br>If I had to pick one idea from the article, it would be the concept of a <em>release captain</em>. It&#8217;s a rotation role where everyone on the team takes a turn overseeing the release.<br><strong><a href="https://engineering.squarespace.com/blog/2024/unfolds-modern-mobile-release-process-and-the-subtle-art-of-making-them-boring">Read on Squarespace Engineering</a></strong></p><p></p><p><strong>Tripadvisor MVVM-C &#8594; TCA<br></strong>The next two articles are special as they contradict each other. Debates about the &#8220;right&#8221; architecture can go on for a long time, with each side having its own truth.<br><br>In this article, the Tripadvisor team discusses how they migrated from MVVM-C to TCA.<br><strong><a href="https://medium.com/tripadvisor/the-evolution-of-native-engineering-at-tripadvisor-part-1-577cc0e36ec8">Read on Tripadvisor blog</a></strong></p><p></p><p><strong>How we used macros to promote MVVM architecture adoption<br></strong>Here&#8217;s the opposite perspective: another well-known company is sticking with MVVM.<strong><br><a href="https://blog.duolingo.com/ios-mvvm-swift-macros/">Read on Duolingo blog</a></strong><br></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li><li><p><em>Become a <a href="https://curatedios.substack.com/p/sponsor">sponsor</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em><br><br><br></p>]]></content:encoded></item><item><title><![CDATA[#37 - Apple APIs in Beta]]></title><description><![CDATA[Interesting APIs and frameworks coming in iOS 26]]></description><link>https://curatedios.substack.com/p/37-apple-apis-in-beta</link><guid isPermaLink="false">https://curatedios.substack.com/p/37-apple-apis-in-beta</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Tue, 05 Aug 2025 10:28:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/67bfbf06-8dfd-4b88-9199-3cb8bb044ef9_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>The public release of iOS 26 is just around the corner, available alongside the new iPhones. At WWDC2025, Apple introduced a bunch of new APIs and frameworks - and now is the perfect time to explore interesting ones.</em></p><div><hr></div><h3><strong>Sponsor</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://tart.run/?utm_source=curatedios&amp;utm_medium=email&amp;utm_campaign=curatedios" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Zlo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 424w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 848w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1272w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png" width="1280" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:584152,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://tart.run/?utm_source=curatedios&amp;utm_medium=email&amp;utm_campaign=curatedios&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://curatedios.substack.com/i/167790358?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!6Zlo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 424w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 848w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1272w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://tart.run/?utm_source=curatedios&amp;utm_medium=email&amp;utm_campaign=curatedios">Tart is a virtualization toolset to build, run and manage virtual machines</a><br><br></strong>Test any version of macOS in seconds or integrate directly into your CI/CD pipeline for seamless upgrades.</p><div><hr></div><p><strong>My ADHD vs. the AlarmKit API<br></strong>With the introduction of AlarmKit, developers are now able to create custom alarms and timers in their apps.<br>In this article, Jacob Bartlett dives into AlarmKit usage: authorisation, scheduling alarms, and customising UI and sounds. <br>Of course, a one-of-a-kind open-source alarm app was built &#128578; - so make sure to check it out.<br><strong><a href="https://blog.jacobstechtavern.com/p/adhd-vs-alarmkit">Read on Jacob&#8217;s Tech Tavern</a></strong></p><p></p><p><strong>Deliver age-appropriate experiences in your app</strong><br>Declared Age Range framework allows to request users to share their age range with your app. Discover the basic implementation, along with the parental controls integration.<strong><br><a href="https://dev.to/arshtechpro/wwdc-2025-deliver-age-appropriate-experiences-in-your-app-4nc8">Read on Dev.to</a></strong></p><p></p><p><strong>Working with partially generated content in Xcode previews<br></strong>The Foundation Models framework provides access to Apple&#8217;s on-device large language model, which powers Apple Intelligence to help perform intelligent tasks specific to your use case. <br>In this article, Artem Novichkov explores techniques for working with partially generated content in Xcode previews.<strong><br><a href="https://www.artemnovichkov.com/blog/working-with-partially-generated-content-in-xcode-previews">Read on Artem Novichkov Blog</a></strong></p><p></p><p><strong>Enhance child safety with PermissionKit<br></strong>Together with the Declared Age Range framework, PermissionKit helps enhance communication safety for children in your app. This framework allows to create permission requests integrated with Messages and handle parental responses.<strong><br><a href="https://developer.apple.com/videos/play/wwdc2025/293/">Watch on Apple Developer</a></strong></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li><li><p><em>Become a <a href="https://curatedios.substack.com/p/sponsor">sponsor</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p><p></p>]]></content:encoded></item><item><title><![CDATA[#36 - Swift Testing]]></title><description><![CDATA[Getting Started with Swift Testing: Basics & Migration]]></description><link>https://curatedios.substack.com/p/36-swift-testing</link><guid isPermaLink="false">https://curatedios.substack.com/p/36-swift-testing</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Tue, 22 Jul 2025 07:06:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3b1ca058-328e-47b1-9daf-8c296fbc3a82_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>I&#8217;ve seen various opinions about testing Swift code - some say it&#8217;s useless, others insist we shouldn&#8217;t ship an app without 100% test coverage. As always, the truth lies somewhere in the middle.<br><br>But one thing is clear - we need tools that are modern and easy to use.<br><br>Last year, Apple introduced a new framework - Swift Testing. Let&#8217;s explore some great resources to help us get started with it.</em></p><div><hr></div><h3><strong>Sponsor</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://tart.run/?utm_source=curatedios&amp;utm_medium=email&amp;utm_campaign=curatedios" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Zlo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 424w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 848w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1272w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png" width="1280" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:584152,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://tart.run/?utm_source=curatedios&amp;utm_medium=email&amp;utm_campaign=curatedios&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://curatedios.substack.com/i/167790358?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!6Zlo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 424w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 848w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1272w, https://substackcdn.com/image/fetch/$s_!6Zlo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa6376e-0c8e-48b1-bb35-659f21fc4454_1280x640.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://tart.run/?utm_source=curatedios&amp;utm_medium=email&amp;utm_campaign=curatedios">Tart is a virtualization toolset to build, run and manage virtual machines</a><br><br></strong>Test any version of macOS in seconds or integrate directly into your CI/CD pipeline for seamless upgrades.</p><div><hr></div><p></p><p><strong>Meet Swift Testing<br></strong>A new set of tools introduced at WWDC24, designed to make testing Swift code easier and more flexible. This WWDC session covers the core concepts, shows how to customize tests, and demonstrates how to repeat them with different arguments.<strong><br></strong><a href="https://developer.apple.com/videos/play/wwdc2024/10179/">Read on Apple Developer</a></p><p></p><p><strong>Swift Testing basics explained<br></strong>The Swift Testing framework promises a simpler and more modern alternative  to XCTest. In this post, Donny Wals walks through the basics and shows how to get started with writing first tests.<strong><br></strong><a href="https://www.donnywals.com/swift-testing-basics-explained/">Read on Donny Wals blog</a></p><p></p><p><strong>How to get started with Swift Testing<br></strong>In the next article, Vincent Pradeilles explores the main features of the Swift Testing and highlights how it differs from XCTest - including key improvements. <strong><br></strong><a href="https://www.swiftwithvincent.com/blog/how-to-get-started-with-swift-testing">Read on Swift with Vincent</a></p><p></p><p><strong>Migrating Tests from XCTest: A Comprehensive Guide<br></strong>If you&#8217;re currently using XCTest in your project but want to migrate to Swift Testing, this detailed guide by Garrett Barker is a must-read. It covers a wide range of migration scenarios - from converting Test Classes to handling Asynchronous Tests.<strong><br></strong><a href="https://medium.com/@jywvgkchm/migrating-tests-from-xctest-a-comprehensive-guide-c3e910dbe098">Read on Medium</a></p><p></p><p><strong>How to test completion handlers with Swift Testing and XCTest<br></strong>Paul Hudson shares practical examples of how to test callback-based functions using both Swift Testing and XCTest - suited for working with older, non-async code.<strong><br></strong><a href="https://www.hackingwithswift.com/quick-start/concurrency/how-to-test-completion-handlers-with-swift-testing-and-xctest">Read on Hacking with Swift</a></p><p></p><p><strong>Introducing Swift Testing. Scoping.<br></strong>Test Scoping Traits, introduced in Swift 6.1, enables a <code>Trait</code>-conforming type to provide a custom execution scope for test functions and suites, including running code before or after them.<strong><br></strong><a href="https://swiftwithmajid.com/2025/04/15/introducing-swift-testing-scoping/">Read on Swift with Majid</a></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li><li><p><em>Become a <a href="https://curatedios.substack.com/p/sponsor">sponsor</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#35 - Xcode 26]]></title><description><![CDATA[What&#8217;s new in Xcode]]></description><link>https://curatedios.substack.com/p/35-xcode-26</link><guid isPermaLink="false">https://curatedios.substack.com/p/35-xcode-26</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Thu, 10 Jul 2025 06:28:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5e33411b-df99-4590-8cce-a5ce841fc555_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;</p><p><em>June is traditionally WWDC month - the time we get a glimpse of what&#8217;s coming in Apple&#8217;s operating systems. <br><br>This year, we saw the introduction of  the new design language: Liquid Glass, and a shift to OS naming based on the year: iOS 26, tvOS 26, etc.<br><br>Of course, developers also get an updated Xcode 26, and naturally, there are some interesting new features coming to our beloved (or maybe not-so-beloved) IDE.</em></p><p><em>This issue of <strong>Curated iOS</strong> is about Xcode 26.</em></p><div><hr></div><h3><strong>Sponsor</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://swiftylaunch.com?ref=artjoms" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j0nO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!j0nO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!j0nO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!j0nO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j0nO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:394815,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://swiftylaunch.com?ref=artjoms&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://curatedios.substack.com/i/167891202?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!j0nO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!j0nO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!j0nO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!j0nO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9e8afb2-e546-4909-8903-0550fc9bf7a4_1280x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://swiftylaunch.com?ref=artjoms">SwiftyLaunch</a></strong><a href="https://swiftylaunch.com?ref=artjoms"> &#8211; Build your next iOS app in days, not weeks.</a><br><br>Tired of coding the same boilerplate features over and over? Let <strong>SwiftyLaunch</strong> handle the heavy lifting. Our powerful iOS app generator creates all the essentials&#8212;paywalls, authentication flows, push notifications, and more&#8212;so you can focus on building a remarkable user experience.<br><br><strong>Join 3000+ developers and start building apps faster than ever with SwiftyLaunch!</strong></p><div><hr></div><p></p><p><strong>WWDC25: What&#8217;s new in Xcode 26<br></strong>If you are like me, and Xcode is the only possible IDE for developing iOS apps, then this WWDC session is the first stop to discover new features we&#8217;ll be using later this autumn.<br>Over the years, Xcode download size has grown exponentially. But in Xcode 26, Apple claims the size is now much smaller thanks to dropping Intel Mac support from the downloadable package.<br><a href="https://developer.apple.com/videos/play/wwdc2025/247/">Watch on Apple Developer</a></p><p></p><p><strong>#Playground Macro: Running Code Snippets in Xcode&#8217;s canvas<br></strong>Xcode 26 lets you run code snippets directly in the project and preview them in Xcode&#8217;s canvas - no need to create a separate playground file. <br>Antoine van der Lee explores how this works using the new <code>#Playground</code> macro.<br><a href="https://www.avanderlee.com/swift/playground-macro-running-code-snippets-in-xcodes-canvas">Read on Antoine&#8217;s blog</a></p><p></p><p><strong>Adding Icon Composer icons to Xcode<br></strong>A new iOS design means new system icons - and Apple introduced dedicated tool - Icon Composer to help with that. It allows to generate specific <code>.icon</code> file you can import directly into the project. <br>Keith Harrison investigates how to use Icon Composer and add app icons to the Xcode project.<br><a href="https://useyourloaf.com/blog/adding-icon-composer-icons-to-xcode">Read on Use Your Loaf</a></p><p></p><p><strong>Xcode 26 + AI: First Impressions and Hands-On Demo with ChatGPT<br></strong>With the built in ChatGPT functionality we can now increase our productivity a little bit. Check out Pedro Rojas video with the first impressions of the Xcode and ChatGPT<strong><br></strong><a href="https://www.youtube.com/watch?v=7hZtGZ2QWcA&amp;t=19s">Watch on YouTube</a></p><p></p><p><strong>Summarizing Scores with Foundation Models, #Playground, and Xcode AI</strong><br>I&#8217;m impressed how Danny Bolella was able to transform a hand drawing into working SwitUI code using Xcode.<br><a href="https://captainswiftui.substack.com/p/summarizing-scores-with-foundation">Read on Substack</a><br></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li><li><p><em>Become a <a href="https://curatedios.substack.com/p/sponsor">sponsor</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#34 - WWDC25 Wishes]]></title><description><![CDATA[What iOS developers would love to see this year]]></description><link>https://curatedios.substack.com/p/34-wwdc25-wishes</link><guid isPermaLink="false">https://curatedios.substack.com/p/34-wwdc25-wishes</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Tue, 03 Jun 2025 06:09:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ee393066-4e7f-4437-913a-ee73a3875b51_727x413.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;</p><p><em>WWDC25 starts next week, and there are plenty of rumoured expectations -  such as Apple changing the names of its operating systems to be year-based. </em></p><p><em>In this issue, I&#8217;ve collected WWDC wishes from across the iOS development community.</em></p><div><hr></div><p><strong>WWDC25 Pre-Game Analysis and Predictions<br></strong>I personally enjoy working with Xcode and have found it more stable in the past year. However, I agree with Danny Bolella - one of his wishes this year is the native AI features, which VS Code and Cursor already offer.<br><strong><a href="https://captainswiftui.substack.com/p/wwdc25-pre-game-analysis-and-predictions">Read on Captain SwiftUI blog</a></strong></p><p></p><p><strong>WWDC 2025 Wishlist &#8211; Smarter Tools, Cleaner Code, and a Bit of Magic<br></strong>Mohammed Elnaggar shares a number of interesting wishes to be presented this WWDC. One of them is support for Xcode Cloud CI/CD in Swift Packages.<strong><br><a href="https://moelnaggar14.substack.com/p/wwdc-2025-wishlist-smarter-tools">Read SwiftMo blog</a></strong></p><p></p><p><strong>What are your WWDC wishes?<br></strong>After the last year&#8217;s experience, when Apple didn't deliver all the AI features the community expected, Donny Wals now has high hopes for announcements and improvements related to SwiftData and Concurrency.<strong><br><a href="https://www.donnywals.com/newsletters/J8owF0i5hDZMWLyFyh6n892A/">Read on Donny Wals blog</a></strong></p><p></p><p><strong>Nil Coalescing Newsletter - May 2025<br></strong>Natasha Panferova shares a list of wishes, including native API for building text editors and more advanced macOS-specific SwiftUI APIs.<strong><br><a href="https://nilcoalescing.com/newsletter/2025-05-29/">Read on Nil Coalescing blog</a></strong></p><p></p><p><strong>WWDC25 wishes<br></strong>There is no doubt that the SwiftUI Framework is now production-ready for some years, but it still hasn&#8217;t caught up with UIKit in some areas. A great example is the lack of support for displaying large collections of items with smooth performance. Majid Jabrayilov hopes Apple introduces new APIs to allow view recycling in SwiftUI.<br><strong><a href="https://swiftwithmajid.com/2025/04/08/wwdc25-wishes/">Read on Swift with Majid</a></strong></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#33 - Swift Concurrency]]></title><description><![CDATA[async/await, Tasks, Actors, GCD migration to Swift Concurrency]]></description><link>https://curatedios.substack.com/p/33-swift-concurrency</link><guid isPermaLink="false">https://curatedios.substack.com/p/33-swift-concurrency</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Mon, 26 May 2025 07:39:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/14872a54-2ebd-4b6f-adb4-c8c916bfc136_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>In this issue let&#8217;s explore collection of articles about the Swift Concurrency.</em></p><div><hr></div><p><strong>Concurrency in Swift: A Detailed Guide<br></strong>There&#8217;s no doubt that Swift Concurrency allows developers to write efficient and readable asynchronous code. However, the benefits of adopting it in existing iOS codebases that use Grand Central Dispatch (GCD) aren&#8217;t always immediately clear. <br>In this detailed guide, Gaurav Harkhani not only explains the key components of Swift Concurrency, but also provides comparison with the GCD to help us understand why to migrate when possible.<br><a href="https://medium.com/@gauravharkhani01/concurrency-in-swift-a-detailed-guide-3158941afc2e">Read on Medium</a></p><p></p><p><strong>Swift Concurrency by Example<br></strong>Swift Concurrency isn&#8217;t just <code>async/await</code> - it also is <code>Actors</code>, <code>Tasks</code> and much more. It&#8217;s a broad topic that can&#8217;t be covered in just few articles. <br>If you&#8217;re ready to dive deeper, I highly recommend this best-in-class free course by Paul Hudson.<br><a href="https://www.hackingwithswift.com/quick-start/concurrency">Read on Hacking with Swift</a></p><p></p><p><strong>Incremental Adoption<br></strong>Imagine you&#8217;re convinced and ready to migrate - but where to start, and how should you do it? <br>Check out this official documentation that explains how to gradually adopt Swift 6. Swift offers various APIs to ease transition to concurrency, such as wrapping callback-based functions using <code>continuations</code> or maintaining backward compatibility with <code>@preconcurrency</code>.  <br><a href="https://www.swift.org/migration/documentation/swift-6-concurrency-migration-guide/incrementaladoption/">Read on Swift.org</a></p><p></p><p><strong>Advanced Swift Concurrency: Understanding Tasks (Paid)<br></strong>I usually feature free articles in my newsletter, but this one is an exception - and for good reason! Jacob Bartlett&#8217;s deep dive into <code>Task</code> is too good to be missed.<br><a href="https://blog.jacobstechtavern.com/p/advanced-swift-concurrency">Read on Jacob&#8217;s Tech Tavern</a></p><p></p><p><strong>Swift 6.2: A first look at how it&#8217;s changing Concurrency<br></strong>Although Swift 6.2. hasn&#8217;t been released yet, Antoine van der Lee takes an early look at the potential changes and how they might impact Swift Concurrency.<strong><br><a href="https://www.avanderlee.com/concurrency/swift-6-2-concurrency-changes/">Read on Antoine van der Lee blog</a></strong></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#32 - Building a Video and Audio Playback App]]></title><description><![CDATA[With just a few lines of code, your app can play a video or audio]]></description><link>https://curatedios.substack.com/p/32-building-a-video-and-audio-playback</link><guid isPermaLink="false">https://curatedios.substack.com/p/32-building-a-video-and-audio-playback</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Mon, 12 May 2025 10:26:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d2351af2-d31d-458b-b3b9-c6e19bc08a68_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>After taking a few months off, I&#8217;m slowly getting back to publishing new issues of the <strong>Curated iOS</strong> newsletter. If you&#8217;ve subscribed recently - welcome! &#127881; <br><br>In this newsletter, I share iOS development articles, with each issue dedicated to a specific topic. This time, I&#8217;m focusing on something very specific: building a video and audio playback app.</em></p><div><hr></div><p><strong>How to play videos from an URL with AVPlayer and SwiftUI<br></strong>Let's kick things off with the very basics - simple AVPlayer implementation in SwiftUI. AVPlayer is Apple&#8217;s AVFoundation class to playback videos, audio and HLS streams. Desilio Neto article can help you get started with exploring the AVPlayer&#8217;s possibilities in the iOS app.<br><a href="https://medium.com/@desilio/how-to-play-videos-from-an-url-with-avplayer-and-swiftui-bd4fb076b82d">Read on Medium</a></p><p></p><p><strong>How to use VideoPlayer in SwiftUI<br></strong>This article by Gokhan Mutlu also covers the basic implementation of AVPlayer in SwiftUI. However, it goes a step further by introducing an interesting idea - using RealityKit to playback the video in an immersive environment.<strong><br></strong><a href="https://medium.com/@gokhanmutlu/how-to-use-videoplayer-in-swiftui-2fb131912978">Read on Medium</a></p><p></p><p><strong>Mastering SwiftUI and AVPlayer Integration: A Complete Guide to Timecodes and Advanced Playback Control</strong><br>Here&#8217;s another AVPlayer implementation guide - but in this article, the author shows how to build custom player controls from scratch. Additionally, Aitolkun Anarbekova explains how to use <code>UIViewControllerRepresentable</code> protocol to bridge UIKit's <code>AVPlayerViewController </code>with SwiftUI.<br><a href="https://medium.com/@tokusha.aa/mastering-swiftui-and-avplayer-integration-a-complete-guide-to-timecodes-and-advanced-playback-6ef9a88b3b8d">Read on Medium</a></p><p></p><p><strong>How to lower background music volume when playing audio in Swift<br></strong>If your app needs to play a short sound while other audio is playing in the background, you can use <code>AVAudioSession</code> to temporarily reduce background volume. This article explains how to activate your app&#8217;s audio session and deactivate it preperly. A great example of this use case is workout app that plays short sounds.<strong><br></strong><a href="https://heyrahulrs.medium.com/how-to-lower-background-music-volume-when-playing-audio-in-swift-bb5ce9ef8f00">Read on Medium</a></p><p></p><p><strong>Rock Your App&#8217;s Playback Experience with Now Playing in iOS<br></strong>The Apple ecosystem offers media playback controls on the Lock Screen and Control Center through a feature called Now Playing. When properly configured in the app, it allows users to pause/play, skip, adjust the volume, and display basic media metadata such as the title and artwork. This article by Mayank Kumar Gupta provides a detailed guide on how to integrate Now Playing into your app.<strong><br></strong><a href="https://medium.com/@mayankkumargupta/rock-your-apps-playback-experience-with-now-playing-in-ios-2ecda219406b">Read on Medium</a></p><p></p><p><strong>Implementing Background play &amp; Picture-in-Picture in SwiftUI: Building a Video Streaming App with AVPlayer and SwiftUI<br></strong>With the Picture-in-Picture (PiP) system feature, users can continue watching a video from your app while use other apps. Implementing it is as simple as setting the <code>allowsPictureInPicturePlayback</code> flag on the AVPlayer, assuming it&#8217;s properly implemented. Khondakar Afridi explains how to set up background playback along with the PiP in SwiftUI.<br><a href="https://medium.com/@afridi.khondakar/implementing-background-play-picture-in-picture-in-swiftui-building-a-video-streaming-app-with-141304b84728">Read on Medium</a></p><p></p><p><strong>Setting up SharePlay on an iOS app<br></strong>Another interesting iOS feature is SharePlay - it allows multiple people to watch a movie, listen to music, or play a game together on a FaceTime call or Messages conversation. Here is Pol Piella&#8217;s step-by-step guide to build SharePlay experience into your app, from enabling capabilities to adding the SharePlay extension.<strong><br></strong><a href="https://www.polpiella.dev/setting-up-shareplay-on-an-ios-app-from-scratch/">Read on Pol Piella blog</a></p><p></p><p><strong>AVFoundation: Create Audio-Video Compositions<br></strong>If basic audio and video play back isn&#8217;t enough, take it further by re-arranging user&#8217;s audio and video assets using <code>AVFoundation</code>&#8217;s  Audio-Video Compositions. Anubhav Rawat explains how to use <code>AVMutableComposition</code> to create a new media asset and export it to the file.<br><a href="https://medium.com/@anubhavrawat848/avfoundation-create-audio-video-compositions-e62d95b9083c">Read on Medium</a><strong><br></strong></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[Why Developers Should Speak at Conferences]]></title><description><![CDATA[Guest post from Robin Kanatzar]]></description><link>https://curatedios.substack.com/p/why-developers-should-speak-at-conferences</link><guid isPermaLink="false">https://curatedios.substack.com/p/why-developers-should-speak-at-conferences</guid><dc:creator><![CDATA[Robin Kanatzar]]></dc:creator><pubDate>Mon, 27 Jan 2025 08:17:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-o4j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-o4j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-o4j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!-o4j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!-o4j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!-o4j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-o4j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:270114,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&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_!-o4j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!-o4j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!-o4j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!-o4j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4960f88-0324-4cf6-aabb-7d9868da8ead_1024x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Happy Monday!</strong><em><br><br>I&#8217;m excited to share the first guest post in <strong>Curated iOS</strong> by <strong>Robin Kanatzar!</strong> </em></p><p><em>Robin is an experienced iOS and Android engineer, as well as an accessibility expert. She has participated in numerous conferences as a speaker and recently authored a book on how to get started with conference speaking.</em></p><p><em>In today&#8217;s <strong>Curated iOS</strong> Quick Read issue, Robin shares why developers should speak at conferences.</em></p><div><hr></div><p>Speaking at conferences sounds scary, especially if public speaking isn&#8217;t your thing, but the personal and professional benefits are 100% worth it.&nbsp;</p><p>Sharing your passion and knowledge with your peers is a great way to give back to the tech community. Think about how much you&#8217;ve learned from others through blog posts, StackOverflow answers, or YouTube videos! Speaking at conferences is your chance to say &#8220;thank you&#8221; and pay it forward.&nbsp;</p><p>If you&#8217;re from an underrepresented group in tech, you might just inspire someone else like you to take the stage, creating a ripple effect that makes the community stronger and more diverse.</p><p>Speaking gives you a professional boost as well. When you prepare a talk, you really dive into a topic and force yourself to understand it backwards and forwards so you can explain it to others. Your reputation as an expert in your field grows, you can meet potential new clients, and can even land your next job.</p><p>On a more personal note, you can make new friends who share your interests. Conferences are full of people like you who share your love of technology, and as a speaker you&#8217;re in a great position to attract friends who are passionate about your presentation topic.</p><p>Finally, don&#8217;t forget about the bonus perks: travel! Conferences happen all over the world, from Tokyo to Buenos Aires, and many will cover your travel and hotel if you&#8217;re a speaker. That means you can explore new places without breaking the bank.&nbsp;</p><p>So, if you&#8217;ve ever thought about speaking at a conference, go for it! You&#8217;ll give back to the tech community, grow as a developer, and maybe even check off a bucket-list destination along the way.</p><div><hr></div><blockquote><p>For more tips and advice about getting on stage for the first time, check out Robin&#8217;s book <strong><a href="https://payhip.com/b/vxD0b">Tech Talks: How to get started speaking at technical conferences</a></strong> <br><strong>Curated iOS</strong> newsletter subscribers can get <strong>20% off</strong> - <strong><a href="https://curatedios.substack.com/p/subscriber-benefits">Subscriber Benefits</a></strong>.</p></blockquote><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#31 - The Essential Swift Protocols]]></title><description><![CDATA[Codable, Equatable, Hashable and more]]></description><link>https://curatedios.substack.com/p/31-the-essential-swift-protocols</link><guid isPermaLink="false">https://curatedios.substack.com/p/31-the-essential-swift-protocols</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 22 Jan 2025 09:38:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c3b1de1d-1f5d-49b4-8664-cab97e2df4b8_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>Today&#8217;s topic is quite straightforward - list of some essential Swift protocols designed to improve code readability and maintainability, making them invaluable for Swift developers.</em></p><div><hr></div><h3><strong>Sponsor</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://swiftylaun.ch?ref=artjoms" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BXFq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!BXFq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!BXFq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!BXFq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BXFq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png&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;:1201461,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://swiftylaun.ch?ref=artjoms&quot;,&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_!BXFq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!BXFq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!BXFq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!BXFq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c53e17e-4be8-4cbd-883d-c47296cb50af_2400x1350.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong><a href="https://swiftylaun.ch?ref=artjoms">SwiftyLaunch</a></strong><a href="https://swiftylaun.ch?ref=artjoms"> &#8211; Build your next iOS app in days, not weeks.</a><br><br>Tired of coding the same boilerplate features over and over? Let <strong>SwiftyLaunch</strong> handle the heavy lifting. Our powerful iOS app generator creates all the essentials&#8212;paywalls, authentication flows, push notifications, and more&#8212;so you can focus on building a remarkable user experience.<br><br><strong>Grab the limited-time lifetime plan now</strong> and start launching apps faster than ever!</p><div><hr></div><p><br><strong>Understanding Codable in Swift.</strong><br><code>Codable</code> is a protocol that allows the data to be easily converted between different formats, like JSON, Property Lists, or other representations, and Swift objects. Harsha Agarwal explains how to incorporate this protocol by providing examples of encoding and decoding the data to and from JSON file.<br><a href="https://medium.com/@harshaag99/understanding-codable-in-swift-3c475efb8074">Read on Medium</a></p><p></p><p><strong>Equatable conformance in Swift explained with code examples</strong><br>Conforming to the <code>Equatable</code> protocol allows objects to be compared with one another. You can either rely on Swift's default implementation or provide custom comparison logic. In this article, <strong>Antoine van der Lee</strong> explores the implementation of <code>Equatable</code> conformance for custom types and how to make objects from third-party libraries conform to the protocol.<br><a href="https://www.avanderlee.com/swift/equatable-comparible-conformance/">Read on Antoine van der Lee&#8217;s blog</a></p><p></p><p><strong>Hashable in Swift: The Unsung Hero of Unique Identifiers</strong><br>The <code>Hashable</code> protocol allows instances to be efficiently located and compared in collections like <code>Set</code> and <code>Dictionary</code> by generating unique hash values. Norbert Grover explains how to extend control over the process of generating hash values.<br><a href="https://medium.com/@pragmaticprogramming2022/hashable-in-swift-the-unsung-hero-of-unique-identifiers-f6ba48f953f3">Read on Medium</a></p><p></p><p><strong>A Guide to Comparable in Swift: Simplifying Data Comparison</strong><br>The <code>Comparable</code> protocol allows you to compare and sort data by defining how instances of custom types should be ordered. It determines which instance comes before or after another. Here&#8217;s a quick guide with implementation examples.<br><a href="https://paigeshin1991.medium.com/a-guide-to-comparable-in-swift-simplifying-data-comparison-102848287770">Read on Medium</a></p><p></p><p><strong>How do Swift&#8217;s memberwise initializers work?</strong><br>Swift structs come with automatically generated initializers that accept values for each of their properties. Paul Hudson explains how they work, how to create custom initializers, and how to retain the automatically generated ones.<br><a href="https://www.hackingwithswift.com/quick-start/understanding-swift/how-do-swifts-memberwise-initializers-work">Read on Hacking with Swift</a></p><p></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[Monday Quick read: Why Developers Should Start a Blog or Newsletter]]></title><description><![CDATA[And Celebrating 1k Subscribers]]></description><link>https://curatedios.substack.com/p/monday-quick-read-why-developers</link><guid isPermaLink="false">https://curatedios.substack.com/p/monday-quick-read-why-developers</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Mon, 13 Jan 2025 07:22:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pAG1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pAG1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pAG1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 424w, https://substackcdn.com/image/fetch/$s_!pAG1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 848w, https://substackcdn.com/image/fetch/$s_!pAG1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 1272w, https://substackcdn.com/image/fetch/$s_!pAG1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pAG1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic" width="800" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38435,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&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_!pAG1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 424w, https://substackcdn.com/image/fetch/$s_!pAG1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 848w, https://substackcdn.com/image/fetch/$s_!pAG1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 1272w, https://substackcdn.com/image/fetch/$s_!pAG1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01ae44a0-989d-4153-9a9c-472ce7c2b93b_800x800.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Happy Monday!</strong></p><p><em><strong>Monday Quick Read </strong>is a series of short articles, where I share my personal experiences and thoughts on software development, particularly iOS.</em></p><p><em>In a previous article, I talked about <a href="https://curatedios.substack.com/p/monday-quick-read-feeling-overwhelmed">Feeling Overwhelmed with New iOS Releases?</a></em></p><div><hr></div><p>Last week, my <strong>Curated iOS</strong> newsletter reached 1,000 subscribers &#8212; a milestone I couldn&#8217;t have achieved without your support. </p><p>Reflecting on this milestone, I began thinking about the value of creating and sharing content as a developer. What motivates someone to start a blog or newsletter? Here are a few of my reasons:</p><ol><li><p><strong>Gain new knowledge</strong></p><p>As software developers, we should always be learning. However, when working on the same app or stack for an extended period, we might lose the drive to explore new frameworks or APIs provided by the system. Sometimes, we aren&#8217;t aware that certain tools or features exist, let alone know where to find them.. Writing a blog or newsletter forces us to stay curious and keep an eye out for new information.</p><p></p></li><li><p><strong>Support the developer community</strong></p><p>By writing or curating content, we can help other developers find useful information. We might even help people save some money through <a href="https://curatedios.substack.com/p/subscriber-benefits">Subscriber Benefits</a> :) </p><p></p></li><li><p><strong>Expand networking possibilities</strong></p><p>Most developers are incredibly interesting people. Building new connections opens doors to new knowledge, fresh perspectives, and exciting possibilities.</p><p></p></li><li><p><strong>Personal brand</strong></p><p>This one might be debatable, but I believe that the image a person builds around their expertise can potentially help find new opportunities.</p></li></ol><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#30 - Swift Macros]]></title><description><![CDATA[Tool for automating repetitive code]]></description><link>https://curatedios.substack.com/p/30-swift-macros</link><guid isPermaLink="false">https://curatedios.substack.com/p/30-swift-macros</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 08 Jan 2025 07:07:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/dcf938b4-8c16-4422-99a8-5a90504a5205_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>Welcome to the first issue of the <strong>Curated iOS</strong> newsletter in 2025! I wish you lots of achievements and new knowledge this year!</em></p><p><em>This issue focuses on Swift Macros, a great Swift tool for automating repetitive code and improving code readability.</em></p><div><hr></div><p></p><p><strong>Expand on Swift macros</strong><br>Swift Macros are designed to help reduce boilerplate in the codebase and make it easier to adopt complex features. This WWDC 2023 session introduces Swift Macros and covers the concepts of macro roles, compiler plugins, and syntax trees.<strong><br></strong><a href="https://developer.apple.com/videos/play/wwdc2023/10167/">Watch on Apple Developer</a></p><p></p><p><strong>Swift Macros: Detailed &amp; Practical Understanding<br></strong>This article by Can Aky&#305;ld&#305;z will help you understand the concept behind Swift Macros and how to create them in your own project.<br><a href="https://medium.com/@canakyildz/swift-macros-detailed-practical-understanding-829d88d337fb">Read on Medium</a></p><p></p><div><hr></div><blockquote><p><em><strong>Curated iOS</strong> newsletter subscribers can now get access to exclusive deals and discounts from our newsletter friends and partners! Check out the <strong><a href="https://curatedios.substack.com/p/subscriber-benefits">Subscriber benefits</a></strong> page for more details and subscribe if you haven&#8217;t already!<br><br><strong>NEW offers in this issue - subscribe to get the coupon code</strong></em></p><ul><li><p>Special deal on the <strong><a href="https://dc4p.gumroad.com/l/swift-complete-deck-of-cards-7fsd">Swift Cards</a></strong> by <strong>Luciano Schillagi</strong></p></li><li><p>15% off on the <strong><a href="https://www.mobilesystemdesign.com">Mobile System Design book</a></strong> by <strong>Tjeerd in &#8217;t Veen</strong></p></li></ul></blockquote><div><hr></div><p></p><p><strong>Deep Dive Into Macros<br></strong>In this article, the author not only explores the concept of Swift Macros but also dives into the differences between macros and functions, providing a beginner-friendly guide.<strong><br></strong><a href="https://codingwithvera.com/deep-dive-into-macros/">Read on Coding with Vera blog</a></p><p></p><p><strong>Curated list of Swift Macros</strong><br>Great collection of community-created Macros and learning resources curated by Krzysztof Zab&#322;ocki.<br><a href="https://github.com/krzysztofzablocki/Swift-Macros">Check out on GitHub</a></p><p></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#29 - async/await]]></title><description><![CDATA[How it makes the code easier to read and understand]]></description><link>https://curatedios.substack.com/p/29-asyncawait</link><guid isPermaLink="false">https://curatedios.substack.com/p/29-asyncawait</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 18 Dec 2024 11:22:28 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/063b89c3-15dd-4d57-8430-315f71054f0d_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>Writing asynchronous code has always been a bit of a challenge for iOS developers. From completion handlers to dispatch queues, it was always a struggle to read through nested code.</em></p><p><em>In this issue of <strong>Curated iOS</strong>, I&#8217;m diving into <strong>async/await</strong>, which helps eliminate the complexity of callbacks.</em></p><div><hr></div><p><strong>Async await in Swift explained with code examples</strong><br>Get an introduction to async/await, complete with refactoring examples. Antoine van der Lee covers the basics of async/await and shares his perspective on the future of the <code>Result</code> enum used in closure-based asynchronous methods.<br><a href="https://www.avanderlee.com/swift/async-await/">Read on SwiftLee blog</a></p><p></p><p><strong>Unit Testing with async/await<br></strong>Good code always comes with proper testing, and this is where Jacob Bartlett&#8217;s article comes in handy. He demonstrates how to set up your first unit tests for async/await code.<br><a href="https://blog.jacobstechtavern.com/p/async-testing-masterclass-3-the-basics">Read on Jacob&#8217;s Tech Tavern</a></p><p></p><p><strong>How to Use URLSession with Async/Await for Network Requests in Swift</strong><br>Since most apps require data to be downloaded from the internet, iOS applications extensively use the <code>URLSession</code> API to fetch data. In this article, Antoine van der Lee explains how to implement <code>URLSession</code> network requests with async/await and properly handle errors.<br><a href="https://www.avanderlee.com/concurrency/urlsession-async-await-network-requests-in-swift/">Read on SwiftLee blog</a></p><p></p><div><hr></div><blockquote><p><em><strong>Curated iOS</strong> newsletter subscribers can now get access to exclusive deals and discounts from our newsletter friends and partners! Check out the <strong><a href="https://curatedios.substack.com/p/subscriber-benefits">Subscriber benefits</a></strong> page for more details and subscribe if you haven&#8217;t already!</em></p></blockquote><div><hr></div><p><strong>Efficiently Migrating from Completion Handlers to Async-Await in Swift<br></strong>In this article, Ankita Kotadia explains how to update existing code with completion handlers using <code>withCheckedContinuation</code>. Author also discusses how to call async functions sequentially and concurrently.<strong><br></strong><a href="https://medium.com/@ankitakotadita/efficiently-migrating-from-completion-handlers-to-async-await-in-swift-ab7f55ca9ae4">Read on Medium</a></p><p></p><p><strong>3 mistakes to avoid with async / await<br></strong>Vincent Pradeilles highlights common mistakes developers might make when working with async/await code.<br><a href="https://www.swiftwithvincent.com/blog/three-mistakes-to-avoid-with-async-await-in-swift">Read on Swift with Vincent blog</a></p><p></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#28 - UIKit Architecture]]></title><description><![CDATA[Exploring key architectures for UIKit applications]]></description><link>https://curatedios.substack.com/p/28-uikit-architecture</link><guid isPermaLink="false">https://curatedios.substack.com/p/28-uikit-architecture</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 04 Dec 2024 17:55:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f384ce49-cea2-4ffb-abff-c50c4fc9e873_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>Yes, I know&#8212;it&#8217;s almost 2025, and everyone&#8217;s talking about SwiftUI. But let&#8217;s not forget there are still millions of lines of code written in Objective-C and Swift using UIKit.</em></p><p><em>In this issue of <strong>Curated iOS</strong>, I&#8217;m diving into some of the most popular UIKit architectures.</em></p><div><hr></div><p><br><strong>Understanding Model-View-Controller (MVC)</strong><br>Starting with widely used and easy-to-implement: MVC. This article delves into the fundamentals of the Model-View-Controller pattern, exploring its components and their roles in an application, accompanied by practical examples.<strong><br></strong><a href="https://medium.com/@itsusman.saeed/understanding-model-view-controller-mvc-55a81fb251fc">Read on Medium</a></p><p></p><p><strong>MVVM Architecture in iOS App</strong><br>The next natural step in exploring iOS architectures is the Model-View-ViewModel (MVVM) pattern, which separates the data layer (Model), presentation layer (View), and business logic (ViewModel). Gaurav Parmar breaks down each component and explains how they work together to create scalable and maintainable code.<br><a href="https://medium.com/@gauravios/mvvm-architecture-in-ios-app-b03405e2ead4">Read on Medium</a></p><div><hr></div><blockquote><p><em>I publish the <strong>Curated iOS</strong> newsletter every week &#8212; explore the <a href="https://curatedios.substack.com/archive">archive</a> of past issues.</em></p></blockquote><div><hr></div><p><br><strong>Swift MVP: A Step-by-Step Guide for Clean Code</strong><br>In this article, Gerald Brigen provides an overview of the Model-View-Presenter (MVP) architecture, along with a step-by-step implementation guide to help you write clean and maintainable code.<br><a href="https://medium.com/@gbrigens/swift-mvp-a-step-by-step-guide-for-clean-code-869ec8eb4b22">Read on Medium</a></p><p></p><p><strong>Understading Clean Architecture in iOS</strong><br>Santiago Ben&#237;tez's article helps us understand the key advantages of Clean Architecture and provides implementation details by showing how to organize code into layers to achieve a clear separation of concerns, where each layer is designed with a specific responsibility in mind.<br><a href="https://medium.com/@sbenitez73/understading-clean-architecture-in-ios-74eda18fc1f4">Read on Medium</a></p><p></p><p><strong>Navigating iOS App Architecture: MVC vs. MVVM vs. Clean Architecture</strong><br>If you need a quick refresher on what MVC, MVVM, and Clean Architecture are all about, check out Kajal Suthar's article for a concise explanation.<br><a href="https://medium.com/@kajal.suthar/navigating-ios-app-architecture-mvc-vs-mvvm-vs-clean-architecture-18fb71c83605">Read on Medium</a></p><div><hr></div><p><em>If you found this <strong>Curated iOS</strong> issue useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li><li><p><em>Share the issue with colleagues or friends who might find it helpful.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#27 - Xcode 16]]></title><description><![CDATA[What&#8217;s new in Xcode 16]]></description><link>https://curatedios.substack.com/p/27-xcode-16</link><guid isPermaLink="false">https://curatedios.substack.com/p/27-xcode-16</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 27 Nov 2024 07:44:35 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4053315d-0ff3-4d3f-8f0d-d30fc971e976_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>A few months ago, Xcode 16 was released, introducing several exciting new features for editing, building, debugging, testing, and profiling.</em></p><p><em>In this issue of <strong>Curated iOS</strong>, I take a closer look at what&#8217;s new.</em></p><div><hr></div><p></p><p><strong>What&#8217;s new in Xcode 16<br></strong>The best way to get acquainted with Xcode updates is by watching the WWDC2024 session, which covers all the new features introduced in version 16. I must say, there are a few exciting updates - long-awaited improvements to code completion, enhancements to Previews, updates in Instruments, and more.<strong><br></strong><a href="https://developer.apple.com/videos/play/wwdc2024/10135/">Watch on Apple Developer</a></p><p></p><p><strong>Discover 3 new features of Xcode 16</strong><br>Vincent Pradeilles shares a quick video highlighting small but impactful Xcode improvements that enhance the iOS development experience. I found the new Backtrace view for debugging particularly useful.<br><a href="https://www.swiftwithvincent.com/blog/discover-3-new-features-of-xcode-16">Watch on Swift With Vincent blog</a></p><p></p><div><hr></div><p></p><p><strong>Xcode Folders &amp; Groups<br></strong>Xcode 16 introduces a small change in the Project Navigator: groups are now folders by default. Developers can still revert to the old approach, and Sarah Reichelt dives into the differences between Xcode 15 and Xcode 16.<br><a href="https://troz.net/post/2024/xcode_folders_groups/">Read on Sarah Reichelt blog</a></p><p></p><p><strong>Xcode 16&#8217;s New Folder Format Explained! No More Merge Conflicts!<br></strong>Sticking with the topic of folders, I suggest checking out this video by Pedro Rojas. He breaks down the differences between the old and new formats and explains how the updated approach can help reduce merge conflicts when working in teams.<strong><br></strong><a href="https://www.youtube.com/watch?v=z94vpBgj0HY">Watch on YouTube</a></p><p></p><div><hr></div><blockquote><p><em>I publish the <strong>Curated iOS</strong> newsletter every week &#8212; explore the <a href="https://curatedios.substack.com/archive">archive</a> of past issues.</em></p></blockquote><div><hr></div><p></p><p><strong>AI features in Xcode 16: is it good?<br></strong>Predictive Code Completion is perhaps one of the most anticipated features in Xcode. In this video, Vincent Pradeilles shares his positive and negative experiences working with the Xcode 16 beta.<br><a href="https://www.swiftwithvincent.com/blog/ai-features-in-xcode-16-is-it-good">Watch on Swift With Vincent blog</a></p><p></p><p><strong>Preview Updates in Xcode 16<br></strong>In this video Stewart Lynch introduces the new enhancements to the Preview in Xcode: <code>@Previewable</code> macro and <code>PreviewModifier</code>.<strong><br></strong><a href="https://www.youtube.com/watch?v=vCkXxV12jM0">Watch on YouTube</a></p><p></p><p><strong>TabView in iOS 18 and Xcode 16</strong><br>Nicola De Filippo demonstrates the new approach to creating a TabView in SwiftUI with Xcode 16.<br><a href="https://swiftuiblog.substack.com/p/hello-world">Read on Subsctack</a></p><p></p><div><hr></div><p></p><p><strong>Getting started with Swift Testing<br></strong>At WWDC 2024, Apple introduced a new Swift Testing framework as an alternative to XCTest. This framework leverages Swift Macros to reduce the amount of repetitive test code. Check out Pol Piella's step-by-step guide on how to migrate from XCTest to Swift Testing.<strong><br></strong><a href="https://www.polpiella.dev/swift-testing">Read on Pol Piella blog</a></p><p></p><div><hr></div><p></p><p><strong>GitHub Copilot for Xcode<br></strong>While not directly tied to Xcode 16, the release of an official GitHub Copilot extension for Xcode marks a significant step for the iOS community. According to Thomas Ricouard's first impressions, it even outperforms the new built-in predictive code completion.<strong><br></strong><a href="https://dimillian.medium.com/github-copilot-for-xcode-62931a645173">Read on Medium</a></p><p></p><div><hr></div><p><em>If you found this article useful, I&#8217;d be happy if you:</em></p><ul><li><p><em>Hit the Like button.</em></p></li><li><p><em>Subscribe, if you haven&#8217;t already!</em></p></li><li><p><em>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</em></p></li><li><p><em>Share the issue with colleagues or friends who might find it helpful.</em></p></li></ul><p><em>Until next time!<br>Artjoms</em></p>]]></content:encoded></item><item><title><![CDATA[#26 - Localization in iOS]]></title><description><![CDATA[How to prepare iOS app for the global audience]]></description><link>https://curatedios.substack.com/p/26-localization-in-ios</link><guid isPermaLink="false">https://curatedios.substack.com/p/26-localization-in-ios</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 20 Nov 2024 16:46:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e8f13b6b-dad3-491b-bfa0-aab0e6f22cd5_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>The Apple App Store enables us to connect with users in 175 regions worldwide.</em></p><p><em>Today's <strong>Curated iOS</strong> issue dives into iOS app localization.</em></p><div><hr></div><p><strong>Expanding your app to new&nbsp;markets</strong><br>Apple provides a comprehensive list of steps required to be ready for the global audience. Starting from structuring the Xcode project, translating the content to localizing the product page.<br><a href="https://developer.apple.com/localization/">Read on Apple Developer</a></p><p></p><p><strong>Discover String Catalogs<br></strong>The WWDC23 session covers how to use String Catalogs for localization, including extracting, editing, exporting, and building strings in your project.<br><a href="https://developer.apple.com/videos/play/wwdc2023/10155/">Watch on Apple Developer</a></p><p></p><div><hr></div><blockquote><p><em>I publish the <strong>Curated iOS</strong> newsletter every week &#8212; explore the <a href="https://curatedios.substack.com/archive">archive</a> of past issues.</em></p></blockquote><div><hr></div><p><strong>Unleashing Global Reach: A Comprehensive Guide to Effortless iOS App Localization using GoogleSheet</strong><br>The best thing about this article by Vinodh Kumar is that it not only provides a step-by-step guide to setting up localization within Xcode, including project configuration and file creation, but also describes the challenges of managing localization without a centralized source of truth. To address this, author offers the option to use Google Sheets and provides guidance on organizing these files effectively.<br><a href="https://medium.com/@vinodh_36508/unleashing-global-reach-a-comprehensive-guide-to-effortless-ios-app-localization-using-googlesheet-447a4d969a71">Read on Medium</a></p><p></p><p><strong>iOS Localization Tutorial in SwiftUI using String Catalog</strong><br>Check out this step-by-step guide by Hoyeon Lee on creating and managing String Catalogs in a SwiftUI app with practical examples.<br><a href="https://medium.com/@hyleedevelop/ios-localization-tutorial-in-swiftui-using-string-catalog-9307953d8082">Read on Medium</a></p><p></p><p><strong>LocalizedStringResource vs LocalizedStringKey vs String<br></strong>Nick McConnell, in his article, provides a comprehensive analysis of the key localization types and explains when to use each.<strong><br></strong><a href="https://levelup.gitconnected.com/ios-localization-localizedstringresource-vs-localizedstringkey-vs-string-56cb519cf098">Read on Medium</a></p><p></p><div><hr></div><p>If you found this article useful, I&#8217;d be happy if you:</p><ul><li><p>Hit the Like button. </p></li><li><p>Subscribe, if you haven&#8217;t already!</p></li><li><p>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</p></li><li><p>Share the issue with colleagues or friends who might find it helpful.</p></li></ul><p>Until next time!<br>Artjoms<br></p>]]></content:encoded></item><item><title><![CDATA[#25 - iOS Communication Patterns]]></title><description><![CDATA[How to deal with passing data between objects in the app]]></description><link>https://curatedios.substack.com/p/25-ios-communication-patterns</link><guid isPermaLink="false">https://curatedios.substack.com/p/25-ios-communication-patterns</guid><dc:creator><![CDATA[Artjoms Vorona]]></dc:creator><pubDate>Wed, 13 Nov 2024 15:45:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/17953985-a7f3-484d-8173-172aefada5cc_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Hey iOS developer!</strong> &#128075;<br><br><em>Last week, I continued exploring iOS design patterns, with <a href="https://curatedios.substack.com/p/23-ios-creational-patterns">creational patterns </a>and previously <a href="https://curatedios.substack.com/p/24-ios-structural-patterns">structural patterns</a>.</em></p><p><em>So in today's issue, let&#8217;s have a look into iOS Communication patterns: Delegate, Target-Action, Notification-Center, Key-Value Observer (KVO).</em></p><div><hr></div><p><strong>Swift Delegate Protocol Pattern Tutorial</strong><br>To get started with the Delegate Protocol pattern in Swift, I recommend Sean Allen&#8217;s video tutorial. His clear explanations and examples make it easy to understand how this pattern enables objects to communicate and delegate tasks effectively.<br><a href="https://www.youtube.com/watch?v=qiOKO8ta1n4">Watch on YouTube</a></p><p></p><p><strong>Delegate vs Closure in iOS Development<br></strong>While closures aren't typically considered a communication pattern, Naresh Kukkala's article is an excellent resource for understanding two different ways to pass data between objects. The Delegate pattern allows one object to act on behalf of another by defining protocols that outline specific responsibilities, which are then delegated to other classes. In contrast, closures are self-contained blocks of code that can be passed around to execute specific tasks.<br><a href="https://medium.com/@nareshkukkala/delegate-vs-closure-in-ios-development-e3a27f02e8cd">Read on Medium</a></p><p></p><div><hr></div><blockquote><p><em><strong>Newsletter recommendations</strong></em></p><p><em>The iOS community is full of talented developers, and many of them run insightful newsletters and blogs. In this section, I&#8217;m excited to share recommendations for some of these great resources.</em></p><p><em>This week, I'd like to highlight the fantastic <a href="https://codingwithvera.com">Coding with Vera</a> newsletter by Vera Dias, where she shares insights and practical advice for iOS developers, covering everything from design patterns to productivity tips.</em></p></blockquote><div><hr></div><p><strong>Target-Action Explained in Swift<br></strong>The Target-Action pattern offers a straightforward way to manage user interactions in iOS. Primarily used in UIKit with controls like buttons, sliders, and views, it allows an object to respond to specific events, like a tap or a swipe. While I don&#8217;t have a specific article from the iOS community to share this time, I recommend checking out the Apple Developer documentation for an in-depth look at implementing Target-Action.<br><a href="https://developer.apple.com/documentation/uikit/views_and_controls/responding_to_control-based_events_using_target-action">Read on Apple Developer</a><br><br><strong>Bad practice: not using UIAction<br></strong>Using the traditional Target-Action approach requires action implementations to be Objective-C compatible. Vincent Pradeilles demonstrates how to improve this by leveraging the <code>addAction</code> method, introduced in iOS 14. Unlike Target-Action, <code>UIAction</code> uses closures, offering a more modern, Swift-friendly way to handle actions without the Objective-C constraints.<br><a href="https://www.swiftwithvincent.com/blog/bad-practice-not-using-uiaction">Read on Swift With Vincent</a></p><p></p><div><hr></div><blockquote><p><em>In addition to the traditional Wednesday issues, I&#8217;m also sending out Monday emails featuring a series of personal articles called Monday Quick Read.</em></p><p><em>Even though there&#8217;s no new article this week, feel free to browse the <a href="https://curatedios.substack.com/t/monday-quick-reads">archive</a> of previous articles.</em></p></blockquote><div><hr></div><p><strong>Notification Center in Swift<br></strong>The Notification Center is a tool that allows objects to broadcast and receive messages without needing a direct reference to each other. It&#8217;s commonly used to respond to specific events, like data updates or settings changes. For a deep dive into this pattern, check out Beg&#252;m &#220;nal&#8217;s article where she explores Notification Center in detail.<strong><br></strong><a href="https://medium.com/@devbegumunal/notification-center-in-swift-2836d53fac7d">Read on Medium</a></p><p></p><p><strong>Key Value Observer<br></strong>KVO is a mechanism that allows objects to observe changes to specific properties in other objects. It&#8217;s commonly used when one part of an app needs to respond to state changes in other parts. To learn more about this pattern, check out August Lin&#8217;s article, which explores KVO in depth.<strong><br></strong><a href="https://augustatseattle.medium.com/key-value-observer-bc741054e1f6">Read on Medium</a></p><p></p><div><hr></div><p>If you&#8217;ve enjoyed this article, I&#8217;d be happy if you:</p><ul><li><p>Hit the Like button. </p></li><li><p>Subscribe, if you haven&#8217;t already!</p></li><li><p>Connect with me on <a href="http://www.linkedin.com/in/artjoms-vorona">LinkedIn</a>.</p></li><li><p>Share the issue with colleagues or friends who might find it helpful.</p></li></ul><p>Until next time!<br>Artjoms<br></p>]]></content:encoded></item></channel></rss>