<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Swift App Templates &amp; Themes Blog</title>
        <link>https://iosapptemplates.com/blog/</link>
        <description>Swift App Templates &amp; Themes Blog</description>
        <lastBuildDate>Sat, 14 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[The Complete Guide to Building Production-Ready iOS Apps in SwiftUI]]></title>
            <link>https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/</link>
            <guid>https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/</guid>
            <pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Build scalable SwiftUI iOS apps faster with practical MVVM architecture, production checklists, and template playbooks for real app categories.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">February 14, 2026</span></div></div>
<p><em>Architecture, features, and templates without sacrificing quality.</em></p>
<p><img decoding="async" loading="lazy" alt="SwiftUI production workflow from idea to shipping" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjYzMCIgdmlld0JveD0iMCAwIDEyMDAgNjMwIiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0idGl0bGUgZGVzYyI+CiAgPHRpdGxlIGlkPSJ0aXRsZSI+U3dpZnRVSSBwcm9kdWN0aW9uIHdvcmtmbG93PC90aXRsZT4KICA8ZGVzYyBpZD0iZGVzYyI+V29ya2Zsb3cgZnJvbSBpZGVhIHRvIHRlbXBsYXRlIHNlbGVjdGlvbiwgYXJjaGl0ZWN0dXJlLCBmZWF0dXJlcywgYW5kIHNoaXBwaW5nIHdpdGggaXRlcmF0aW9uIGxvb3AuPC9kZXNjPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiZyIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwYTEzMjkiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWUzYjY2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjYXJkIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE3MzY1ZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMxYzRhNzQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImFjY2VudCIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMyMmQzZWUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzRkMzk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MzAiIGZpbGw9InVybCgjYmcpIi8+CiAgPHRleHQgeD0iNzgiIHk9IjkwIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iNDIiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPlN3aWZ0VUkgUHJvZHVjdGlvbiBBcHAgV29ya2Zsb3c8L3RleHQ+CiAgPHRleHQgeD0iNzgiIHk9IjEyNCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjIwIiBmaWxsPSIjYmZkNWVmIj5JZGVhIC0+IFRlbXBsYXRlIC0+IEFyY2hpdGVjdHVyZSAtPiBGZWF0dXJlcyAtPiBTaGlwPC90ZXh0PgoKICA8Zz4KICAgIDxyZWN0IHg9Ijc4IiB5PSIxODAiIHdpZHRoPSIxODQiIGhlaWdodD0iODYiIHJ4PSIxNCIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGM3M2ExIi8+CiAgICA8dGV4dCB4PSIxNzAiIHk9IjIzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmaWxsPSIjZThmNGZmIj5JZGVhPC90ZXh0PgoKICAgIDxyZWN0IHg9IjI4OCIgeT0iMTgwIiB3aWR0aD0iMTg0IiBoZWlnaHQ9Ijg2IiByeD0iMTQiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRjNzNhMSIvPgogICAgPHRleHQgeD0iMzgwIiB5PSIyMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyNCIgZmlsbD0iI2U4ZjRmZiI+VGVtcGxhdGU8L3RleHQ+CgogICAgPHJlY3QgeD0iNDk4IiB5PSIxODAiIHdpZHRoPSIxODQiIGhlaWdodD0iODYiIHJ4PSIxNCIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGM3M2ExIi8+CiAgICA8dGV4dCB4PSI1OTAiIHk9IjIzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmaWxsPSIjZThmNGZmIj5BcmNoaXRlY3R1cmU8L3RleHQ+CgogICAgPHJlY3QgeD0iNzA4IiB5PSIxODAiIHdpZHRoPSIxODQiIGhlaWdodD0iODYiIHJ4PSIxNCIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGM3M2ExIi8+CiAgICA8dGV4dCB4PSI4MDAiIHk9IjIzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmaWxsPSIjZThmNGZmIj5GZWF0dXJlczwvdGV4dD4KCiAgICA8cmVjdCB4PSI5MTgiIHk9IjE4MCIgd2lkdGg9IjE4NCIgaGVpZ2h0PSI4NiIgcng9IjE0IiBmaWxsPSJ1cmwoI2NhcmQpIiBzdHJva2U9IiM0YzczYTEiLz4KICAgIDx0ZXh0IHg9IjEwMTAiIHk9IjIzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmaWxsPSIjZThmNGZmIj5TaGlwPC90ZXh0PgoKICAgIDxwb2x5Z29uIHBvaW50cz0iMjY0LDIyMyAyODIsMjE0IDI4MiwyMzIiIGZpbGw9InVybCgjYWNjZW50KSIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI0NzQsMjIzIDQ5MiwyMTQgNDkyLDIzMiIgZmlsbD0idXJsKCNhY2NlbnQpIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjY4NCwyMjMgNzAyLDIxNCA3MDIsMjMyIiBmaWxsPSJ1cmwoI2FjY2VudCkiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iODk0LDIyMyA5MTIsMjE0IDkxMiwyMzIiIGZpbGw9InVybCgjYWNjZW50KSIvPgogIDwvZz4KCiAgPHBhdGggZD0iTTEwMTAgMjc2IEMgMTA4MCAzMzAsIDEwODAgNDUwLCA3NjAgNDUwIiBmaWxsPSJub25lIiBzdHJva2U9IiMyMmQzZWUiIHN0cm9rZS13aWR0aD0iNSIvPgogIDxwb2x5Z29uIHBvaW50cz0iNzYwLDQ1MCA3NzYsNDQyIDc3Niw0NTgiIGZpbGw9IiMyMmQzZWUiLz4KICA8dGV4dCB4PSI5ODAiIHk9IjM2MCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE4IiBmaWxsPSIjY2FlY2ZmIj5JdGVyYXRlIHdpdGggdXNlciBmZWVkYmFjazwvdGV4dD4KCiAgPHJlY3QgeD0iNzgiIHk9IjMyMCIgd2lkdGg9IjEwNDQiIGhlaWdodD0iMjQ4IiByeD0iMjAiIGZpbGw9IiMxMDI3NDciIHN0cm9rZT0iIzM3NWM4OCIvPgogIDx0ZXh0IHg9IjExMiIgeT0iMzY2IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPlByb2R1Y3Rpb24gUHJpbmNpcGxlczwvdGV4dD4KICA8dGV4dCB4PSIxMTIiIHk9IjQwMiIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjIwIiBmaWxsPSIjYzdkY2Y1Ij4xLiBLZWVwIGFyY2hpdGVjdHVyZSBib3VuZGFyaWVzIHN0YWJsZSB3aGlsZSBmZWF0dXJlcyBldm9sdmUuPC90ZXh0PgogIDx0ZXh0IHg9IjExMiIgeT0iNDM2IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjAiIGZpbGw9IiNjN2RjZjUiPjIuIFRyZWF0IHRlbXBsYXRlcyBhcyBhIGJhc2UsIG5vdCBhIGZpbmlzaGVkIHByb2R1Y3QuPC90ZXh0PgogIDx0ZXh0IHg9IjExMiIgeT0iNDcwIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjAiIGZpbGw9IiNjN2RjZjUiPjMuIFRlc3QgaW4gcmVsZWFzZSBtb2RlIGJlZm9yZSBlYWNoIEFwcCBTdG9yZSBzdWJtaXNzaW9uLjwvdGV4dD4KICA8dGV4dCB4PSIxMTIiIHk9IjUwNCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjIwIiBmaWxsPSIjYzdkY2Y1Ij40LiBVc2UgYW5hbHl0aWNzIGFuZCBjcmFzaCByZXBvcnRzIHRvIGRyaXZlIHRoZSBuZXh0IGl0ZXJhdGlvbi48L3RleHQ+Cjwvc3ZnPgo=" width="1200" height="630" class="img_Denh"></p>
<p>SwiftUI makes it easier to build beautiful iOS apps. That part is true.</p>
<p>Shipping a production-ready app is still hard.</p>
<p>The difference between a prototype and a reliable product is rarely UI polish alone. It is architecture discipline, predictable state handling, resilient networking, sane persistence choices, and release workflows that do not break every sprint.</p>
<p>This guide is for developers, agencies, and technical founders who want to ship faster without creating fragile codebases.</p>
<p>You will learn:</p>
<ul>
<li class="">When templates accelerate delivery and when they hurt</li>
<li class="">How to structure a scalable SwiftUI app with MVVM</li>
<li class="">How to plan core features that most apps need</li>
<li class="">How to approach chat and WebRTC with production constraints</li>
<li class="">How to choose templates responsibly and customize them deeply</li>
</ul>
<p>If you want a baseline catalog first, browse <a class="" href="https://iosapptemplates.com/templates/">iOS templates</a> and then come back to this guide to pick the right starting point.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="when-you-should-use-a-swiftui-template-and-when-you-shouldnt">When You Should Use a SwiftUI Template (And When You Shouldn’t)<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#when-you-should-use-a-swiftui-template-and-when-you-shouldnt" class="hash-link" aria-label="Direct link to When You Should Use a SwiftUI Template (And When You Shouldn’t)" title="Direct link to When You Should Use a SwiftUI Template (And When You Shouldn’t)" translate="no">​</a></h2>
<p>Templates are not a substitute for engineering judgment. They are an acceleration layer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="use-a-template-when">Use a template when<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#use-a-template-when" class="hash-link" aria-label="Direct link to Use a template when" title="Direct link to Use a template when" translate="no">​</a></h3>
<ul>
<li class="">You are validating an MVP and time-to-feedback matters</li>
<li class="">You are shipping repeated client apps with similar building blocks</li>
<li class="">You already know your scope and want to skip repetitive setup</li>
<li class="">You want working references for navigation, auth flow, and UI states</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="avoid-templates-when">Avoid templates when<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#avoid-templates-when" class="hash-link" aria-label="Direct link to Avoid templates when" title="Direct link to Avoid templates when" translate="no">​</a></h3>
<ul>
<li class="">Your primary goal is learning SwiftUI fundamentals from first principles</li>
<li class="">You are intentionally experimenting with architecture patterns</li>
<li class="">Your app depends on highly specialized native stacks from day one</li>
</ul>
<p>A good template removes commodity work. It should not lock your core product decisions.</p>
<p>If you want a lightweight baseline with room for customization, start from <a href="https://www.iosapptemplates.com/app-templates/swiftui-starter" target="_blank" rel="noopener noreferrer" class="">SwiftUI Starter</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-architecture-that-scales-mvvm-in-swiftui">The Architecture That Scales: MVVM in SwiftUI<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#the-architecture-that-scales-mvvm-in-swiftui" class="hash-link" aria-label="Direct link to The Architecture That Scales: MVVM in SwiftUI" title="Direct link to The Architecture That Scales: MVVM in SwiftUI" translate="no">​</a></h2>
<p>MVVM remains a practical default in SwiftUI because it maps well to declarative views and testable logic boundaries.</p>
<p>Benefits in production:</p>
<ul>
<li class="">Views stay focused on rendering and interaction</li>
<li class="">ViewModels become the state and orchestration layer</li>
<li class="">Services isolate networking, persistence, and platform integrations</li>
</ul>
<p>The primary goal is not pattern purity. It is reducing coupling so feature growth stays manageable.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="a-practical-folder-structure-for-real-apps">A practical folder structure for real apps<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#a-practical-folder-structure-for-real-apps" class="hash-link" aria-label="Direct link to A practical folder structure for real apps" title="Direct link to A practical folder structure for real apps" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-text codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token plain">App/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Features/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Auth/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Chat/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Profile/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Payments/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Core/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Networking/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Persistence/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    DesignSystem/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Analytics/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  Shared/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Components/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Utilities/</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="architecture-rules-that-prevent-scale-pain">Architecture rules that prevent scale pain<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#architecture-rules-that-prevent-scale-pain" class="hash-link" aria-label="Direct link to Architecture rules that prevent scale pain" title="Direct link to Architecture rules that prevent scale pain" translate="no">​</a></h3>
<ul>
<li class="">Keep feature modules self-contained</li>
<li class="">Keep cross-cutting concerns in <code>Core</code></li>
<li class="">Keep shared UI primitives in <code>Shared</code></li>
<li class="">Keep business rules out of <code>View</code> files</li>
<li class="">Keep network and persistence behind service boundaries</li>
</ul>
<p>Related references:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/blog/mvvm-swift/">MVVM fundamentals in Swift</a></li>
<li class=""><a class="" href="https://iosapptemplates.com/blog/mvvm-combine-swiftui/">MVVM + Combine in SwiftUI</a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="MVVM architecture for scalable SwiftUI apps" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgdmlld0JveD0iMCAwIDEyMDAgNjc1IiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0idGl0bGUgZGVzYyI+CiAgPHRpdGxlIGlkPSJ0aXRsZSI+U3dpZnRVSSBNVlZNIGFyY2hpdGVjdHVyZTwvdGl0bGU+CiAgPGRlc2MgaWQ9ImRlc2MiPkRpYWdyYW0gc2hvd2luZyBWaWV3LCBWaWV3TW9kZWwsIFNlcnZpY2VzLCBhbmQgQVBJIG9yIERhdGFiYXNlIGZsb3cuPC9kZXNjPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiZyIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwYjEzMjkiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWUzYjY2Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjYXJkIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE3MzY2MCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMxZDRhNzUiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImFjY2VudCIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMyMmQzZWUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzRkMzk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2NzUiIGZpbGw9InVybCgjYmcpIi8+CiAgPHRleHQgeD0iODAiIHk9Ijg4IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMzgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPk1WVk0gaW4gU3dpZnRVSTogUHJvZHVjdGlvbiBEYXRhIEZsb3c8L3RleHQ+CiAgPHRleHQgeD0iODAiIHk9IjEyMiIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE5IiBmaWxsPSIjYmZkNWVmIj5LZWVwIFVJIHNpbXBsZSwgbG9naWMgdGVzdGFibGUsIGFuZCBzZXJ2aWNlcyByZXBsYWNlYWJsZS48L3RleHQ+CgogIDxyZWN0IHg9IjExMCIgeT0iMjAwIiB3aWR0aD0iMjMwIiBoZWlnaHQ9IjE3MCIgcng9IjE4IiBmaWxsPSJ1cmwoI2NhcmQpIiBzdHJva2U9IiM0Zjc2YTQiLz4KICA8dGV4dCB4PSIyMjUiIHk9IjI1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjMwIiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5WaWV3PC90ZXh0PgogIDx0ZXh0IHg9IjIyNSIgeT0iMjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTgiIGZpbGw9IiNjZmUyZjkiPlN3aWZ0VUkgcmVuZGVyaW5nPC90ZXh0PgogIDx0ZXh0IHg9IjIyNSIgeT0iMzIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTgiIGZpbGw9IiNjZmUyZjkiPlVzZXIgaW50ZXJhY3Rpb248L3RleHQ+CgogIDxyZWN0IHg9IjM5MCIgeT0iMjAwIiB3aWR0aD0iMjgwIiBoZWlnaHQ9IjE3MCIgcng9IjE4IiBmaWxsPSJ1cmwoI2NhcmQpIiBzdHJva2U9IiM0Zjc2YTQiLz4KICA8dGV4dCB4PSI1MzAiIHk9IjI1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjMwIiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5WaWV3TW9kZWw8L3RleHQ+CiAgPHRleHQgeD0iNTMwIiB5PSIyOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxOCIgZmlsbD0iI2NmZTJmOSI+U3RhdGUgKyBvcmNoZXN0cmF0aW9uPC90ZXh0PgogIDx0ZXh0IHg9IjUzMCIgeT0iMzIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTgiIGZpbGw9IiNjZmUyZjkiPlZhbGlkYXRpb24gKyBtYXBwaW5nPC90ZXh0PgoKICA8cmVjdCB4PSI3MjAiIHk9IjIwMCIgd2lkdGg9IjIzMCIgaGVpZ2h0PSIxNzAiIHJ4PSIxOCIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGY3NmE0Ii8+CiAgPHRleHQgeD0iODM1IiB5PSIyNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIzMCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+U2VydmljZXM8L3RleHQ+CiAgPHRleHQgeD0iODM1IiB5PSIyOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxOCIgZmlsbD0iI2NmZTJmOSI+TmV0d29ya2luZzwvdGV4dD4KICA8dGV4dCB4PSI4MzUiIHk9IjMyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE4IiBmaWxsPSIjY2ZlMmY5Ij5QZXJzaXN0ZW5jZSArIGFuYWx5dGljczwvdGV4dD4KCiAgPHJlY3QgeD0iOTgwIiB5PSIyMDAiIHdpZHRoPSIxMjAiIGhlaWdodD0iMTcwIiByeD0iMTgiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjEwNDAiIHk9IjI1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5BUEk8L3RleHQ+CiAgPHRleHQgeD0iMTA0MCIgeT0iMjg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPkRCPC90ZXh0PgoKICA8cG9seWdvbiBwb2ludHM9IjM0MiwyODYgMzgyLDI3NCAzODIsMjk4IiBmaWxsPSJ1cmwoI2FjY2VudCkiLz4KICA8cG9seWdvbiBwb2ludHM9IjY3MiwyODYgNzEyLDI3NCA3MTIsMjk4IiBmaWxsPSJ1cmwoI2FjY2VudCkiLz4KICA8cG9seWdvbiBwb2ludHM9Ijk1MiwyODYgOTcyLDI3NCA5NzIsMjk4IiBmaWxsPSJ1cmwoI2FjY2VudCkiLz4KICA8cG9seWdvbiBwb2ludHM9IjM4MiwzMzQgMzQyLDMyMiAzNDIsMzQ2IiBmaWxsPSJ1cmwoI2FjY2VudCkiLz4KCiAgPHJlY3QgeD0iMTEwIiB5PSI0MzAiIHdpZHRoPSI5OTAiIGhlaWdodD0iMTgwIiByeD0iMjIiIGZpbGw9IiMxMDI3NDciIHN0cm9rZT0iIzM2NWI4NyIvPgogIDx0ZXh0IHg9IjE0NCIgeT0iNDgwIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjYiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPkltcGxlbWVudGF0aW9uIE5vdGVzPC90ZXh0PgogIDx0ZXh0IHg9IjE0NCIgeT0iNTE4IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjAiIGZpbGw9IiNjN2RjZjUiPi0gS2VlcCBzaWRlIGVmZmVjdHMgaW4gU2VydmljZXMsIG5vdCBpbiBWaWV3IHN0cnVjdHMuPC90ZXh0PgogIDx0ZXh0IHg9IjE0NCIgeT0iNTUwIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjAiIGZpbGw9IiNjN2RjZjUiPi0gS2VlcCBWaWV3TW9kZWwgb3V0cHV0IHN0YXRlIGV4cGxpY2l0IGFuZCB0ZXN0YWJsZS48L3RleHQ+CiAgPHRleHQgeD0iMTQ0IiB5PSI1ODIiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyMCIgZmlsbD0iI2M3ZGNmNSI+LSBLZWVwIEFQSS9EQiBjb250cmFjdHMgaXNvbGF0ZWQgZnJvbSBmZWF0dXJlIFVJIGRldGFpbHMuPC90ZXh0Pgo8L3N2Zz4K" width="1200" height="675" class="img_Denh"></p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="swiftui-state-that-matters-in-production">SwiftUI state that matters in production<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#swiftui-state-that-matters-in-production" class="hash-link" aria-label="Direct link to SwiftUI state that matters in production" title="Direct link to SwiftUI state that matters in production" translate="no">​</a></h3>
<p>A minimal, consistent state model beats over-engineering:</p>
<ul>
<li class=""><code>@State</code> for local, ephemeral view state</li>
<li class=""><code>@StateObject</code> when the view owns lifecycle</li>
<li class=""><code>@ObservedObject</code> when state is injected</li>
</ul>
<p>The anti-pattern to avoid is burying side effects inside UI layers. Keep async work in services and make state transitions explicit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="core-features-most-ios-apps-need-plan-these-early">Core Features Most iOS Apps Need (Plan These Early)<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#core-features-most-ios-apps-need-plan-these-early" class="hash-link" aria-label="Direct link to Core Features Most iOS Apps Need (Plan These Early)" title="Direct link to Core Features Most iOS Apps Need (Plan These Early)" translate="no">​</a></h2>
<p>Most teams delay these decisions until late, then pay for it during stabilization.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="authentication">Authentication<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#authentication" class="hash-link" aria-label="Direct link to Authentication" title="Direct link to Authentication" translate="no">​</a></h3>
<p>Most production apps need:</p>
<ul>
<li class="">Email/password or passwordless flow</li>
<li class="">Sign in with Apple (often mandatory for app categories)</li>
<li class="">Input validation and edge-state handling</li>
<li class="">Recovery and account state transitions</li>
</ul>
<p>Useful references:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/blog/login-screen-swiftui/">SwiftUI login screen patterns</a></li>
<li class=""><a class="" href="https://iosapptemplates.com/app-templates/iphone-login-screen-template-swift-freebie/">Free iPhone login screen template</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="data-persistence">Data persistence<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#data-persistence" class="hash-link" aria-label="Direct link to Data persistence" title="Direct link to Data persistence" translate="no">​</a></h3>
<p>Use the least complex persistence layer that satisfies your product constraints:</p>
<ul>
<li class=""><code>UserDefaults</code> for small preference flags</li>
<li class="">File storage for lightweight local assets</li>
<li class="">Core Data / SQLite for structured or offline-heavy workloads</li>
</ul>
<p>Guide:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/blog/data-persistence-ios-swift/">Data persistence in iOS with Swift</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="push-notifications">Push notifications<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#push-notifications" class="hash-link" aria-label="Direct link to Push notifications" title="Direct link to Push notifications" translate="no">​</a></h3>
<p>Push strategy affects retention and user trust:</p>
<ul>
<li class="">Ask permissions contextually, not on first launch blindly</li>
<li class="">Separate marketing pushes from transactional notifications</li>
<li class="">Support deep links to the exact destination screen</li>
</ul>
<p>Guide:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/blog/push-notifications-firebase-swift-5/">Firebase push notifications in Swift 5</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="web-content-in-native-apps">Web content in native apps<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#web-content-in-native-apps" class="hash-link" aria-label="Direct link to Web content in native apps" title="Direct link to Web content in native apps" translate="no">​</a></h3>
<p>WebView can reduce delivery time for support and legal flows:</p>
<ul>
<li class="">Terms and privacy content</li>
<li class="">CMS-driven help pages</li>
<li class="">Embedded operational content</li>
</ul>
<p>Guide:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/blog/webview-swiftui/">WebView in SwiftUI</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="payments">Payments<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#payments" class="hash-link" aria-label="Direct link to Payments" title="Direct link to Payments" translate="no">​</a></h3>
<p>Payment logic is usually underestimated during MVP planning:</p>
<ul>
<li class="">One-time vs subscription flow design</li>
<li class="">Entitlement verification strategy</li>
<li class="">Failure and refund states</li>
</ul>
<p>Template reference:</p>
<ul>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/ios-stripe-checkout-swift" target="_blank" rel="noopener noreferrer" class="">iOS Stripe Checkout Swift template</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="blueprint-building-a-real-time-chat-app-in-swiftui">Blueprint: Building a Real-Time Chat App in SwiftUI<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#blueprint-building-a-real-time-chat-app-in-swiftui" class="hash-link" aria-label="Direct link to Blueprint: Building a Real-Time Chat App in SwiftUI" title="Direct link to Blueprint: Building a Real-Time Chat App in SwiftUI" translate="no">​</a></h2>
<p>Chat is one of the best stress-tests of product architecture. It touches identity, synchronization, persistence, notifications, and high-frequency UI updates.</p>
<p>A production-ready chat baseline should include:</p>
<ul>
<li class="">Authentication + profiles</li>
<li class="">Conversation list + message list</li>
<li class="">Delivery states and retry behavior</li>
<li class="">Pagination for long threads</li>
<li class="">Offline read behavior</li>
<li class="">Push notifications for message events</li>
<li class="">Safety hooks (block/report)</li>
</ul>
<p>Reference materials:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/blog/swiftui-chat/">SwiftUI chat concepts</a></li>
<li class=""><a class="" href="https://iosapptemplates.com/docs/apps/messenger-app/real-time-chat/">Real-time iOS chat app Firebase tutorial</a></li>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/chat-ios-app-template-swift-firebase" target="_blank" rel="noopener noreferrer" class="">Swift Chat App Template</a></li>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/chat-ios-app-template-swift-firebase" target="_blank" rel="noopener noreferrer" class="">Swift iOS Chat template (Firebase realtime)</a></li>
</ul>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>Chat app shipping checklist</summary><div><div class="collapsibleContent_M73y"><ul>
<li class="">Auth and profile bootstrap flow</li>
<li class="">Conversation list with unread counters</li>
<li class="">Message list with pagination</li>
<li class="">Failed message retry handling</li>
<li class="">Offline-safe rendering and cache strategy</li>
<li class="">Notification routing into thread context</li>
<li class="">Abuse controls: report/block hooks</li>
<li class="">Analytics for core messaging events</li>
</ul></div></div></details>
<p><img decoding="async" loading="lazy" alt="SwiftUI chat interface collage with inbox, thread, and profile screens" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgdmlld0JveD0iMCAwIDEyMDAgNjc1IiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0idGl0bGUgZGVzYyI+CiAgPHRpdGxlIGlkPSJ0aXRsZSI+U3dpZnRVSSBjaGF0IFVJIGNvbGxhZ2U8L3RpdGxlPgogIDxkZXNjIGlkPSJkZXNjIj5Nb2NrIGNvbGxhZ2Ugc2hvd2luZyBjb252ZXJzYXRpb24gbGlzdCwgdGhyZWFkIHZpZXcsIGFuZCBwcm9maWxlIHBhbmVsIGZvciBjaGF0IGFwcHMuPC9kZXNjPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiZyIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwYTEzMjgiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWQzYTYzIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjYXJkIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE3Mzc2MCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMxZDRhNzQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgZmlsbD0idXJsKCNiZykiLz4KICA8dGV4dCB4PSI3NCIgeT0iODYiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIzOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+U3dpZnRVSSBDaGF0IFVJIENvbGxhZ2U8L3RleHQ+CiAgPHRleHQgeD0iNzQiIHk9IjEyMCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE5IiBmaWxsPSIjYmZkNWVmIj5Db252ZXJzYXRpb24gbGlzdCwgbWVzc2FnZSB0aHJlYWQsIGFuZCBwcm9maWxlIGNvbnRleHQgaW4gb25lIGZsb3cuPC90ZXh0PgoKICA8cmVjdCB4PSI3NCIgeT0iMTYwIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjQ1MCIgcng9IjE4IiBmaWxsPSJ1cmwoI2NhcmQpIiBzdHJva2U9IiM0Zjc2YTQiLz4KICA8dGV4dCB4PSIxMDQiIHk9IjIwNCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5Db252ZXJzYXRpb25zPC90ZXh0PgogIDxyZWN0IHg9IjEwNCIgeT0iMjI0IiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iIzJmNWQ4ZCIvPgogIDxyZWN0IHg9IjEwNCIgeT0iMjY4IiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjQ0IiByeD0iOCIgZmlsbD0iIzJmNWQ4ZCIvPgogIDxyZWN0IHg9IjEwNCIgeT0iMzIyIiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjQ0IiByeD0iOCIgZmlsbD0iIzJmNWQ4ZCIvPgogIDxyZWN0IHg9IjEwNCIgeT0iMzc2IiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjQ0IiByeD0iOCIgZmlsbD0iIzJmNWQ4ZCIvPgogIDxyZWN0IHg9IjEwNCIgeT0iNDMwIiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjQ0IiByeD0iOCIgZmlsbD0iIzJmNWQ4ZCIvPgoKICA8cmVjdCB4PSI0MzAiIHk9IjE2MCIgd2lkdGg9IjQzMCIgaGVpZ2h0PSI0NTAiIHJ4PSIxOCIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGY3NmE0Ii8+CiAgPHRleHQgeD0iNDYwIiB5PSIyMDQiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyNCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+TWVzc2FnZSBUaHJlYWQ8L3RleHQ+CiAgPHJlY3QgeD0iNDYwIiB5PSIyMzYiIHdpZHRoPSIyMjAiIGhlaWdodD0iMzYiIHJ4PSIxMiIgZmlsbD0iIzJmNWQ4ZCIvPgogIDxyZWN0IHg9IjYzMCIgeT0iMjg2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjM2IiByeD0iMTIiIGZpbGw9IiMzZjdhYWMiLz4KICA8cmVjdCB4PSI0NjAiIHk9IjMzNiIgd2lkdGg9IjI1MCIgaGVpZ2h0PSIzNiIgcng9IjEyIiBmaWxsPSIjMmY1ZDhkIi8+CiAgPHJlY3QgeD0iNjAwIiB5PSIzODYiIHdpZHRoPSIyMzAiIGhlaWdodD0iMzYiIHJ4PSIxMiIgZmlsbD0iIzNmN2FhYyIvPgogIDxyZWN0IHg9IjQ2MCIgeT0iNTM2IiB3aWR0aD0iMzcwIiBoZWlnaHQ9IjQyIiByeD0iMTAiIGZpbGw9IiMyNDRmN2UiLz4KCiAgPHJlY3QgeD0iODk2IiB5PSIxNjAiIHdpZHRoPSIyMzAiIGhlaWdodD0iNDUwIiByeD0iMTgiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjEwMTEiIHk9IjIwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5Qcm9maWxlPC90ZXh0PgogIDxjaXJjbGUgY3g9IjEwMTEiIGN5PSIyNjAiIHI9IjQyIiBmaWxsPSIjMmY1ZDhkIi8+CiAgPHJlY3QgeD0iOTQ2IiB5PSIzMjAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjQiIHJ4PSI4IiBmaWxsPSIjMmY1ZDhkIi8+CiAgPHJlY3QgeD0iOTI2IiB5PSIzNjAiIHdpZHRoPSIxNzAiIGhlaWdodD0iMTgiIHJ4PSI4IiBmaWxsPSIjMmY1ZDhkIi8+CiAgPHJlY3QgeD0iOTI2IiB5PSIzOTAiIHdpZHRoPSIxNzAiIGhlaWdodD0iMTgiIHJ4PSI4IiBmaWxsPSIjMmY1ZDhkIi8+CiAgPHJlY3QgeD0iOTI2IiB5PSI0NDAiIHdpZHRoPSIxNzAiIGhlaWdodD0iMzYiIHJ4PSIxMCIgZmlsbD0iIzNmN2FhYyIvPgoKICA8dGV4dCB4PSI3NiIgeT0iNjQ0IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTgiIGZpbGw9IiNjN2RjZjUiPkZvY3VzIHBvaW50czogdW5yZWFkIGNvdW50cywgcmV0cnkgc3RhdGVzLCBmYXN0IHRocmVhZCByZW5kZXJpbmcsIGFuZCBjbGVhciBwcm9maWxlIGNvbnRleHQuPC90ZXh0Pgo8L3N2Zz4K" width="1200" height="675" class="img_Denh"></p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="video-calls-and-webrtc-in-ios-what-you-need-to-ship-it">Video Calls and WebRTC in iOS: What You Need to Ship It<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#video-calls-and-webrtc-in-ios-what-you-need-to-ship-it" class="hash-link" aria-label="Direct link to Video Calls and WebRTC in iOS: What You Need to Ship It" title="Direct link to Video Calls and WebRTC in iOS: What You Need to Ship It" translate="no">​</a></h2>
<p>WebRTC can create strong product differentiation, but it introduces complexity in networking and device behavior.</p>
<p>Core requirements:</p>
<ul>
<li class="">Signaling layer for call negotiation</li>
<li class="">STUN/TURN for network traversal reliability</li>
<li class="">Camera and microphone permission handling</li>
<li class="">Audio session management and route switching</li>
<li class="">Reconnect behavior and degraded-network fallbacks</li>
</ul>
<p>Helpful resources and templates:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/blog/webrtc-swift/">WebRTC in Swift</a></li>
<li class=""><a href="https://www.iosapptemplates.com/all-access" target="_blank" rel="noopener noreferrer" class="">Video Conference Bundle</a></li>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/video-audio-calling-app" target="_blank" rel="noopener noreferrer" class="">Video and Audio Calling App template</a></li>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/video-audio-calling-app" target="_blank" rel="noopener noreferrer" class="">Swift Video Chat App template</a></li>
</ul>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>Video calling production checklist</summary><div><div class="collapsibleContent_M73y"><ul>
<li class="">Pre-call permission UX and fallback screens</li>
<li class="">In-call controls (mute, camera toggle, speaker, end)</li>
<li class="">Reconnect flow on network drops</li>
<li class="">Background/foreground transition handling</li>
<li class="">TURN server fallback enabled</li>
<li class="">Call quality and drop analytics</li>
</ul></div></div></details>
<p><img decoding="async" loading="lazy" alt="WebRTC signaling flow for iOS video calls with STUN and TURN" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgdmlld0JveD0iMCAwIDEyMDAgNjc1IiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0idGl0bGUgZGVzYyI+CiAgPHRpdGxlIGlkPSJ0aXRsZSI+aU9TIFdlYlJUQyBzaWduYWxpbmcgYW5kIG1lZGlhIGZsb3c8L3RpdGxlPgogIDxkZXNjIGlkPSJkZXNjIj5EaWFncmFtIHNob3dpbmcgaU9TIGNsaWVudHMsIHNpZ25hbGluZyBzZXJ2ZXIsIFNUVU4gVFVSTiBpbmZyYXN0cnVjdHVyZSwgYW5kIG1lZGlhIHBhdGguPC9kZXNjPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiZyIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwYjEzMjgiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWQzYTYyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjYXJkIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE3MzY1ZiIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMxYzRhNzQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImFjY2VudCIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMyMmQzZWUiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzRkMzk5Ii8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2NzUiIGZpbGw9InVybCgjYmcpIi8+CiAgPHRleHQgeD0iNzgiIHk9Ijg4IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMzgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPldlYlJUQyBpbiBpT1M6IFNpZ25hbGluZyBhbmQgTWVkaWEgUGF0aDwvdGV4dD4KICA8dGV4dCB4PSI3OCIgeT0iMTIyIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTkiIGZpbGw9IiNiZmQ1ZWYiPlNlcGFyYXRlIG5lZ290aWF0aW9uIGZsb3cgZnJvbSBtZWRpYSByZWxpYWJpbGl0eSBpbmZyYXN0cnVjdHVyZS48L3RleHQ+CgogIDxyZWN0IHg9IjkwIiB5PSIxOTAiIHdpZHRoPSIyMzAiIGhlaWdodD0iMTcwIiByeD0iMTgiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjIwNSIgeT0iMjUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPmlPUyBDbGllbnQgQTwvdGV4dD4KICA8dGV4dCB4PSIyMDUiIHk9IjI4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE3IiBmaWxsPSIjY2ZlMmY5Ij5jYW1lcmEgKyBtaWM8L3RleHQ+CgogIDxyZWN0IHg9IjQ4NSIgeT0iMTYwIiB3aWR0aD0iMjMwIiBoZWlnaHQ9IjEyMCIgcng9IjE4IiBmaWxsPSJ1cmwoI2NhcmQpIiBzdHJva2U9IiM0Zjc2YTQiLz4KICA8dGV4dCB4PSI2MDAiIHk9IjIxNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI2IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5TaWduYWxpbmcgU2VydmVyPC90ZXh0PgogIDx0ZXh0IHg9IjYwMCIgeT0iMjQyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIGZpbGw9IiNjZmUyZjkiPm9mZmVyIC8gYW5zd2VyIC8gSUNFPC90ZXh0PgoKICA8cmVjdCB4PSI0ODUiIHk9IjMyMCIgd2lkdGg9IjIzMCIgaGVpZ2h0PSIxMjAiIHJ4PSIxOCIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGY3NmE0Ii8+CiAgPHRleHQgeD0iNjAwIiB5PSIzNzQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyNiIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+U1RVTiAvIFRVUk48L3RleHQ+CiAgPHRleHQgeD0iNjAwIiB5PSI0MDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgZmlsbD0iI2NmZTJmOSI+TkFUIHRyYXZlcnNhbCBmYWxsYmFjazwvdGV4dD4KCiAgPHJlY3QgeD0iODgwIiB5PSIxOTAiIHdpZHRoPSIyMzAiIGhlaWdodD0iMTcwIiByeD0iMTgiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9Ijk5NSIgeT0iMjUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPmlPUyBDbGllbnQgQjwvdGV4dD4KICA8dGV4dCB4PSI5OTUiIHk9IjI4NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE3IiBmaWxsPSIjY2ZlMmY5Ij5jYW1lcmEgKyBtaWM8L3RleHQ+CgogIDxsaW5lIHgxPSIzMjAiIHkxPSIyNTAiIHgyPSI0ODUiIHkyPSIyMjAiIHN0cm9rZT0idXJsKCNhY2NlbnQpIiBzdHJva2Utd2lkdGg9IjQiLz4KICA8bGluZSB4MT0iNzE1IiB5MT0iMjIwIiB4Mj0iODgwIiB5Mj0iMjUwIiBzdHJva2U9InVybCgjYWNjZW50KSIgc3Ryb2tlLXdpZHRoPSI0Ii8+CgogIDxsaW5lIHgxPSIzMjAiIHkxPSIzMTAiIHgyPSI0ODUiIHkyPSIzNjAiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSI0Ii8+CiAgPGxpbmUgeDE9IjcxNSIgeTE9IjM2MCIgeDI9Ijg4MCIgeTI9IjMxMCIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjQiLz4KCiAgPGxpbmUgeDE9IjMyMCIgeTE9IjQ3NCIgeDI9Ijg4MCIgeTI9IjQ3NCIgc3Ryb2tlPSIjMjJkM2VlIiBzdHJva2Utd2lkdGg9IjUiLz4KICA8dGV4dCB4PSI2MDAiIHk9IjQ2NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE4IiBmaWxsPSIjZDhmMGZmIj5NZWRpYSBwYXRoIChwZWVyLXRvLXBlZXIgd2hlbiBwb3NzaWJsZSwgVFVSTiByZWxheSB3aGVuIG5lZWRlZCk8L3RleHQ+CgogIDxyZWN0IHg9IjkwIiB5PSI1MjAiIHdpZHRoPSIxMDIwIiBoZWlnaHQ9IjEyMCIgcng9IjIwIiBmaWxsPSIjMTAyNzQ3IiBzdHJva2U9IiMzNjViODciLz4KICA8dGV4dCB4PSIxMjQiIHk9IjU2NCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5SZWxpYWJpbGl0eSBjaGVja3M8L3RleHQ+CiAgPHRleHQgeD0iMTI0IiB5PSI1OTgiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxOCIgZmlsbD0iI2M3ZGNmNSI+UGVybWlzc2lvbiBmbG93LCByZWNvbm5lY3QgaGFuZGxpbmcsIGF1ZGlvIHJvdXRlIHN3aXRjaGluZywgYW5kIFRVUk4gZmFsbGJhY2sgbWV0cmljcy48L3RleHQ+Cjwvc3ZnPgo=" width="1200" height="675" class="img_Denh"></p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="template-playbooks-for-high-demand-app-types">Template Playbooks for High-Demand App Types<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#template-playbooks-for-high-demand-app-types" class="hash-link" aria-label="Direct link to Template Playbooks for High-Demand App Types" title="Direct link to Template Playbooks for High-Demand App Types" translate="no">​</a></h2>
<p>These are practical starting points, not final product blueprints.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="social-apps">Social apps<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#social-apps" class="hash-link" aria-label="Direct link to Social apps" title="Direct link to Social apps" translate="no">​</a></h3>
<p>Core features:</p>
<ul>
<li class="">Feed rendering and ranking</li>
<li class="">Media upload and profile flows</li>
<li class="">Engagement actions and moderation controls</li>
</ul>
<p>Common pitfalls:</p>
<ul>
<li class="">Scroll performance under media load</li>
<li class="">Moderation and abuse tooling gaps</li>
<li class="">Inconsistent UX states for loading/errors</li>
</ul>
<p>Starting templates:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/app-templates/swift-instagram-clone/">Swift Instagram Clone</a></li>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/facebook-clone-app" target="_blank" rel="noopener noreferrer" class="">Facebook Clone App</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="dating-apps">Dating apps<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#dating-apps" class="hash-link" aria-label="Direct link to Dating apps" title="Direct link to Dating apps" translate="no">​</a></h3>
<p>Core features:</p>
<ul>
<li class="">Profiles and matching logic</li>
<li class="">Messaging and notification loop</li>
<li class="">Safety controls (report/block)</li>
<li class="">Optional premium video call paths</li>
</ul>
<p>Common pitfalls:</p>
<ul>
<li class="">Verification and fake account handling</li>
<li class="">Safety moderation policies</li>
<li class="">Poorly designed onboarding causing low activation</li>
</ul>
<p>Starting templates:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/app-templates/swift-dating-app-template/">iOS Dating App Template</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="ecommerce-apps">Ecommerce apps<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#ecommerce-apps" class="hash-link" aria-label="Direct link to Ecommerce apps" title="Direct link to Ecommerce apps" translate="no">​</a></h3>
<p>Core features:</p>
<ul>
<li class="">Catalog, product details, cart, checkout</li>
<li class="">Order lifecycle and support touchpoints</li>
<li class="">Payment and receipt handling</li>
</ul>
<p>Common pitfalls:</p>
<ul>
<li class="">Pricing consistency and discount logic</li>
<li class="">Checkout error handling under poor networks</li>
<li class="">Inventory-state drift across app sessions</li>
</ul>
<p>Starting templates:</p>
<ul>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/ecommerce-ios-app-template-swift-iphone" target="_blank" rel="noopener noreferrer" class="">Native Ecommerce App Swift</a></li>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/ecommerce-ios-app-template-swift-iphone" target="_blank" rel="noopener noreferrer" class="">Ecommerce iPhone App Template</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="dashboard-and-admin-style-apps">Dashboard and admin-style apps<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#dashboard-and-admin-style-apps" class="hash-link" aria-label="Direct link to Dashboard and admin-style apps" title="Direct link to Dashboard and admin-style apps" translate="no">​</a></h3>
<p>Core features:</p>
<ul>
<li class="">Summaries, charts, filterable lists</li>
<li class="">Role-aware navigation and data visibility</li>
<li class="">Reliable data loading and caching strategy</li>
</ul>
<p>Common pitfalls:</p>
<ul>
<li class="">Overdense UI with weak hierarchy</li>
<li class="">Inconsistent chart semantics and state handling</li>
<li class="">Role logic hard-coded in view layer</li>
</ul>
<p>Starting points:</p>
<ul>
<li class=""><a class="" href="https://iosapptemplates.com/app-templates/swift-dashboard-app-template/">Swift Dashboard App Template</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="real-estate-listings-and-store-locator-apps">Real estate, listings, and store locator apps<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#real-estate-listings-and-store-locator-apps" class="hash-link" aria-label="Direct link to Real estate, listings, and store locator apps" title="Direct link to Real estate, listings, and store locator apps" translate="no">​</a></h3>
<p>Core features:</p>
<ul>
<li class="">Listing cards and map context</li>
<li class="">Filter flows and favorites</li>
<li class="">Lead capture and contact workflows</li>
</ul>
<p>Common pitfalls:</p>
<ul>
<li class="">Slow map rendering under dense result sets</li>
<li class="">Weak caching and stale search data</li>
<li class="">Filter UX complexity overwhelming users</li>
</ul>
<p>Starting templates:</p>
<ul>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/real-estate-iphone-app-template" target="_blank" rel="noopener noreferrer" class="">Real Estate iPhone App Template</a></li>
<li class=""><a href="https://www.iosapptemplates.com/app-templates/universal-store-locator-ios-app-template" target="_blank" rel="noopener noreferrer" class="">Universal Store Locator iOS App Template</a></li>
</ul>
<p><img decoding="async" loading="lazy" alt="iOS app category template grid for social, dating, ecommerce, dashboard, real estate, and chat" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgdmlld0JveD0iMCAwIDEyMDAgNjc1IiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0idGl0bGUgZGVzYyI+CiAgPHRpdGxlIGlkPSJ0aXRsZSI+aU9TIGFwcCBjYXRlZ29yeSBncmlkPC90aXRsZT4KICA8ZGVzYyBpZD0iZGVzYyI+VUkgZ3JpZCBmb3Igc29jaWFsLCBkYXRpbmcsIGVjb21tZXJjZSwgZGFzaGJvYXJkLCByZWFsIGVzdGF0ZSwgYW5kIGNoYXQgYXBwIGNhdGVnb3JpZXMuPC9kZXNjPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJiZyIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjEiPgogICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwYjEzMjgiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWYzYTYyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJjYXJkIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE2MzU1ZSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMxYzRhNzQiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgZmlsbD0idXJsKCNiZykiLz4KICA8dGV4dCB4PSI3MiIgeT0iODQiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIzOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+aU9TIFRlbXBsYXRlIENhdGVnb3J5IEdyaWQ8L3RleHQ+CiAgPHRleHQgeD0iNzIiIHk9IjExOCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE5IiBmaWxsPSIjYmZkNWVmIj5Db21tb24gYXBwIGNhdGVnb3JpZXMgYW5kIHRoZWlyIGNvcmUgY29udmVyc2lvbiBmbG93cy48L3RleHQ+CgogIDxyZWN0IHg9IjcyIiB5PSIxNjIiIHdpZHRoPSIzNDAiIGhlaWdodD0iMTUwIiByeD0iMTYiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPlNvY2lhbDwvdGV4dD4KICA8dGV4dCB4PSIxMDAiIHk9IjIzOCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE2IiBmaWxsPSIjY2ZlM2ZhIj5GZWVkLCBtZWRpYSwgZW5nYWdlbWVudCBsb29wczwvdGV4dD4KCiAgPHJlY3QgeD0iNDMwIiB5PSIxNjIiIHdpZHRoPSIzNDAiIGhlaWdodD0iMTUwIiByeD0iMTYiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjQ1OCIgeT0iMjA2IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPkRhdGluZzwvdGV4dD4KICA8dGV4dCB4PSI0NTgiIHk9IjIzOCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE2IiBmaWxsPSIjY2ZlM2ZhIj5Qcm9maWxlcywgbWF0Y2hpbmcsIHRydXN0ICZhbXA7IHNhZmV0eTwvdGV4dD4KCiAgPHJlY3QgeD0iNzg4IiB5PSIxNjIiIHdpZHRoPSIzNDAiIGhlaWdodD0iMTUwIiByeD0iMTYiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjgxNiIgeT0iMjA2IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPkVjb21tZXJjZTwvdGV4dD4KICA8dGV4dCB4PSI4MTYiIHk9IjIzOCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE2IiBmaWxsPSIjY2ZlM2ZhIj5DYXRhbG9nLCBjYXJ0LCBjaGVja291dCByZWxpYWJpbGl0eTwvdGV4dD4KCiAgPHJlY3QgeD0iNzIiIHk9IjMzMiIgd2lkdGg9IjM0MCIgaGVpZ2h0PSIxNTAiIHJ4PSIxNiIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGY3NmE0Ii8+CiAgPHRleHQgeD0iMTAwIiB5PSIzNzYiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyNCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+RGFzaGJvYXJkPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iNDA4IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIGZpbGw9IiNjZmUzZmEiPktQSXMsIGNoYXJ0cywgcm9sZS1iYXNlZCB2aXNpYmlsaXR5PC90ZXh0PgoKICA8cmVjdCB4PSI0MzAiIHk9IjMzMiIgd2lkdGg9IjM0MCIgaGVpZ2h0PSIxNTAiIHJ4PSIxNiIgZmlsbD0idXJsKCNjYXJkKSIgc3Ryb2tlPSIjNGY3NmE0Ii8+CiAgPHRleHQgeD0iNDU4IiB5PSIzNzYiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyNCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+UmVhbCBFc3RhdGU8L3RleHQ+CiAgPHRleHQgeD0iNDU4IiB5PSI0MDgiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgZmlsbD0iI2NmZTNmYSI+TGlzdGluZ3MsIG1hcHMsIGxlYWQgY2FwdHVyZTwvdGV4dD4KCiAgPHJlY3QgeD0iNzg4IiB5PSIzMzIiIHdpZHRoPSIzNDAiIGhlaWdodD0iMTUwIiByeD0iMTYiIGZpbGw9InVybCgjY2FyZCkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjgxNiIgeT0iMzc2IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPkNoYXQ8L3RleHQ+CiAgPHRleHQgeD0iODE2IiB5PSI0MDgiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgZmlsbD0iI2NmZTNmYSI+VGhyZWFkcywgcmVhbHRpbWUgc3luYywgcmV0cmllczwvdGV4dD4KCiAgPHJlY3QgeD0iNzIiIHk9IjUxMiIgd2lkdGg9IjEwNTYiIGhlaWdodD0iMTEwIiByeD0iMTgiIGZpbGw9IiMxMDI3NDciIHN0cm9rZT0iIzM2NWI4NyIvPgogIDx0ZXh0IHg9IjEwNCIgeT0iNTU4IiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPlNlbGVjdGlvbiB0aXA8L3RleHQ+CiAgPHRleHQgeD0iMTA0IiB5PSI1OTAiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxOCIgZmlsbD0iI2M3ZGNmNSI+Q2hvb3NlIHRoZSB0ZW1wbGF0ZSB0aGF0IG1hdGNoZXMgeW91ciBoaWdoZXN0LXJpc2sgd29ya2Zsb3cgZmlyc3QsIHRoZW4gY3VzdG9taXplIHZlcnRpY2FsIGZlYXR1cmVzLjwvdGV4dD4KPC9zdmc+Cg==" width="1200" height="675" class="img_Denh"></p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="how-to-choose-the-right-template-decision-framework">How to Choose the Right Template (Decision Framework)<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#how-to-choose-the-right-template-decision-framework" class="hash-link" aria-label="Direct link to How to Choose the Right Template (Decision Framework)" title="Direct link to How to Choose the Right Template (Decision Framework)" translate="no">​</a></h2>
<p>A good template reduces risk. A bad template moves risk later into expensive refactors.</p>
<p>Ask before you commit:</p>
<ul>
<li class="">Is it SwiftUI-first or UIKit-first?</li>
<li class="">Is architecture explicit and maintainable?</li>
<li class="">Is backend replacement feasible (Firebase to custom API)?</li>
<li class="">Are critical flows complete (auth, navigation, error/loading states)?</li>
<li class="">Can features be extended without touching core internals?</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Template decision framework for evaluating maintainability, extensibility, and production readiness" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgdmlld0JveD0iMCAwIDEyMDAgNjc1IiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0idGl0bGUgZGVzYyI+CiAgPHRpdGxlIGlkPSJ0aXRsZSI+VGVtcGxhdGUgZGVjaXNpb24gZnJhbWV3b3JrPC90aXRsZT4KICA8ZGVzYyBpZD0iZGVzYyI+RGVjaXNpb24gZmxvdyBmb3IgY2hvb3Npbmcgc3RhcnRlciB0ZW1wbGF0ZSwgZnVsbCBhcHAgdGVtcGxhdGUsIG9yIGJ1bmRsZSBiYXNlZCBvbiBzY29wZSBhbmQgdGVhbSB2ZWxvY2l0eS48L2Rlc2M+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImJnIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBhMTIyOCIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMxZTNhNjMiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9Im5vZGUiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMTczNjVmIi8+CiAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzFjNGE3NCIvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYWNjZW50IiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzIyZDNlZSIvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzNGQzOTkiLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjY3NSIgZmlsbD0idXJsKCNiZykiLz4KICA8dGV4dCB4PSI3OCIgeT0iODgiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIzOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2U4ZjRmZiI+VGVtcGxhdGUgRGVjaXNpb24gRnJhbWV3b3JrPC90ZXh0PgogIDx0ZXh0IHg9Ijc4IiB5PSIxMjIiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxOSIgZmlsbD0iI2JmZDVlZiI+UGljayBieSBkZWxpdmVyeSByaXNrLCBub3QgYnkgdmlzdWFsIHByZWZlcmVuY2UuPC90ZXh0PgoKICA8cmVjdCB4PSI0NjAiIHk9IjE2MCIgd2lkdGg9IjI4MCIgaGVpZ2h0PSI5MiIgcng9IjE0IiBmaWxsPSJ1cmwoI25vZGUpIiBzdHJva2U9IiM0Zjc2YTQiLz4KICA8dGV4dCB4PSI2MDAiIHk9IjIxMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5XaGF0IGFyZSB5b3Ugc2hpcHBpbmc/PC90ZXh0PgoKICA8cmVjdCB4PSI5MCIgeT0iMzIwIiB3aWR0aD0iMzAwIiBoZWlnaHQ9IjExMCIgcng9IjE2IiBmaWxsPSJ1cmwoI25vZGUpIiBzdHJva2U9IiM0Zjc2YTQiLz4KICA8dGV4dCB4PSIyNDAiIHk9IjM3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjIyIiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZThmNGZmIj5TaW5nbGUgTVZQPC90ZXh0PgogIDx0ZXh0IHg9IjI0MCIgeT0iMzk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIGZpbGw9IiNjZmUyZjkiPk5lZWQgc3BlZWQgYW5kIGxvdyBzZXR1cDwvdGV4dD4KCiAgPHJlY3QgeD0iNDUwIiB5PSIzMjAiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTEwIiByeD0iMTYiIGZpbGw9InVybCgjbm9kZSkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjYwMCIgeT0iMzcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjIiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPkNsaWVudCBQcm9qZWN0czwvdGV4dD4KICA8dGV4dCB4PSI2MDAiIHk9IjM5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE2IiBmaWxsPSIjY2ZlMmY5Ij5SZXBlYXRhYmlsaXR5ICsgY3VzdG9taXphdGlvbjwvdGV4dD4KCiAgPHJlY3QgeD0iODEwIiB5PSIzMjAiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTEwIiByeD0iMTYiIGZpbGw9InVybCgjbm9kZSkiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9Ijk2MCIgeT0iMzcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjIiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNlOGY0ZmYiPk11bHRpcGxlIEFwcHM8L3RleHQ+CiAgPHRleHQgeD0iOTYwIiB5PSIzOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgZmlsbD0iI2NmZTJmOSI+UG9ydGZvbGlvIC8gYWdlbmN5IHNjYWxlPC90ZXh0PgoKICA8bGluZSB4MT0iNjAwIiB5MT0iMjUyIiB4Mj0iMjQwIiB5Mj0iMzIwIiBzdHJva2U9InVybCgjYWNjZW50KSIgc3Ryb2tlLXdpZHRoPSI0Ii8+CiAgPGxpbmUgeDE9IjYwMCIgeTE9IjI1MiIgeDI9IjYwMCIgeTI9IjMyMCIgc3Ryb2tlPSJ1cmwoI2FjY2VudCkiIHN0cm9rZS13aWR0aD0iNCIvPgogIDxsaW5lIHgxPSI2MDAiIHkxPSIyNTIiIHgyPSI5NjAiIHkyPSIzMjAiIHN0cm9rZT0idXJsKCNhY2NlbnQpIiBzdHJva2Utd2lkdGg9IjQiLz4KCiAgPHJlY3QgeD0iOTAiIHk9IjQ4MCIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxMTAiIHJ4PSIxNiIgZmlsbD0iIzEzMzE1NiIgc3Ryb2tlPSIjNGY3NmE0Ii8+CiAgPHRleHQgeD0iMjQwIiB5PSI1MzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyMiIgZmlsbD0iI2U4ZjRmZiI+U3RhcnRlciBUZW1wbGF0ZTwvdGV4dD4KCiAgPHJlY3QgeD0iNDUwIiB5PSI0ODAiIHdpZHRoPSIzMDAiIGhlaWdodD0iMTEwIiByeD0iMTYiIGZpbGw9IiMxMzMxNTYiIHN0cm9rZT0iIzRmNzZhNCIvPgogIDx0ZXh0IHg9IjYwMCIgeT0iNTM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iQXJpYWwsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjIiIGZpbGw9IiNlOGY0ZmYiPkZ1bGwgQXBwIFRlbXBsYXRlPC90ZXh0PgoKICA8cmVjdCB4PSI4MTAiIHk9IjQ4MCIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxMTAiIHJ4PSIxNiIgZmlsbD0iIzEzMzE1NiIgc3Ryb2tlPSIjNGY3NmE0Ii8+CiAgPHRleHQgeD0iOTYwIiB5PSI1MzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyMiIgZmlsbD0iI2U4ZjRmZiI+QnVuZGxlIC8gQWxsIEFjY2VzczwvdGV4dD4KCiAgPGxpbmUgeDE9IjI0MCIgeTE9IjQzMCIgeDI9IjI0MCIgeTI9IjQ4MCIgc3Ryb2tlPSIjMzRkMzk5IiBzdHJva2Utd2lkdGg9IjQiLz4KICA8bGluZSB4MT0iNjAwIiB5MT0iNDMwIiB4Mj0iNjAwIiB5Mj0iNDgwIiBzdHJva2U9IiMzNGQzOTkiIHN0cm9rZS13aWR0aD0iNCIvPgogIDxsaW5lIHgxPSI5NjAiIHkxPSI0MzAiIHgyPSI5NjAiIHkyPSI0ODAiIHN0cm9rZT0iIzM0ZDM5OSIgc3Ryb2tlLXdpZHRoPSI0Ii8+Cjwvc3ZnPgo=" width="1200" height="675" class="img_Denh"></p>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>Template red flags</summary><div><div class="collapsibleContent_M73y"><ul>
<li class="">Business logic embedded directly in <code>View</code> files</li>
<li class="">Hardcoded strings and values across screens</li>
<li class="">No clear networking layer abstraction</li>
<li class="">No error, loading, or empty state handling</li>
<li class="">Weak folder structure and mixed responsibilities</li>
<li class="">No edge-case UX behavior</li>
</ul></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="shipping-faster-at-scale-without-lock-in">Shipping Faster at Scale (Without Lock-In)<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#shipping-faster-at-scale-without-lock-in" class="hash-link" aria-label="Direct link to Shipping Faster at Scale (Without Lock-In)" title="Direct link to Shipping Faster at Scale (Without Lock-In)" translate="no">​</a></h2>
<p>If you build multiple apps, velocity compounds only when architecture and operations are standardized.</p>
<p>Scalable strategy:</p>
<ol>
<li class="">Start from a stable template baseline.</li>
<li class="">Extract reusable modules (auth, payments, chat, shared UI).</li>
<li class="">Standardize release and QA playbooks.</li>
<li class="">Apply the same architecture boundaries across projects.</li>
</ol>
<p>For multi-app teams and agencies:</p>
<ul>
<li class=""><a href="https://www.iosapptemplates.com/all-access" target="_blank" rel="noopener noreferrer" class="">iOS Mega Bundle</a></li>
</ul>
<p>Treat bundle access as an operational strategy, not only a pricing choice.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="faq">FAQ<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ" translate="no">​</a></h2>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>Are SwiftUI app templates worth it?</summary><div><div class="collapsibleContent_M73y"><p>Yes, if they remove repetitive setup and preserve maintainable boundaries. The strongest value appears when templates include architecture conventions, real navigation behavior, and complete UI states.</p><p>Screen-only templates with no structural discipline often create hidden refactor cost.</p></div></div></details>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>Can I publish a template-based iOS app on the App Store?</summary><div><div class="collapsibleContent_M73y"><p>Usually yes, but meaningful customization is required. Replace branding, content, and flows, and ensure the app delivers unique value. Treat templates as a foundation, not a final submission artifact.</p></div></div></details>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>What architecture should I use for SwiftUI apps?</summary><div><div class="collapsibleContent_M73y"><p>MVVM is a pragmatic default. It keeps views lean, supports testable logic, and scales with feature growth when paired with a clean service layer and consistent module boundaries.</p></div></div></details>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>Firebase vs custom backend: what should I choose?</summary><div><div class="collapsibleContent_M73y"><p>Firebase is often best for speed, common auth flows, and realtime product features. Custom backends are better when you need strict control, complex business policy enforcement, or deep enterprise integration.</p><p>A phased approach works well: start with managed services for validation, then migrate high-complexity boundaries when needed.</p></div></div></details>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>How do I make a template-based app feel unique?</summary><div><div class="collapsibleContent_M73y"><p>Differentiate through product decisions first: onboarding, core activation moment, feature workflow, copy, and data model choices.</p><p>Then customize design primitives, edge-case behavior, and content strategy. Strong differentiation is usually product-driven, not purely cosmetic.</p></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="production-ready-swiftui-checklist">Production-Ready SwiftUI Checklist<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#production-ready-swiftui-checklist" class="hash-link" aria-label="Direct link to Production-Ready SwiftUI Checklist" title="Direct link to Production-Ready SwiftUI Checklist" translate="no">​</a></h2>
<details class="details_korz alert alert--info details_YpCq" data-collapsed="true"><summary>Copy/paste release checklist</summary><div><div class="collapsibleContent_M73y"><ul>
<li class="">Clear architecture boundaries (MVVM + services)</li>
<li class="">Feature-based folder structure</li>
<li class="">Auth flows including edge cases</li>
<li class="">Data persistence and offline behavior defined</li>
<li class="">Push notifications and deep links tested</li>
<li class="">Error/loading/empty states for core screens</li>
<li class="">Analytics events for core product actions</li>
<li class="">Crash reporting configured</li>
<li class="">App Store assets and privacy details complete</li>
<li class="">Permissions aligned with real feature usage</li>
</ul></div></div></details>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="final-takeaway">Final Takeaway<a href="https://iosapptemplates.com/blog/swiftui-production-ready-app-guide/#final-takeaway" class="hash-link" aria-label="Direct link to Final Takeaway" title="Direct link to Final Takeaway" translate="no">​</a></h2>
<p>Templates do not replace engineering quality. They let you spend engineering effort where it matters most.</p>
<p>Pick the right baseline, preserve architecture boundaries, and customize intentionally. That is how you ship faster while keeping your SwiftUI app stable under real usage.</p>]]></content:encoded>
            <category>iOS App Templates</category>
            <category>iOS Development</category>
            <category>SwiftUI</category>
            <category>App Development</category>
            <category>Mobile Apps</category>
        </item>
        <item>
            <title><![CDATA[Swift App Templates: 9 Fast-Launch Ideas]]></title>
            <link>https://iosapptemplates.com/blog/swift-app-templates-2026/</link>
            <guid>https://iosapptemplates.com/blog/swift-app-templates-2026/</guid>
            <pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A curated list of Swift app templates for shipping iOS MVPs fast.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">February 6, 2026</span></div></div>
<p><img decoding="async" loading="lazy" alt="Swift app templates" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjYzMCIgdmlld0JveD0iMCAwIDEyMDAgNjMwIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzBmMTcyYSIgLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZTExZDQ4IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ic2hpbmUiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIwIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjA1IiAvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjYzMCIgZmlsbD0idXJsKCNiZykiIC8+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjMwIiBmaWxsPSJ1cmwoI3NoaW5lKSIgLz4KICA8Y2lyY2xlIGN4PSI5ODAiIGN5PSIxNDAiIHI9IjEyMCIgZmlsbD0iI2ZmZmZmZiIgZmlsbC1vcGFjaXR5PSIwLjA4IiAvPgogIDxjaXJjbGUgY3g9IjEwNDAiIGN5PSI0NjAiIHI9IjE4MCIgZmlsbD0iIzAwMDAwMCIgZmlsbC1vcGFjaXR5PSIwLjE4IiAvPgogIDxjaXJjbGUgY3g9IjE2MCIgY3k9IjUyMCIgcj0iMTQwIiBmaWxsPSIjZmZmZmZmIiBmaWxsLW9wYWNpdHk9IjAuMDYiIC8+CiAgPHRleHQgeD0iOTAiIHk9IjIyMCIgZm9udC1mYW1pbHk9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iNjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNmOGZhZmMiPlN3aWZ0IEFwcDwvdGV4dD4KICA8dGV4dCB4PSI5MCIgeT0iMjk1IiBmb250LWZhbWlseT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgZm9udC1zaXplPSI2NCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iI2Y4ZmFmYyI+VGVtcGxhdGVzPC90ZXh0PgogIDx0ZXh0IHg9IjkwIiB5PSIzNjAiIGZvbnQtZmFtaWx5PSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjI4IiBmb250LXdlaWdodD0iNTAwIiBmaWxsPSIjZTJlOGYwIj5GYXN0LWxhdW5jaCBpZGVhczwvdGV4dD4KPC9zdmc+Cg==" width="1200" height="630" class="img_Denh"></p>
<blockquote>
<p><em>Pick a proven Swift template and focus on your unique value instead of boilerplate.</em></p>
</blockquote>
<!-- -->
<div style="border:1px solid #e2e8f0;background-color:#f7fafc;padding:0.75rem;margin:1rem 0;border-radius:0.5rem;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,0.04)"><p style="margin:0 0 0.5rem 0;color:#1f2d3d"><strong>Build a native mobile app in minutes with AI.</strong> Try an AI React Native / Expo app generator that scaffolds complete projects from prompts.</p><a href="https://rork.com/?ref=db-iosapptemplates" target="_blank" rel="sponsored noopener noreferrer" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.45rem 1rem;text-decoration:none;border-radius:0.375rem;font-weight:600">Try AI Free</a></div>
<p>If you are building an iOS MVP, the fastest path is starting from a production-ready template. Below are 9 high-demand app ideas and the matching Swift templates to launch quickly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-social-or-community-app">1. Social or community app<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#1-social-or-community-app" class="hash-link" aria-label="Direct link to 1. Social or community app" title="Direct link to 1. Social or community app" translate="no">​</a></h2>
<p>Build profiles, feeds, and messaging with a clean iOS UX.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-instagram-clone" target="_blank" rel="noopener noreferrer" class="">Swift Instagram Clone</a>. Includes feed, profiles, and social interactions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-dating-and-matching">2. Dating and matching<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#2-dating-and-matching" class="hash-link" aria-label="Direct link to 2. Dating and matching" title="Direct link to 2. Dating and matching" translate="no">​</a></h2>
<p>Niche dating apps keep growing thanks to stronger community fit.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-dating-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Dating App Template</a>. Profiles, matching flows, and chat UI included.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-real-estate-or-listings">3. Real estate or listings<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#3-real-estate-or-listings" class="hash-link" aria-label="Direct link to 3. Real estate or listings" title="Direct link to 3. Real estate or listings" translate="no">​</a></h2>
<p>High-intent users value fast filters, maps, and favorites.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-real-estate-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Real Estate App Template</a>. Listing cards, filters, and inquiries built in.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-ecommerce-and-subscriptions">4. Ecommerce and subscriptions<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#4-ecommerce-and-subscriptions" class="hash-link" aria-label="Direct link to 4. Ecommerce and subscriptions" title="Direct link to 4. Ecommerce and subscriptions" translate="no">​</a></h2>
<p>A smooth checkout flow drives strong conversion on iOS.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-ecommerce-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Ecommerce App Template</a>. Catalog, cart, and checkout included.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-food-and-local-ordering">5. Food and local ordering<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#5-food-and-local-ordering" class="hash-link" aria-label="Direct link to 5. Food and local ordering" title="Direct link to 5. Food and local ordering" translate="no">​</a></h2>
<p>Delivery and takeout keep repeat usage high.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-restaurant-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Restaurant App Template</a>. Menu browsing and order flow ready.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="6-finance-and-crypto">6. Finance and crypto<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#6-finance-and-crypto" class="hash-link" aria-label="Direct link to 6. Finance and crypto" title="Direct link to 6. Finance and crypto" translate="no">​</a></h2>
<p>Budgeting and trading apps remain top iOS categories.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-crypto-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Crypto App Template</a>. Portfolio views, prices, and charts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="7-video-chat-and-telehealth">7. Video chat and telehealth<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#7-video-chat-and-telehealth" class="hash-link" aria-label="Direct link to 7. Video chat and telehealth" title="Direct link to 7. Video chat and telehealth" translate="no">​</a></h2>
<p>Reliable calling unlocks tutoring, coaching, and meetings.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-video-chat-app" target="_blank" rel="noopener noreferrer" class="">Swift Video and Audio Calling App</a>. Call screens and real-time communication UX.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="8-store-locator-and-local-services">8. Store locator and local services<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#8-store-locator-and-local-services" class="hash-link" aria-label="Direct link to 8. Store locator and local services" title="Direct link to 8. Store locator and local services" translate="no">​</a></h2>
<p>Map-first discovery works for many verticals.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-store-locator-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Store Locator App</a>. Map views, filters, and location detail pages.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="9-starter-kit-for-fast-mvps">9. Starter kit for fast MVPs<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#9-starter-kit-for-fast-mvps" class="hash-link" aria-label="Direct link to 9. Starter kit for fast MVPs" title="Direct link to 9. Starter kit for fast MVPs" translate="no">​</a></h2>
<p>If you want to prototype quickly, start with a Firebase-ready base.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-boilerplate-with-firebase" target="_blank" rel="noopener noreferrer" class="">Swift Boilerplate with Firebase</a>. Auth, onboarding, and a solid Firebase base.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="ship-faster">Ship faster<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#ship-faster" class="hash-link" aria-label="Direct link to Ship faster" title="Direct link to Ship faster" translate="no">​</a></h2>
<ul>
<li class="">Launch with one core loop.</li>
<li class="">Add analytics and push notifications early.</li>
<li class="">Iterate weekly based on retention data.</li>
<li class="">Keep the UI simple and fast.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="how-to-choose-the-right-template">How to choose the right template<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#how-to-choose-the-right-template" class="hash-link" aria-label="Direct link to How to choose the right template" title="Direct link to How to choose the right template" translate="no">​</a></h2>
<ul>
<li class="">Pick the template that matches your core loop.</li>
<li class="">Avoid over-customizing before validation.</li>
<li class="">Focus on onboarding and one key action.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="ux-polish-that-improves-conversion">UX polish that improves conversion<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#ux-polish-that-improves-conversion" class="hash-link" aria-label="Direct link to UX polish that improves conversion" title="Direct link to UX polish that improves conversion" translate="no">​</a></h2>
<ul>
<li class="">Keep first-time user flow under one minute.</li>
<li class="">Use clear empty states and progress hints.</li>
<li class="">Ask for permissions only when needed.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="app-store-readiness">App Store readiness<a href="https://iosapptemplates.com/blog/swift-app-templates-2026/#app-store-readiness" class="hash-link" aria-label="Direct link to App Store readiness" title="Direct link to App Store readiness" translate="no">​</a></h2>
<ul>
<li class="">Prepare screenshots and a short preview video.</li>
<li class="">Use a concise description and strong keywords.</li>
<li class="">Test on multiple iPhone sizes before launch.</li>
</ul>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<p>Start from a proven Swift template and focus on what makes your app unique.</p>]]></content:encoded>
            <category>iOS</category>
            <category>Swift</category>
            <category>Templates</category>
            <category>Startup</category>
            <category>MVP</category>
        </item>
        <item>
            <title><![CDATA[iOS App Categories with High Retention]]></title>
            <link>https://iosapptemplates.com/blog/ios-app-trends-2026/</link>
            <guid>https://iosapptemplates.com/blog/ios-app-trends-2026/</guid>
            <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical guide to high-demand iOS app categories and Swift templates to launch quickly.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">February 5, 2026</span></div></div>
<p><img decoding="async" loading="lazy" alt="iOS app categories" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjYzMCIgdmlld0JveD0iMCAwIDEyMDAgNjMwIj4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYmciIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzBmMTcyYSIgLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMjJjNTVlIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ic2hpbmUiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIwIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjA1IiAvPgogICAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjYzMCIgZmlsbD0idXJsKCNiZykiIC8+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjMwIiBmaWxsPSJ1cmwoI3NoaW5lKSIgLz4KICA8Y2lyY2xlIGN4PSI5ODAiIGN5PSIxNDAiIHI9IjEyMCIgZmlsbD0iI2ZmZmZmZiIgZmlsbC1vcGFjaXR5PSIwLjA4IiAvPgogIDxjaXJjbGUgY3g9IjEwNDAiIGN5PSI0NjAiIHI9IjE4MCIgZmlsbD0iIzAwMDAwMCIgZmlsbC1vcGFjaXR5PSIwLjE4IiAvPgogIDxjaXJjbGUgY3g9IjE2MCIgY3k9IjUyMCIgcj0iMTQwIiBmaWxsPSIjZmZmZmZmIiBmaWxsLW9wYWNpdHk9IjAuMDYiIC8+CiAgPHRleHQgeD0iOTAiIHk9IjIyMCIgZm9udC1mYW1pbHk9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iNjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNmOGZhZmMiPmlPUyBBcHA8L3RleHQ+CiAgPHRleHQgeD0iOTAiIHk9IjI5NSIgZm9udC1mYW1pbHk9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iNjQiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNmOGZhZmMiPkNhdGVnb3JpZXM8L3RleHQ+CiAgPHRleHQgeD0iOTAiIHk9IjM2MCIgZm9udC1mYW1pbHk9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMjgiIGZvbnQtd2VpZ2h0PSI1MDAiIGZpbGw9IiNlMmU4ZjAiPkFwcGxlIEludGVsbGlnZW5jZSBlcmE8L3RleHQ+Cjwvc3ZnPgo=" width="1200" height="630" class="img_Denh"></p>
<p>iOS users expect fast performance, clean UX, and helpful features. The categories below consistently show strong demand and clear monetization paths. Each one includes a matching Swift template to accelerate your launch.</p>
<!-- -->
<div style="border:1px solid #e2e8f0;background-color:#f7fafc;padding:0.75rem;margin:1rem 0;border-radius:0.5rem;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,0.04)"><p style="margin:0 0 0.5rem 0;color:#1f2d3d"><strong>Build a native mobile app in minutes with AI.</strong> Try an AI React Native / Expo app generator that scaffolds complete projects from prompts.</p><a href="https://rork.com/?ref=db-iosapptemplates" target="_blank" rel="sponsored noopener noreferrer" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.45rem 1rem;text-decoration:none;border-radius:0.375rem;font-weight:600">Try AI Free</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-smart-dashboards-and-insights">1. Smart dashboards and insights<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#1-smart-dashboards-and-insights" class="hash-link" aria-label="Direct link to 1. Smart dashboards and insights" title="Direct link to 1. Smart dashboards and insights" translate="no">​</a></h2>
<p>Users want answers, not charts. Summaries and insights drive engagement.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-dashboard-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Dashboard App Template</a>. Great for KPI cards, charts, and summary screens.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-finance-and-investing">2. Finance and investing<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#2-finance-and-investing" class="hash-link" aria-label="Direct link to 2. Finance and investing" title="Direct link to 2. Finance and investing" translate="no">​</a></h2>
<p>Budgeting, crypto, and trading remain top performers on iOS.</p>
<p>Template picks: <a href="https://www.iosapptemplates.com/templates/swift-finance-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Finance App</a> and <a href="https://www.iosapptemplates.com/templates/swift-stock-trading-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Stock Trading App</a>. Both include portfolio views, charts, and insights.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-video-and-audio-communication">3. Video and audio communication<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#3-video-and-audio-communication" class="hash-link" aria-label="Direct link to 3. Video and audio communication" title="Direct link to 3. Video and audio communication" translate="no">​</a></h2>
<p>Real-time calling is now a baseline feature for many verticals.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-video-chat-app" target="_blank" rel="noopener noreferrer" class="">Swift Video and Audio Calling App</a>. Ships with call screens and real-time communication UX.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-food-delivery-and-local-commerce">4. Food delivery and local commerce<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#4-food-delivery-and-local-commerce" class="hash-link" aria-label="Direct link to 4. Food delivery and local commerce" title="Direct link to 4. Food delivery and local commerce" translate="no">​</a></h2>
<p>Ordering and delivery flows drive repeat usage and strong reviews.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-ubereats-clone" target="_blank" rel="noopener noreferrer" class="">Swift Food Delivery App</a>. Menu browsing, cart, and delivery status are built in.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-fitness-and-wellness">5. Fitness and wellness<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#5-fitness-and-wellness" class="hash-link" aria-label="Direct link to 5. Fitness and wellness" title="Direct link to 5. Fitness and wellness" translate="no">​</a></h2>
<p>Habit loops and progress tracking create consistent engagement.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-fitness-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Fitness App</a>. Workout flows, progress tracking, and goal screens included.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="6-marketplaces-and-discovery">6. Marketplaces and discovery<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#6-marketplaces-and-discovery" class="hash-link" aria-label="Direct link to 6. Marketplaces and discovery" title="Direct link to 6. Marketplaces and discovery" translate="no">​</a></h2>
<p>Maps plus listings are powerful for local services and vertical marketplaces.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-store-locator-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Store Locator App</a>. Map views, filters, and location details ready.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="7-social-and-dating">7. Social and dating<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#7-social-and-dating" class="hash-link" aria-label="Direct link to 7. Social and dating" title="Direct link to 7. Social and dating" translate="no">​</a></h2>
<p>Niche communities and dating apps keep growing thanks to strong retention loops.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-dating-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Dating App Template</a>. Profiles, matching flows, and chat UI included.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="8-ecommerce-and-subscriptions">8. Ecommerce and subscriptions<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#8-ecommerce-and-subscriptions" class="hash-link" aria-label="Direct link to 8. Ecommerce and subscriptions" title="Direct link to 8. Ecommerce and subscriptions" translate="no">​</a></h2>
<p>A fast checkout and smooth onboarding increases iOS conversion.</p>
<p>Template pick: <a href="https://www.iosapptemplates.com/templates/swift-ecommerce-app-template" target="_blank" rel="noopener noreferrer" class="">Swift Ecommerce App</a>. Catalog, cart, and checkout screens out of the box.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="launch-checklist">Launch checklist<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#launch-checklist" class="hash-link" aria-label="Direct link to Launch checklist" title="Direct link to Launch checklist" translate="no">​</a></h2>
<ul>
<li class="">Build one core loop and remove everything else.</li>
<li class="">Add push notifications and lifecycle messaging early.</li>
<li class="">Start from a production-ready Swift template.</li>
<li class="">Measure retention and conversion from day one.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="monetization-options">Monetization options<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#monetization-options" class="hash-link" aria-label="Direct link to Monetization options" title="Direct link to Monetization options" translate="no">​</a></h2>
<ul>
<li class="">Subscriptions for recurring value and content.</li>
<li class="">Transaction fees for marketplaces and bookings.</li>
<li class="">Premium upgrades for power users.</li>
<li class="">B2B licensing for dashboard-style apps.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="retention-loops-that-work-on-ios">Retention loops that work on iOS<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#retention-loops-that-work-on-ios" class="hash-link" aria-label="Direct link to Retention loops that work on iOS" title="Direct link to Retention loops that work on iOS" translate="no">​</a></h2>
<ul>
<li class="">Save and return lists (favorites, watchlists).</li>
<li class="">Weekly progress summaries.</li>
<li class="">Limited-time offers or streaks.</li>
<li class="">Personalized recommendations.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="app-store-success-checklist">App Store success checklist<a href="https://iosapptemplates.com/blog/ios-app-trends-2026/#app-store-success-checklist" class="hash-link" aria-label="Direct link to App Store success checklist" title="Direct link to App Store success checklist" translate="no">​</a></h2>
<ul>
<li class="">Clear screenshots that show the core loop.</li>
<li class="">A short description with your main keyword.</li>
<li class="">Fast onboarding with minimal friction.</li>
<li class="">A privacy policy and data clarity from day one.</li>
</ul>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<p>Want to move faster? Explore the full <a href="https://www.iosapptemplates.com/templates" target="_blank" rel="noopener noreferrer" class="">iOS app template catalog</a> and ship in weeks, not months.</p>]]></content:encoded>
            <category>iOS</category>
            <category>Swift</category>
            <category>App Ideas</category>
            <category>Templates</category>
        </item>
        <item>
            <title><![CDATA[Vibe Coding in Swift and iOS: The Promises and Pitfalls]]></title>
            <link>https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/</link>
            <guid>https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/</guid>
            <pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Explore the emerging trend of vibe coding in Swift and iOS development, examining both the benefits and potential challenges of this AI-assisted development approach.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">June 11, 2025</span></div></div>
<p><img decoding="async" loading="lazy" alt="vibecoding and its pitfalls" src="https://iosapptemplates.com/assets/images/swift-vibe-coding-f47c2b833119eb422da7a75b19e129b3.jpg" width="720" height="960" class="img_Denh"></p>
<p>As AI tools like ChatGPT and GitHub Copilot become increasingly integrated into development workflows, a new phenomenon called "vibe coding" has emerged. This article explores the impact of AI-assisted development on Swift and iOS programming, weighing both the revolutionary possibilities and concerning limitations. Whether you're a seasoned developer or just starting your iOS journey, understanding when and how to leverage AI tools effectively could be the difference between enhanced productivity and dangerous dependency.</p>
<!-- -->
<div style="border:1px solid #e2e8f0;background-color:#f7fafc;padding:0.75rem;margin:1rem 0;border-radius:0.5rem;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,0.04)"><p style="margin:0 0 0.5rem 0;color:#1f2d3d"><strong>Build a native mobile app in minutes with AI.</strong> Try an AI React Native / Expo app generator that scaffolds complete projects from prompts.</p><a href="https://rork.com/?ref=db-iosapptemplates" target="_blank" rel="sponsored noopener noreferrer" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.45rem 1rem;text-decoration:none;border-radius:0.375rem;font-weight:600">Try AI Free</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="what-is-vibe-coding">What is "Vibe Coding"?<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#what-is-vibe-coding" class="hash-link" aria-label="Direct link to What is &quot;Vibe Coding&quot;?" title="Direct link to What is &quot;Vibe Coding&quot;?" translate="no">​</a></h2>
<p>In the rapidly evolving landscape of software development, a new term has emerged: "vibe coding." This refers to the practice of using AI tools like ChatGPT, GitHub Copilot, or Claude to generate large portions of code with minimal human oversight. The developer essentially describes what they want, and the AI "vibes" with that description to produce code that (hopefully) works as intended.</p>
<p>For Swift and iOS development, this approach has gained significant traction, especially among newcomers to the ecosystem. But is it a revolutionary advancement or a concerning trend? Let's dive deeper.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-rise-of-ai-assisted-swift-development">The Rise of AI-Assisted Swift Development<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#the-rise-of-ai-assisted-swift-development" class="hash-link" aria-label="Direct link to The Rise of AI-Assisted Swift Development" title="Direct link to The Rise of AI-Assisted Swift Development" translate="no">​</a></h2>
<p>The introduction of large language models (LLMs) has transformed how many developers approach coding. In the Swift community, these tools offer:</p>
<ul>
<li class=""><strong>Quick scaffolding</strong> of UIKit or SwiftUI interfaces</li>
<li class=""><strong>Boilerplate reduction</strong> for common iOS patterns</li>
<li class=""><strong>Rapid prototyping</strong> of app features</li>
<li class=""><strong>On-the-fly documentation</strong> that explains Apple frameworks</li>
</ul>
<p>Many iOS developers report completing tasks in a fraction of the time it would take to write code manually. For those new to Swift or iOS development, AI tools can flatten the learning curve significantly by generating working examples that can be studied and modified.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-limitations-in-the-apple-ecosystem">The Limitations in the Apple Ecosystem<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#the-limitations-in-the-apple-ecosystem" class="hash-link" aria-label="Direct link to The Limitations in the Apple Ecosystem" title="Direct link to The Limitations in the Apple Ecosystem" translate="no">​</a></h2>
<p>However, the Swift and iOS ecosystem presents unique challenges for AI-powered coding:</p>
<div style="border:1px solid #e2e8f0;background-color:#f7fafc;padding:0.75rem;margin:1rem 0;border-radius:0.5rem;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,0.04)"><p style="margin:0 0 0.5rem 0;color:#1f2d3d"><strong>Build a native mobile app in minutes with AI.</strong> Try an AI React Native / Expo app generator that scaffolds complete projects from prompts.</p><a href="https://rork.com/?ref=db-iosapptemplates" target="_blank" rel="sponsored noopener noreferrer" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.45rem 1rem;text-decoration:none;border-radius:0.375rem;font-weight:600">Try AI Free</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-rapid-framework-evolution">1. Rapid Framework Evolution<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#1-rapid-framework-evolution" class="hash-link" aria-label="Direct link to 1. Rapid Framework Evolution" title="Direct link to 1. Rapid Framework Evolution" translate="no">​</a></h3>
<p>Apple's frameworks evolve quickly with annual updates to iOS, macOS, and Swift itself. As several developers in online discussions have pointed out, LLMs often lag behind these changes:</p>
<blockquote>
<p>"<em>Poor vibe-coders; xOS26 and Swift 6.2 is gonna give them one hell of a time</em>."</p>
</blockquote>
<p>LLMs can only generate code based on what they've been trained on, which means they may not be familiar with the latest Swift syntax or iOS APIs until they've been widely adopted and documented online.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-apples-unique-design-patterns">2. Apple's Unique Design Patterns<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#2-apples-unique-design-patterns" class="hash-link" aria-label="Direct link to 2. Apple's Unique Design Patterns" title="Direct link to 2. Apple's Unique Design Patterns" translate="no">​</a></h3>
<p>iOS development involves platform-specific patterns and best practices that don't always translate well to generic AI prompts. From respecting the app lifecycle to properly implementing delegate patterns or managing memory in performance-critical code, these nuances often require human expertise.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-performance-considerations">3. Performance Considerations<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#3-performance-considerations" class="hash-link" aria-label="Direct link to 3. Performance Considerations" title="Direct link to 3. Performance Considerations" translate="no">​</a></h3>
<p>Mobile apps have unique performance constraints that generative AI might not prioritize:</p>
<blockquote>
<p>"<em>Several times it's written code for me in C++ which was insanely inefficient algorithmically, so just re-wrote it myself. I only knew that because of my previous experience</em>."</p>
</blockquote>
<p>For iOS apps, inefficient code can drain battery life, increase load times, or create laggy user experiences—issues that might not be apparent until the app is deployed to real devices.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-hidden-costs-of-vibe-coding">The Hidden Costs of Vibe Coding<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#the-hidden-costs-of-vibe-coding" class="hash-link" aria-label="Direct link to The Hidden Costs of Vibe Coding" title="Direct link to The Hidden Costs of Vibe Coding" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="time-efficiency-illusion">Time Efficiency Illusion<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#time-efficiency-illusion" class="hash-link" aria-label="Direct link to Time Efficiency Illusion" title="Direct link to Time Efficiency Illusion" translate="no">​</a></h3>
<p>Many experienced Swift developers report that while AI tools appear to save time initially, the reality can be quite different:</p>
<blockquote>
<p>"<em>I spend more time guiding it, correcting it, etc than it would take me to write it myself from scratch</em>."</p>
</blockquote>
<p>What looks like a 10-minute quick solution often turns into an hour of debugging subtle issues in the generated code, especially for complex Swift features like concurrency, generics, or protocol extensions.</p>
<div style="border:1px solid #e2e8f0;background-color:#f7fafc;padding:0.75rem;margin:1rem 0;border-radius:0.5rem;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,0.04)"><p style="margin:0 0 0.5rem 0;color:#1f2d3d"><strong>Build a native mobile app in minutes with AI.</strong> Try an AI React Native / Expo app generator that scaffolds complete projects from prompts.</p><a href="https://rork.com/?ref=db-iosapptemplates" target="_blank" rel="sponsored noopener noreferrer" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.45rem 1rem;text-decoration:none;border-radius:0.375rem;font-weight:600">Try AI Free</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="skill-atrophy">Skill Atrophy<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#skill-atrophy" class="hash-link" aria-label="Direct link to Skill Atrophy" title="Direct link to Skill Atrophy" translate="no">​</a></h3>
<p>Perhaps more concerning is the potential impact on developer growth:</p>
<blockquote>
<p>"<em>I also noticed how dumber I became fully relying on using LLMs. At some point I started to forget function names I used everyday</em>."</p>
</blockquote>
<p>For iOS developers, intimate knowledge of Apple's frameworks is often what separates good from great engineers. Relying too heavily on AI generation can prevent the formation of crucial mental models about how these frameworks work together.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="code-quality-and-maintenance">Code Quality and Maintenance<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#code-quality-and-maintenance" class="hash-link" aria-label="Direct link to Code Quality and Maintenance" title="Direct link to Code Quality and Maintenance" translate="no">​</a></h3>
<p>Generated code often lacks the thoughtfulness and organization that comes from human design:</p>
<blockquote>
<p>"<em>The bugs it introduces are frankly unacceptable. It's so untrustworthy that I have stopped using it to generate new code</em>."</p>
</blockquote>
<p>In the context of iOS development, where app review rejections can delay launches and updates, these unexpected bugs can have significant business impacts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="a-balanced-approach-for-ios-developers">A Balanced Approach for iOS Developers<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#a-balanced-approach-for-ios-developers" class="hash-link" aria-label="Direct link to A Balanced Approach for iOS Developers" title="Direct link to A Balanced Approach for iOS Developers" translate="no">​</a></h2>
<p>Rather than taking an all-or-nothing stance on AI tools, many Swift developers are finding a middle ground:</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-use-ai-as-enhanced-autocomplete">1. Use AI as Enhanced Autocomplete<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#1-use-ai-as-enhanced-autocomplete" class="hash-link" aria-label="Direct link to 1. Use AI as Enhanced Autocomplete" title="Direct link to 1. Use AI as Enhanced Autocomplete" translate="no">​</a></h3>
<p>Many developers now prefer using tools like GitHub Copilot for line-by-line suggestions rather than generating entire components or classes:</p>
<blockquote>
<p>"<em>At the moment I still do use it as unobtrusive autocomplete, but I try to step away from making it generating me whole chunks of app</em>."</p>
</blockquote>
<p>This approach maintains developer agency while still boosting productivity.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-ai-powered-learning">2. AI-Powered Learning<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#2-ai-powered-learning" class="hash-link" aria-label="Direct link to 2. AI-Powered Learning" title="Direct link to 2. AI-Powered Learning" translate="no">​</a></h3>
<p>For those new to Swift or iOS development, AI tools can be invaluable educational resources. Ask for explanations of complex Swift concepts, have the AI break down Apple's documentation into more digestible chunks, or generate multiple alternative implementations to study different approaches.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-delegate-appropriate-tasks">3. Delegate Appropriate Tasks<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#3-delegate-appropriate-tasks" class="hash-link" aria-label="Direct link to 3. Delegate Appropriate Tasks" title="Direct link to 3. Delegate Appropriate Tasks" translate="no">​</a></h3>
<p>Reserve AI generation for truly boilerplate code like model definitions, basic networking layers, or standard UI components. Keep the core business logic, performance-critical paths, and architectural decisions in human hands.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-rigorous-review-and-testing">4. Rigorous Review and Testing<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#4-rigorous-review-and-testing" class="hash-link" aria-label="Direct link to 4. Rigorous Review and Testing" title="Direct link to 4. Rigorous Review and Testing" translate="no">​</a></h3>
<p>When using AI-generated Swift code, implement robust testing practices. Unit tests, UI tests, and performance profiling become even more crucial to catch the subtle issues that might slip through.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-future-of-swift-development">The Future of Swift Development<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#the-future-of-swift-development" class="hash-link" aria-label="Direct link to The Future of Swift Development" title="Direct link to The Future of Swift Development" translate="no">​</a></h2>
<p>As we look ahead, it's clear that AI tools will remain part of the iOS development landscape. Apple itself is investing in AI technologies, and future development environments will likely incorporate more AI-assisted features.</p>
<p>However, successful Swift developers will be those who use these tools thoughtfully, understanding both their capabilities and limitations. The most valuable iOS developers won't be those who can prompt an AI most effectively, but those who can:</p>
<ol>
<li class="">Architect apps that align with Apple's design philosophies</li>
<li class="">Optimize for the unique constraints of mobile devices</li>
<li class="">Navigate Apple's evolving frameworks and technologies</li>
<li class="">Exercise good judgment about when to use AI assistance and when to rely on human expertise</li>
</ol>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/vibe-coding-in-swift-and-ios-the-promises-and-pitfalls/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Vibe coding in Swift and iOS development represents both opportunity and challenge. While AI tools can accelerate certain aspects of development, they're not a replacement for deep platform knowledge and engineering judgment.</p>
<p>As one senior developer aptly put it:</p>
<blockquote>
<p>"<em>It's not that I hate the idea of AI, it's just not [always] good. Period</em>."</p>
</blockquote>
<p>The most successful iOS developers will be those who harness AI as one tool in a comprehensive toolkit—knowing when to use it, when to question it, and when to set it aside in favor of human creativity and expertise.</p>
<p>What's your experience with AI-assisted Swift coding? Have you found it helpful or harmful to your development process? Share your thoughts in the comments below!</p>
<p>About the author: This article was crafted for iOS App Templates, your premier source for Swift app templates, iOS tutorials, and insights into mobile development best practices.</p>]]></content:encoded>
            <category>Vibe Coding</category>
            <category>AI Assisted Development</category>
            <category>ChatGPT</category>
            <category>GitHub Copilot</category>
        </item>
        <item>
            <title><![CDATA[Mobile App Ideas: 50+ Profitable App Ideas for Startups in 2025]]></title>
            <link>https://iosapptemplates.com/blog/mobile-app-ideas/</link>
            <guid>https://iosapptemplates.com/blog/mobile-app-ideas/</guid>
            <pubDate>Sat, 25 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover 50+ profitable mobile app ideas for startups in 2025. From social media apps to productivity tools, find the perfect app idea to launch your startup.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">May 25, 2024</span></div></div>
<p>Looking to start a new mobile app? Launching a mobile app startup has never been easier and hotter. If you are a developer or an entrepreneur looking to launch the next big thing, we've curated a list of the <strong>best mobile app ideas</strong> to create in 2025. Use it for inspiration and insights into the current mobile market trends. Smartphones have exploded in popularity within the last decade, and they quickly replaced the old desktops for the average consumer. Even laptops are now outdated. <strong>Smartphones are our inseparable companions, bringing more convenience and fun into our lives</strong>. In addition to concrete mobile app ideas, we also tried to provide some insights on how to generate more app ideas, from our own app generation framework, that gravitates around starting with a niche.</p>
<!-- -->
<p><img decoding="async" loading="lazy" alt="mobile app ideas" src="https://iosapptemplates.com/assets/images/mobile-app-ideas-a89ac6c9babf817a7aedcb3beb27ee81.png" width="800" height="600" class="img_Denh"></p>
<p>In order to come up with all these hot mobile app ideas, we need to look at the industry trends of the last year. By analyzing all the mobile startups that have raised a lot of capital in private funding rounds, a few themes emerged. <strong>The mobile app market is hot, but the competition is also stiff</strong>. So you need to start small, in a limited community/market and take it from there. After all, Facebook started in one college, right? <strong>Don't try to be Mark Zuckerberg</strong> in your first 6 months of launching a startup. Startups are a marathon, not a sprint, so focus on each stage separately. Even if you already have a startup, but you lack a presence in the mobile stores (Apple Store &amp; Google Play Store), you must consider switching your focus to mobile. Or at least add a mobile direction to your company. Even for small traditional businesses, such as restaurants or taxi firms, providing your customers with a hot mobile app will build stronger connections and boost client loyalty. Don't miss out on the revolution that's currently happening. <strong>Average users do not use laptops or desktops anymore</strong>. Without further ado, let's jump into the best mobile app ideas to launch in 2025, in order to create a successful startup.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-dating-app-ideas">1. Dating App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#1-dating-app-ideas" class="hash-link" aria-label="Direct link to 1. Dating App Ideas" title="Direct link to 1. Dating App Ideas" translate="no">​</a></h2>
<p>If you're looking for a mobile app idea, you are already familiar with hugely successful dating apps such as Tinder or Bumble. They have hundreds of millions of daily active users. They are living proof that the mobile industry revolutionized all the aspects of our lives. And dating is no exception. This incredible transition in dating, from websites (and newspaper ads, remember those?) to mobile apps creates a vast amount of opportunities for entrepreneurs looking to capitalize on mobile startups. Dating applications have taken over the world by storm. The main idea behind these apps is to create a platform that helps people connect to each other seamlessly, find new friends or dates, based on appearance, interests, etc. And these are only a few of the <a href="https://www.iosapptemplates.com/blog/mobile-app-development/mobile-dating-app-features" target="_blank" rel="noopener noreferrer" class="">best features of a mobile dating app</a>. <strong>To build a successful dating startup, you need to come up with your own original approach</strong>. Your app must be unique and genuine, and you should be looking for innovative mobile app ideas. Even if you build the app with similar functionalities, your value proposition should be unique. That's how apps like Grindr, for instance, were able to penetrate the mobile dating market, by targeting a smaller audience, such as the gay community. If you ever decide to pursue our mobile app idea and embark on the journey of building your own mobile dating startup, you should take a look at our <a href="https://www.iosapptemplates.com/templates/ios-dating-app-template" target="_blank" rel="noopener noreferrer" class="">mobile dating app template</a>. Our mission is to help entrepreneurs launch their mobile startups faster and at a fraction of the cost. Our dating app template has a large range of features, such as <strong>matching, chatting and push notifications with a stunning design</strong> and impeccable Swift code.</p>
<p><img decoding="async" loading="lazy" alt="mobile app ideas 2019" src="https://iosapptemplates.com/assets/images/mobile-app-ideas-2019-14685c9a018b3096038c091b744a026f.png" width="998" height="489" class="img_Denh"></p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-e-commerce-app-ideas">2. E-commerce App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#2-e-commerce-app-ideas" class="hash-link" aria-label="Direct link to 2. E-commerce App Ideas" title="Direct link to 2. E-commerce App Ideas" translate="no">​</a></h2>
<p>The idea of building an e-commerce application has been around for a long time. Companies such as Amazon or eBay had e-commerce websites since the beginning of the Internet. However, the e-commerce space skyrocketed in the last decade, as mobile device adoption has increased. If you don't believe me, just take a look at Amazon's stock price. Or Shopify's. Shopping on a mobile device is convenient. But shopping in a native mobile app is convenient and FUN. <strong>Customers with a native mobile app order 8x more times than customers using a website</strong>. The convenience in a mobile e-commerce app comes from frictionless check out experiences (e.g. paying Apple Pay takes on click), as well as an enhanced overall product browsing flows. Using features such as ARKit to preview products will blow the minds of your customers. Let alone beautiful product photo galleries or fast search functionalities. Build amazing <a href="https://www.iosapptemplates.com/blog/mobile-app-development/ecommerce-mobile-app-features" target="_blank" rel="noopener noreferrer" class="">e-commerce features</a>, to improve user retention and implicitly, sales. Leveraging <strong>push notifications</strong> to boost the loyalty of mobile customers, boosts user retention tremendously. This is a key lever in making mobile customers order 8x more times in a native app. Huge competitor advantage. Don't miss out on it. If you are an online e-commerce store owner, you must launch a mobile app. Especially that the app development costs dropped significantly in the last year. Having a mobile app won't be a financial burden in any way. But the prospect of having loyal customers delighted by your WooCommerce or Shopify products makes building a mobile native app a no-brainer. Just look at how many Shopify mobile app builders have popped up on the <a href="https://apps.shopify.com/" target="_blank" rel="noopener noreferrer" class="">Shopify App Store</a> in the last year. Your <strong>competition</strong> might already be pacing you out if you delay this strategy. Even if you don't currently own an e-commerce store, the e-commerce industry is a trillion dollar market. So there's a lot of mobile app ideas you can build to become successful in e-commerce. Given e-commerce mobile apps are a popular mobile app idea in 2025, we implemented a fully functional <a href="https://www.iosapptemplates.com/mobiletemplates/ecommerce" target="_blank" rel="noopener noreferrer" class="">shopping app template</a>, to help entrepreneurs save thousands of dollars and hours of design, development and testing.</p>
<p><img decoding="async" loading="lazy" alt="mobile startup ideas" src="https://iosapptemplates.com/assets/images/mobile-startup-ideas-926d46e63ed2b901c1d5e7b817ff38dd.png" width="800" height="600" class="img_Denh"></p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-transport--ridesharing-app-ideas">3. Transport / Ridesharing App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#3-transport--ridesharing-app-ideas" class="hash-link" aria-label="Direct link to 3. Transport / Ridesharing App Ideas" title="Direct link to 3. Transport / Ridesharing App Ideas" translate="no">​</a></h2>
<p>If you're alive in 2025, I'm sure you've already taken an Uber, Lyft, Taxify, Grab, or Didi. Just in case, these are ride-hailing apps where you can call a cab by specifying your location on a map and tapping one button. Once matched with a driver, you can follow the car on a map, and get more information on the pickup estimate and the driver, such as their rating, photo, and license plate. The ridesharing app idea might feel intimidating at first, especially that the taxi market seems saturated and the bar for creating such a complex mobile app is pretty high. Well, as for the other mobile app ideas, you must start with a niche. Start in your own local market and extend slowly. That's what Lyft and Uber did in San Francisco when they started. Taxify, for instance, is highly successful in Europe even if they started their business many years after Uber entered the European market. The barrier of entry is not as high as it seems. In fact, you can build a ride-hailing app by buying an existing ridesharing app template, which in some cases, costs less than $1000. You can also adjust this idea to different markets. Think outside the taxi space. Where else do people need to call services, based on location? What about handymen, barbers, photographers, teachers, etc? Or target your audience to a smaller market. SaFr, for instance, built a mobile startup just like Uber, but for women only, with women drivers and passengers. Their value prop is safe ridesharing for women, which is a brilliant way to compete with the long-established giants such as Uber or Didi. See where I'm going with this? <strong>Ask yourself what is missing in your local market and come up with an "Uber for X" type of mobile app idea</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-grocery--food-delivery-app-ideas">4. Grocery / Food Delivery App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#4-grocery--food-delivery-app-ideas" class="hash-link" aria-label="Direct link to 4. Grocery / Food Delivery App Ideas" title="Direct link to 4. Grocery / Food Delivery App Ideas" translate="no">​</a></h2>
<p>Just like the ridesharing mobile apps jumped in popularity, the food delivery mobile apps have risen tremendously as well. Ordering food from your phone is fun and convenient. You don't need to open a web browser, type in the website name, register/login on a no-name site and then order food, just to find out they are out of your favorite pizza. Food Delivery apps such as UberEats, GrubHub, Doordash, Caviar, and Postmates are eating the world. They allow customers to choose from a wide variety of restaurants, without the hassle of creating accounts on each restaurant's website. They truly revolutionized the food delivery market, by allowing each party to focus on what they do best: restaurants focus on making food and the mobile food delivery apps focus on delivering the food. All this benefits the consumer tremendously. Just like the ridesharing industry, this market also seems oversaturated. But the good news holds true here as well: they are businesses focusing on local markets, so you can have a huge competitive advantage if you know your local market better than they do. You know what food is great, what food is not that good, what are the amazing restaurants, etc. Hell, you might even know the restaurant owners personally. Take advantage of this knowledge and build a food delivery app for your local market that is highly customized and offers your local customers a much greater experience than the generalized delivery apps can do. To generate even more mobile app ideas, you can also ask yourself: <strong>what else can I deliver besides food?</strong> Instacart, for instance, is a mobile startup focusing on grocery delivery. They are highly successful, even if they started way later than Uber or Grubhub. The things people need to deliver are infinite: furniture, construction materials, cars, bikes, etc. Again, find your niche, be it the local market or the idea itself. A lot of innovative mobile startups get created based on this robust delivery model.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-travel-apps">5. Travel Apps<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#5-travel-apps" class="hash-link" aria-label="Direct link to 5. Travel Apps" title="Direct link to 5. Travel Apps" translate="no">​</a></h2>
<p>Traveling is extremely popular nowadays. Everyone loves to travel and in these days, traveling is extremely affordable. Flights are cheap, mobility is high and technology is your travel guide (maps, information, translation, etc). There are great companies capitalizing on the travel industry already. I'm sure you are already familiar with Airbnb, CouchSurfing, Booking, Expedia, etc. Just think outside the box, and come up with an original app idea to build for your startup. Focus on a specific niche, that you are familiar with and are passionate about. <strong>Build an Airbnb for camping</strong>, or <strong>for cars</strong>, or <strong>for work</strong>, etc. There are a ton of mobile app ideas you can generate with this framework here. Just find something sound and do it with passion.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="6-social-networking">6. Social Networking<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#6-social-networking" class="hash-link" aria-label="Direct link to 6. Social Networking" title="Direct link to 6. Social Networking" translate="no">​</a></h2>
<p>Social networking might sound like the oldest and most non-buzzwordy mobile app ideas ever. But social networks are not going anywhere. You can argue that the market is saturated, due to Facebook and WeChat, but hey, plenty of other mobile apps more recently launched prove you wrong: Instagram, TikTok, SnapChat, etc. A social network is still a hot mobile app idea. Humans are social beings – we love to interact with each other. And we love diversity. Each of the existing successful social apps has its own angle in terms of value proposition:</p>
<ul>
<li class="">Instagram – high-quality visual photos</li>
<li class="">TikTok – short-form vertical videos</li>
<li class="">Snapchat – disappearing messages</li>
<li class="">Twitter – short-form text messages</li>
<li class="">Linkedin – social network for professionals/careers</li>
<li class="">Whatsapp – encrypted private messaging</li>
</ul>
<p>You get the idea, right? Come up with your own social networking value proposition and build a successful social network. People have multiple personalities, they have different types of acquaintances (friends, family, teachers, work colleagues, bosses, interests, etc.), so all these represent great opportunities for an entrepreneur looking to tackle the social media space. Or, you can tackle this from a different perspective, and try to be a direct competitor to an existing app. With a twist. For instance, in the light of recent Facebook's privacy scandals, you could build a social network focusing on user privacy and encryption. That would be shooting for the moon, but hey, who knows? Make your own social network <strong>fun, useful and addictive</strong>, target a <strong>niche audience</strong> (for the beginning), make sure you have a <strong>differentiating value proposition</strong> and go get them.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="7-store-directory--business-locator">7. Store Directory / Business Locator<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#7-store-directory--business-locator" class="hash-link" aria-label="Direct link to 7. Store Directory / Business Locator" title="Direct link to 7. Store Directory / Business Locator" translate="no">​</a></h2>
<p>Have you heard about Yelp or Foursquare? These apps allow users to find different small businesses or stores around them. You can find anything, from handymen, photographers, accountants, doctors, to barber shops, restaurants, and shopping malls. What's truly innovative about these startups/companies, is that they have a rating and review system for each of the stores and businesses in the directories, where users can voice their opinions on the experience they had with that entity. So users are using these apps to read reviews about the people and businesses they want to engage with. This mobile app idea is also extremely local. Each city has its own mini-marketplace when it comes to doctors, restaurants, handymen, parks, etc. Which is one of the reason apps like Yelp struggle to extend internationally. But this represents a great opportunity for mobile entrepreneurs. <strong>You can launch a better version of Yelp or Foursquare tailored to your local market, be it your own city or country</strong>. By building a local ecosystem, you can launch a much better product that Yelp can do, since your mobile app will focus solely on a specific highly customized market. You can even restrict your niche, by going after only one category (doctors, for instance) and excel at it. The mobile app ideas you can generate from this are absolutely endless. Think only about how many categories there are on Yelp or Thumbtack. In implementing this mobile app idea, you need to add at the very list critical features such as map views, location services, reviews &amp; rating system, search, user onboarding, etc. The great news is that developing an app like Yelp is actually pretty easy nowadays, especially if you use one of our <a href="https://www.iosapptemplates.com/templates/universal-store-locator-ios-app-template" target="_blank" rel="noopener noreferrer" class="">store locator app templates</a>.</p>
<p><img decoding="async" loading="lazy" alt="app ideas" src="https://iosapptemplates.com/assets/images/app-ideas-d2a9f60ef48572860e3487889a6a5612.png" width="800" height="600" class="img_Denh"></p>
<p>So between Google and a colorful application, and UI is presented scientifically like this, which one do you prefer? In addition, there are other features that you can add to your application such as a group filter, save a store you love, and leave your comments, etc. All of these features have been implemented <a href="https://www.iosapptemplates.com/templates/universal-store-locator-ios-app-template" target="_blank" rel="noopener noreferrer" class="">in our templates</a>, and with just an amount of money equal to a few cups of cocktails, you'll become a formidable opponent to Google in the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="8-cryptocurrency-app-ideas">8. Cryptocurrency App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#8-cryptocurrency-app-ideas" class="hash-link" aria-label="Direct link to 8. Cryptocurrency App Ideas" title="Direct link to 8. Cryptocurrency App Ideas" translate="no">​</a></h2>
<p>A very lucrative mobile app idea as of last year is cryptocurrency related. With ICOs and Bitcoin blowing up in popularity at the end of 2022, 2025 is the year when the crypto market becomes more mature and stable. So it's no surprise lots of mobile cryptocurrencies exchanges are popping up at an accelerated pace. Mobile startups such as Coinbase, Binance, Gemini, Robinhood or Coin Stats have capitalized on billions of dollars of crypto-related activity, within the last year alone. The market is still in its incipient stages. So the mobile app ideas in the crypto space are limitless.</p>
<p><img decoding="async" loading="lazy" alt="cryptocurrency app ideas" src="https://iosapptemplates.com/assets/images/cryptocurrency-app-ideas-ccd6f288555dc282529367a5732d7049.png" width="990" height="479" class="img_Denh"></p>
<p>If you're looking to start a new app, make sure you analyze the cryptocurrency space. Blockchain and smart contracts are new industries in themselves, so entering it is like entering the Internet business market in the 90s. It's not clear who the winners will be yet, so why not you? Around this app idea, there's a ton of types of mobile apps you can build. From the trivial ones, such as cryptocurrency exchanges apps (for Bitcoin, Ethereum, Litecoin, Ripple, etc. trading) and Bitcoin / Crypto wallets, to more advanced ones, such as digital wallets, Bitcoin payment apps, and platforms, etc. Here are the top mobile app ideas for cryptocurrencies:</p>
<ul>
<li class="">Crypto Payment Platform</li>
<li class="">Crypto Trading app / Crypto Exchange</li>
<li class="">Multi-currency Wallet</li>
<li class="">Statistics Aggregation Point (think Bloomberg terminal for crypto)</li>
<li class="">Peer-to-peer cryptocurrency payments (Venmo/Square for crypto)</li>
</ul>
<p>We've built an app template ourselves, in order to help cryptocurrency entrepreneurs launch Bitcoin/Crypto apps much faster. Check out our <a href="https://www.iosapptemplates.com/templates/personal-finance-ios-app-template-swift" target="_blank" rel="noopener noreferrer" class="">Crypto App Template</a> or <a href="https://www.iosapptemplates.com/templates/cryptocurrency-exchange-template" target="_blank" rel="noopener noreferrer" class="">Cryptocurrency Exchange Template</a> if you're looking to move quickly with your crypto app development.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="9-mobile-apps-for-restaurants-coffee-shops-bars-and-more">9. Mobile apps for restaurants, coffee shops, bars and more.<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#9-mobile-apps-for-restaurants-coffee-shops-bars-and-more" class="hash-link" aria-label="Direct link to 9. Mobile apps for restaurants, coffee shops, bars and more." title="Direct link to 9. Mobile apps for restaurants, coffee shops, bars and more." translate="no">​</a></h2>
<p>Small business owners have a huge opportunity ahead. Building a companion app for a small business might prove to be a very profitable idea. A small local business, such as a restaurant, coffee shop, bar, pubs, dentists, hair salons, etc. could benefit from a mobile app, by offering to their loyal clients, convenient features, such as appointments, online orders, mobile payments, special discounts, events, and notifications. <strong>Imagine you get to notify your loyal customers that there's a huge discount on beer for tonight's football game at their favorite bar nearby?</strong> Sounds like the recipes for success, right? Managing appointments or table reservations for a restaurant, a doctor's office or a hair salon is also a great way to provide your customers with convenient user experience. Millennials, for instance, hate to speak on the phone, but they love to use their mobile phones. You can also add features such as reminders with <a href="https://www.iosapptemplates.com/blog/ios-development/push-notifications-firebase-swift-5" target="_blank" rel="noopener noreferrer" class="">push notifications</a>, to provide an even better native experience. Nothing a website can do, really. This is one of the best mobile app ideas for small business owners. Keep up with the times, people! You'll be able to boost your sales by bringing in an additional revenue stream. <strong>Retain your loyal customers and create a predictable revenue avenue, by expanding your business beyond the four physical walls, that are limiting you so much</strong>. The same ideas apply to almost any small business providing services locally. Starbucks has a mobile app. Your local competitor will have one too pretty soon. Don't fall behind. <strong>Millennials are coming</strong>. We strongly believe in this mobile app idea, which is why we've built this <a href="https://www.iosapptemplates.com/templates/restaurant-ios-app-template-food-delivery-swift" target="_blank" rel="noopener noreferrer" class="">restaurant app template</a>. If you own a restaurant, coffee shop or bar, you can literally submit your working app to the <a href="https://www.apple.com/ios/app-store/" target="_blank" rel="noopener noreferrer" class="">App Store</a> today. As you can see, the cost of developing a mobile app for your small business is really low nowadays, so there are no excuses really.</p>
<p><img decoding="async" loading="lazy" alt="startup ideas" src="https://iosapptemplates.com/assets/images/startup-ideas-6014706d64a1881561d3c7674742df15.png" width="800" height="600" class="img_Denh"></p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="10-virtual-reality--augmented-reality-app-ideas">10. Virtual Reality / Augmented Reality App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#10-virtual-reality--augmented-reality-app-ideas" class="hash-link" aria-label="Direct link to 10. Virtual Reality / Augmented Reality App Ideas" title="Direct link to 10. Virtual Reality / Augmented Reality App Ideas" translate="no">​</a></h2>
<p>Virtual reality, augmented reality, artificial intelligence and cryptocurrency are the hottest buzzwords in Silicon Valley. They are hot in the Bay Area for a reason, so pay attention to them, if you're looking for a new startup idea. AR technology has developed rapidly and in the near future, it will become extremely popular. Especially with new frameworks coming from Google and Apple, such as ARKit and MLKit. With this technology, you will have the opportunity to build brand new original experiences for your customers and consumers. For example, Ikea's mobile app allows you to preview the furniture in AR, by placing it in your living room, to see how it fits. All of this, without taking any measurements or even leaving the house. This type of experiences is really useful for furniture stores, repair or design services, artistic apps, e-commerce apps, etc. Even social networks – imagine hanging out with your friends abroad, through VR rooms. There are a ton of mobile app ideas you can generate in the AR / VR space. All of them are fun, but could be a little hard to build. Apple and Google are working hard on lowering the bar of entering these markets for developers and entrepreneurs. Augmented Reality is a new industry in itself, so just as the cryptocurrency space, we don't know the winners yet, so <strong>entering this brand new market might be a brilliant idea given its incipient stages</strong>. The competition is not that stiff either, so that's an extra opportunity.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="11-music-streaming-app-ideas">11. Music Streaming App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#11-music-streaming-app-ideas" class="hash-link" aria-label="Direct link to 11. Music Streaming App Ideas" title="Direct link to 11. Music Streaming App Ideas" translate="no">​</a></h2>
<p>Spotify just went IPO this year. They are officially a $15B business. Huge, right? Apple Music is even larger than Spotify. Amazon has launched its own music streaming service. Besos might be up to something, right? Soundcloud is also pretty successful, even though they have a different angle. That's what you need too. A different angle. Try to find a smaller niche, maybe target a specific audience for your artists or listeners and launch a music streaming app to ride the wave of content streaming popularity. Here's a concrete idea: why not create Spotify clone for your country, that is highly customized to your culture? Spotify will never do that. Wink, wink. You get the idea. Well, the mobile app idea in this case.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="12-video-streaming-app-ideas">12. Video Streaming App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#12-video-streaming-app-ideas" class="hash-link" aria-label="Direct link to 12. Video Streaming App Ideas" title="Direct link to 12. Video Streaming App Ideas" translate="no">​</a></h2>
<p>Two video streaming app behemoths here: Netflix and Youtube. And all of their competitors, of course. Apps such as Hulu, Amazon Prime Video, Disney Plus, IQIYI, etc. are capitalizing massively on the <strong>death of TV</strong> as we know it. This is the best time to join them. Look at Netflix's stock in the last 2 years, to understand how hot this industry really is. With the great Internet infrastructure, streaming videos nowadays comes at no price to developed areas, so consumers are watching more and more videos on mobile devices. As in any startup idea, you need to come with your own original angle, in order to build an innovative and unique mobile app. Find a video streaming niche and take it from there. The possibilities are endless. <strong>Just find the X in "Netflix for X"</strong>. It can be anything: Netflix for Salespeople, Netflix for developers, Netflix for designers, courses, Netflix for marketing, etc. Find your X.</p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion-on-mobile-app-ideas">Conclusion on Mobile App Ideas<a href="https://iosapptemplates.com/blog/mobile-app-ideas/#conclusion-on-mobile-app-ideas" class="hash-link" aria-label="Direct link to Conclusion on Mobile App Ideas" title="Direct link to Conclusion on Mobile App Ideas" translate="no">​</a></h2>
<p>Regardless of your goal, be it improving profits for your current business or changing the world through a new innovative mobile app startup, I hope that this article on mobile app ideas was useful and inspiring. Remember, no ideas are too big, you just need to start small. Mobile is eating the world with software, so pay attention and ride the wave. Don't miss out on the revolution that's happening right in front of you. At <a href="https://www.iosapptemplates.com/" target="_blank" rel="noopener noreferrer" class="">iOS App Templates</a> we are trying our best to identify the hottest trends in terms of mobile usage and development so that we can predict what types of apps to build next. Our mission is to help people like you get started on their new mobile journey. That's how this list of the best mobile app ideas came to reality. If you enjoyed going through our insights on the best mobile app ideas, please spread the word by sharing our article on your social media. Cheers!</p>]]></content:encoded>
            <category>Online Businesses</category>
            <category>Startups</category>
            <category>Mobile App Ideas</category>
            <category>App Development</category>
            <category>Startup Ideas</category>
        </item>
        <item>
            <title><![CDATA[How to Implement the MVVM Design Pattern in Swift]]></title>
            <link>https://iosapptemplates.com/blog/mvvm-swift/</link>
            <guid>https://iosapptemplates.com/blog/mvvm-swift/</guid>
            <pubDate>Tue, 13 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to use the MVVM Design Pattern in Swift with a demo project in Xcode. iOS tutorial with MVVM Swift code example, describing code architecture.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">February 16, 2024</span></div></div>
<p>As you know, there are a lot of design patterns applicable in Swift such as MVC, MVP, and MVVM. Depending on the project’s purpose, we choose which one is most appropriate. At iosapptemplates.com, we use a wide variety of Swift design patterns to build our functional mobile app templates. In this article, we’re going to tackle some of the advantages that come with using MVVM Swift and explain clearly with Swift code snippets.</p>
<!-- -->
<p>MVVM stands for Model – View (View here is View Controller (VC)) – View Model (VM). So what does it mean? It means we are introducing a new component called View Model to help with the heavy workload.</p>
<p>Previously, everything including the networking, fetching back the response, handling signals from UI etc, was living inside the View Controller. This made it overloaded. So in MVVM, we will divide the work and delegate responsibility to the view model.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="components-overview-and-specific-roles">Components Overview and Specific Roles<a href="https://iosapptemplates.com/blog/mvvm-swift/#components-overview-and-specific-roles" class="hash-link" aria-label="Direct link to Components Overview and Specific Roles" title="Direct link to Components Overview and Specific Roles" translate="no">​</a></h2>
<p>So in general, we have:</p>
<ul>
<li class=""><strong>View Controller</strong>: It only performs things related to UI – Show/get information. Part of the view layer</li>
<li class=""><strong>View Model</strong>: It receives information from VC, handles all this information and sends it back to VC.</li>
<li class=""><strong>Model</strong>: This is only your model, nothing much here. It’s exactly the same model as in MVC. It is used by VM, and updates whenever VM sends new updates</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Components Overview and Specific Roles" src="https://iosapptemplates.com/assets/images/component-overview-498dff1d7db7c03c2d7ab8457a966c6f.png" width="528" height="190" class="img_Denh"></p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<p>In an actual project, there are two main points you should remember while working with this article:</p>
<ol>
<li class="">The convenience when separating work like this.</li>
<li class="">Each component in charge of any particular part will be fully independent of each other.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="mvvm-swift-example-by-building-a-login-screen">MVVM Swift Example by Building a Login Screen<a href="https://iosapptemplates.com/blog/mvvm-swift/#mvvm-swift-example-by-building-a-login-screen" class="hash-link" aria-label="Direct link to MVVM Swift Example by Building a Login Screen" title="Direct link to MVVM Swift Example by Building a Login Screen" translate="no">​</a></h2>
<p>In this article, we will have a login function which handles data inside the View Model. For this comparison, I will ignore the autolayout part and interface builder changes, and solely focus on the connection between VC and VM. Now, let’s get started.</p>
<p><img decoding="async" loading="lazy" alt="MVVM Swift Example" src="https://iosapptemplates.com/assets/images/mvvm-swift-login-screen-example-13b0d1a4a4b6b02f94c30164751137d3.png" width="343" height="585" class="img_Denh"></p>
<p><img decoding="async" loading="lazy" alt="MVVM Swift Example" src="https://iosapptemplates.com/assets/images/initial-project-structure-44afc0eb309ceab5bf1b56dd7d7a2336.png" width="612" height="570" class="img_Denh"></p>
<p>Here’s what I got in the starter project. We have all IBOutlets and IBActions – and two important files (VM, VC) of course.</p>
<p>Now we will talk about each file here. As we saw at the beginning of this article, we all know the role of VC is to only display and get information from UI. We will apply these points here:</p>
<ul>
<li class=""><strong>Get information from UI</strong>: that is the value from the text fields</li>
<li class=""><strong>Show and respond to the data from VM</strong>: after tapping the Login button, we will see a message which indicates whether the user logged in successfully. It depends on the signal from VM.</li>
</ul>
<p>Alright, the problem is how we can connect the two files to each other. There are two common ways: <strong>protocol-delegate and RxSwift</strong>. In this part, I will talk about protocol-delegate. This approach has two advantages:</p>
<ul>
<li class="">It’s very clear, we can know the basic information which is delivered between two classes</li>
<li class="">Each component in charge of any particular part will be fully independent of each other</li>
</ul>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-sending-data-from-view-controller-to-view-model">1. Sending data from View Controller to View Model<a href="https://iosapptemplates.com/blog/mvvm-swift/#1-sending-data-from-view-controller-to-view-model" class="hash-link" aria-label="Direct link to 1. Sending data from View Controller to View Model" title="Direct link to 1. Sending data from View Controller to View Model" translate="no">​</a></h2>
<p>In this part, we have three steps:</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="step-1-creating-a-protocol-named-viewmodeldelegate">Step 1: Creating a protocol named ViewModelDelegate<a href="https://iosapptemplates.com/blog/mvvm-swift/#step-1-creating-a-protocol-named-viewmodeldelegate" class="hash-link" aria-label="Direct link to Step 1: Creating a protocol named ViewModelDelegate" title="Direct link to Step 1: Creating a protocol named ViewModelDelegate" translate="no">​</a></h3>
<p>This protocol is part of the view model and it has a function called:</p>
<p>func sendValue(from emailTextField: String?, passwordTextField: String?)</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">sendValue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">from emailTextField</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> passwordTextField</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/creating-a-protocol-named-view-model-delegate-f822448553ab2c9e146d75fd65d0405e.png" width="620" height="89" class="img_Denh"></p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="step-2-wiring-the-view-model-to-the-view-layer">Step 2: Wiring the view model to the view layer<a href="https://iosapptemplates.com/blog/mvvm-swift/#step-2-wiring-the-view-model-to-the-view-layer" class="hash-link" aria-label="Direct link to Step 2: Wiring the view model to the view layer" title="Direct link to Step 2: Wiring the view model to the view layer" translate="no">​</a></h3>
<p>Next, we will create a viewModel variable inside the view controller and here we will send the value of emailTextField and passwordTextField.</p>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/wiring-the-view-model-to-the-view-layer-d58bac5cee244cdcb5dc53850cb6e170.png" width="620" height="133" class="img_Denh"></p>
<p>Alright, it looks cool, right? It looks like we wrapped the information in the package and sent it. The next step, we’ll see where to receive and unwrap this package.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="step-3-handling-the-actions-in-the-view-model">Step 3: Handling the actions in the view model<a href="https://iosapptemplates.com/blog/mvvm-swift/#step-3-handling-the-actions-in-the-view-model" class="hash-link" aria-label="Direct link to Step 3: Handling the actions in the view model" title="Direct link to Step 3: Handling the actions in the view model" translate="no">​</a></h3>
<p>After getting information from the view controller, we can handle it in the View Model like this:</p>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/handling-the-actions-in-the-view-model-458df9636c08192fddee95bd681d808c.png" width="620" height="138" class="img_Denh"></p>
<p>Run and fill some values in emailTextField and passwordTextField and see what happens.</p>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/login-page-0e3cd75db9b852c7fd3a128819e5aefc.png" width="625" height="315" class="img_Denh"></p>
<p>As you can see, I receive “Email Testing” and “Password Testing” from VC.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-sending-data-from-the-view-model-back-to-the-view-layer">2. Sending data from the view model back to the View layer<a href="https://iosapptemplates.com/blog/mvvm-swift/#2-sending-data-from-the-view-model-back-to-the-view-layer" class="hash-link" aria-label="Direct link to 2. Sending data from the view model back to the View layer" title="Direct link to 2. Sending data from the view model back to the View layer" translate="no">​</a></h3>
<p>Let’s first create another protocol called ViewControllerDelegate, and have the view controller conform to it. This means we don’t care what the view model did, we just need the result of that operation.</p>
<p>This is a great advantage of MVVM. Whoever is in charge of VC will not care what VM did, they just need the result. Likewise, VM does not need to know where or how VC got values from UI, it only cares what it needs to do with those values. So, all the concerns are separated, keeping all the components independent of each other.</p>
<p>For my example, you could see that who’s in charge of coding the view model will care about what it needs to do with emailTextField and passwordTextField, but it doesn’t need to know where these values are coming from. This business belongs to the view layer.</p>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/view-controller-delegate-f02ea47c3025ddc00e2a2c8a8ff71250.png" width="616" height="88" class="img_Denh"></p>
<p>Above is the protocol that I mentioned before, and it has a function named <strong>getInformationBack</strong>. It means we will get values back from VM through this method.</p>
<p>In ViewModel, let’s add a weak delegate variable</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">weak</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> delegate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">ViewControllerDelegate</span><span class="token operator" style="color:#393A34">?</span><br></span></code></pre></div></div>
<p>and send the value which is retrieved from emailTextField and passwordTextField. In this tutorial, I will not handle anything too complicated, just combine the two strings into one, like in the following image:</p>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/email-textfield-and-password-text-field-426cde63e444eb570a5ed1c2780fbf68.png" width="610" height="155" class="img_Denh"></p>
<p>Alright, here, we wrapped the final output after handling the value (actually we only concatenated them, but in an actual project, you could do more like validating the email, password and tell VC if it’s available). Let’s now see how we can retrieve the data back into the view controller.</p>
<p>In <strong>viewDidLoad</strong> of VC, we have this line of code: <strong>viewModel.delegate = self</strong>. Remember that we have a delegate variable in VM, right? This line of code is kind of VC telling VM that it will do the delegation.</p>
<p>And then, we just need to conform the protocol and get the value back from VM.</p>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/view-controller-598cc1ba5f43ae93ee344d1683f16af7.png" width="618" height="152" class="img_Denh"></p>
<p>Build and run the Xcode project again. We will have all that we need now. We can send the data from VC to VM and vice versa.</p>
<p><img decoding="async" loading="lazy" alt="Sending data from View Controller to View Model" src="https://iosapptemplates.com/assets/images/final-login-page-266df9bbc84cbd19b1c5f9d43caee190.png" width="625" height="269" class="img_Denh"></p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/mvvm-swift/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Let’s wrap up what we have done. In MVVM, we assigned the tasks related to calculate, handle data etc. to VM. We only allow the view layer to do UI chores and get values from UI and user interaction. In this way, each design component is in charge of only one specifically dedicated concerns and they are completely independent of each other. That’s all. I hope after this article, you will have an overview of MVVM Swift and how to implement it using the protocol-delegate design pattern.</p>
<p>MVVM is a powerful architecture pattern in Swift and it allows programmers to separate concerns of their design components, so getting a grasp of it is highly essential to any great iOS engineer.</p>]]></content:encoded>
            <category>MVVM Swift</category>
            <category>iOS Development</category>
            <category>iOS App Templates</category>
            <category>Development Tips</category>
        </item>
        <item>
            <title><![CDATA[10 Best iOS App Ideas for Beginners in 2025]]></title>
            <link>https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/</link>
            <guid>https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/</guid>
            <pubDate>Wed, 27 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover 10 of the best iOS app ideas for beginners in 2025. From simple utility apps to social networking platforms, find the perfect project to start your iOS development journey.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">August 14, 2025</span></div></div>
<p><img decoding="async" loading="lazy" alt="ios app ideas" src="https://iosapptemplates.com/assets/images/ios-app-ideas-b7d186f194da9535eca09e6d4ff3178a.png" width="800" height="418" class="img_Denh"></p>
<p>Hello developers, especially beginners! As you know, at WWDC 2019, Apple launched a new awesome feature called SwiftUI, which will be a new breakthrough in UI programming, enabling developers to have more time to develop ideas instead of focusing on technical stuff.</p>
<!-- -->
<p>Since then, it has become easier for beginners to learn iOS development. After we learning the basics, everyone should try to make an application to apply the knowledge and see the gaps between theory and practice for themselves. However, it's hard to come up with an app idea that is suitable for everyone's level. So this article is for you. In addition to giving iOS app ideas, we will help you get different perspectives on what you can learn from each of them.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-expense-tracker">1. <em>Expense Tracker</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#1-expense-tracker" class="hash-link" aria-label="Direct link to 1-expense-tracker" title="Direct link to 1-expense-tracker" translate="no">​</a></h3>
<p>The idea of ​​this app is to manage your money &amp; finances, allow you to see your spending by category, set up bill payments, keep track of your incomes, and plan for savings.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-required-features-of-the-app-are">The required features of the app are:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-required-features-of-the-app-are" class="hash-link" aria-label="Direct link to The required features of the app are:" title="Direct link to The required features of the app are:" translate="no">​</a></h4>
<ul>
<li class="">
<p>Display and compare total cost by day, month, year.</p>
</li>
<li class="">
<p>Show your invoices during the day.</p>
</li>
<li class="">
<p>Add a new invoice.</p>
</li>
<li class="">
<p>Show categories (including food, water bills, etc).</p>
</li>
<li class="">
<p>Show categories with used invoices (for collecting purpose).</p>
</li>
</ul>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="this-expense-management-app-works-in-the-following-way">This expense management app works in the following way:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#this-expense-management-app-works-in-the-following-way" class="hash-link" aria-label="Direct link to This expense management app works in the following way:" title="Direct link to This expense management app works in the following way:" translate="no">​</a></h4>
<p>First, in the <code>Home</code> screen, you will see comparative charts which will help keep track and make comparisons of the current day's expenses. Below the charts, a list will display all invoices you have paid that day.</p>
<p>Next, as you click the <code>Add New</code> button, catalogs will appear. Clicking on each specific catalog will lead to the next screen where you can input the amount of money and give a description for that invoice.</p>
<p>When things are done, the app will automatically return to its home screen. By utilizing the <code>Tabbar</code> navigation, you can create 3 items: <code>Home</code>, <code>Activities</code>, and <code>Setting</code>. Activities screen displays recorded bills in categories (for example, Food: 3 bills, Drink: 4 bills, etc). Clicking on a specific item to see the details.</p>
<p><code>Setting</code> enables users to edit their information and images.</p>
<p><img decoding="async" loading="lazy" alt="app ideas iOS 2020" src="https://iosapptemplates.com/assets/images/app-ideas-iOS-2020-efc0abd1ba528e4b7db1ac32fb56f6a0.png" width="600" height="523" class="img_Denh"></p>
<p>Here is <a href="https://dribbble.com/shots/5500007-Expense-Tracker" target="_blank" rel="noopener noreferrer" class="">the link</a> of the above design.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="so-what-can-you-apply">So what can you apply?<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#so-what-can-you-apply" class="hash-link" aria-label="Direct link to So what can you apply?" title="Direct link to So what can you apply?" translate="no">​</a></h4>
<ol>
<li class="">
<p><strong>Chart View, Table View, Collection View</strong>: With the infinite creativity of designers, you can apply knowledge of views to create impressive screens.</p>
</li>
<li class="">
<p><strong>Tabbar Navigation and View Controller Navigation</strong>.</p>
</li>
</ol>
<p>Basically, this app does not need to apply to the server because it is used to track your own costs. However, you can still apply this by using firebase. We will mention this feature in the next parts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-books-app">2. <em>Books App</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#2-books-app" class="hash-link" aria-label="Direct link to 2-books-app" title="Direct link to 2-books-app" translate="no">​</a></h3>
<p>If with the Expense Tracker application, you don't need to communicate with the server. In this app, let's take that one step further by calling the available APIs like <a href="https://github.com/public-apis/public-apis#books" target="_blank" rel="noopener noreferrer" class="">this link</a>, or <a href="https://developers.google.com/books/" target="_blank" rel="noopener noreferrer" class="">this</a>. The iOS app idea is to help users read online books. Sounds simple, right? But, it is not as easy as you think.</p>
<p><strong>The required features of the app are</strong>:</p>
<ul>
<li class="">
<p>Get books from free sources.</p>
</li>
<li class="">
<p>Allow users to read books, even each chapter of any books.</p>
</li>
<li class="">
<p>Bookmark the reading process.</p>
</li>
</ul>
<p><strong>The app will be as follows</strong>:</p>
<p>First, the application will retrieve the books from free sources and save them to the local database of the app. Then users select the book they're interested in.</p>
<p>In addition, users can also save the reading process and continue reading afterward. The page flipping effect is the highlight of this app. It makes any type of books more engaging for readers.</p>
<p>Since this app will not have too many features, you can focus more on the UI. Making an attractive and friendly user interface has never been easier to attain.</p>
<p><img decoding="async" loading="lazy" alt="swift app ideas" src="https://iosapptemplates.com/assets/images/swift-app-ideas-29da97d7d43111f6f137fe156b64a9a1.png" width="600" height="501" class="img_Denh"></p>
<p>Check out <a href="https://dribbble.com/shots/6999133-Mobile-book" target="_blank" rel="noopener noreferrer" class="">this link</a> if you want to learn more.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="so-what-can-you-apply-1">So what can you apply?<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#so-what-can-you-apply-1" class="hash-link" aria-label="Direct link to So what can you apply?" title="Direct link to So what can you apply?" translate="no">​</a></h4>
<p><strong>1. Networking, Alamofire, Moya</strong>: In this section, you can apply knowledge about communicating networks such as URLSession, Alamofire, or even Moya. Just a small note: <em>If you're completely new, it's really important to learn more about native functions like URLSession to understand deeply the way they work</em>. Using convenient libraries might be reducing your time but when the errors come up, you don't know how to fix it.</p>
<p><strong>2. Local Database</strong>: You can use the Realm or Core Data to save data in minutes in order to build mobile apps in a fraction of the time.</p>
<p><strong>3. Collection View</strong>: As we said, the page-flipping effect is the place for you to show your creativity to make it truly stand out among other applications.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-recipes-app"><em>3. Recipes App</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#3-recipes-app" class="hash-link" aria-label="Direct link to 3-recipes-app" title="Direct link to 3-recipes-app" translate="no">​</a></h3>
<p>The idea of Recipes app is to help users have a collection of dishes and recipes they'd like to try. In addition, the app can also add the ingredients into their shopping cart. This is a very simple iOS app idea, extremely suitable for an iOS beginner.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-required-features-of-the-app-are-1">The required features of the app are:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-required-features-of-the-app-are-1" class="hash-link" aria-label="Direct link to The required features of the app are:" title="Direct link to The required features of the app are:" translate="no">​</a></h4>
<ul>
<li class="">
<p>Show all dishes and recipes which the app has.</p>
</li>
<li class="">
<p>Show details of each dish, each recipe.</p>
</li>
<li class="">
<p>Add ingredients into the shopping cart enabling users to make quick payments.</p>
</li>
<li class="">
<p>Allow users to perform the payments.</p>
</li>
<li class="">
<p>Optional features: list of saved dishes, tracking your last payments, etc.</p>
</li>
</ul>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-business-logic">The business logic:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-business-logic" class="hash-link" aria-label="Direct link to The business logic:" title="Direct link to The business logic:" translate="no">​</a></h5>
<p>I guess after you read the 3 apps above, you can also imagine how this app works. You can use tabBar navigation controller or side-menu to help users navigate to the screen they wish. In general, we will have four sections:</p>
<p>In the <code>Dashboard</code> screen (or <strong>Home</strong>, whatever), this will show the top trending recipes. This is where you can unleash your creativity. You can use either a collection view or a table view or combine them as shown below. Of course, users can see the details of each recipe by tapping on that item.</p>
<p>The <code>Detail</code> page will show all the ingredients which users need to make their dishes. In this feature, this part can be updated by integrating to payment allowing them to be able to buy these ingredients. But this task needs a lot of things since you need to link/ co-operate with supermarkets or agents.</p>
<p>Tapping on the <code>Add New</code> button will lead users to the screen where they can add a new favorite recipe. <code>Setting</code> enables users to edit their information and avatars.</p>
<p><img decoding="async" loading="lazy" alt="mobile app ideas" src="https://iosapptemplates.com/assets/images/mobile-app-ideas-00a10887fb5120f7684cbbaaefa7dd3e.png" width="600" height="575" class="img_Denh"></p>
<p>This image is referred from <a href="https://dribbble.com/shots/5715496-Recipe-App-Design-Concept" target="_blank" rel="noopener noreferrer" class="">this link</a>.</p>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="what-you-can-apply">What you can apply:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#what-you-can-apply" class="hash-link" aria-label="Direct link to What you can apply:" title="Direct link to What you can apply:" translate="no">​</a></h5>
<ol>
<li class="">
<p>Firebase/ GCD: In this section, you can create your own server. Use firebase might be a little bit different from the Restful API but the flow you communicate to the server is the same. You send requests and receive responses. The main thing is the way you handle them in the proper threads, avoid blocking UI or some weird behaviors.</p>
</li>
<li class="">
<p>Local Database: Nothing new but save data in your app.</p>
</li>
<li class="">
<p>(Optional) Payment: Integrate some payment methods might be a difficult task. But let's challenge yourself. And we are going to introduce it in the next parts.</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-the-chat-app"><em>4. The chat app</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#4-the-chat-app" class="hash-link" aria-label="Direct link to 4-the-chat-app" title="Direct link to 4-the-chat-app" translate="no">​</a></h3>
<p>One of the most successful mobile applications is Messenger from Facebook. Creating a chat app is extremely convenient, since it's a popular feature. It is also a great practice opportunity for developers who want to improve their skills. All these make it a perfect iOS app idea to be built by a starting developer.</p>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-features-you-must-have">The features you must have:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-features-you-must-have" class="hash-link" aria-label="Direct link to The features you must have:" title="Direct link to The features you must have:" translate="no">​</a></h5>
<ul>
<li class="">
<p>Login/ Register with popular social platforms such as Facebook, Google, and Twitter.</p>
</li>
<li class="">
<p>Show the list of conversations.</p>
</li>
<li class="">
<p>Real-time text transmission.</p>
</li>
<li class="">
<p>Push notification.</p>
</li>
<li class="">
<p>Optional and advanced features: chatbots, AR/ VR.</p>
</li>
</ul>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-business-logic-1">The business logic:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-business-logic-1" class="hash-link" aria-label="Direct link to The business logic:" title="Direct link to The business logic:" translate="no">​</a></h5>
<p>The business logic of this app is not complicated at all. All of the things Messenger can do, your app should also be capable of. You send a message, your friends or groups will receive it. Make sure everything is real-time and when you are out of app, you can receive push notifications whenever the conversations have something new.</p>
<p>The hardest part belongs to the models and their relationships. So please do not think about Chatbots or VR/ AR if you haven't still met the basic requirements.</p>
<p><img decoding="async" loading="lazy" alt="bussiness logic" src="https://iosapptemplates.com/assets/images/mobile-app-ideas-00a10887fb5120f7684cbbaaefa7dd3e.png" width="600" height="575" class="img_Denh"></p>
<p>Please refer to <a href="https://dribbble.com/shots/6935536-Skillmarket-App-Deal-Offer-Script" target="_blank" rel="noopener noreferrer" class="">this link</a> for more details.</p>
<p>You can also leverage a chat <a href="https://medium.com/@tonyhillyo/best-mobile-app-clones-92ca96556c46" target="_blank" rel="noopener noreferrer" class="">app clone</a> in order to learn from more experienced developers.</p>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="are-there-anythings-new">Are there anythings new?:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#are-there-anythings-new" class="hash-link" aria-label="Direct link to Are there anythings new?:" title="Direct link to Are there anythings new?:" translate="no">​</a></h5>
<ol>
<li class="">
<p><strong>Firebase &amp; Push notifications</strong>: As we said above, let's use Firebase as your own server to save your time and money. Besides that, you can also integrate push notifications with this platform. In theory, it will inform users whenever new messages come up.</p>
</li>
<li class="">
<p><strong>Real-time text transmission</strong>: Does it seem too difficult of a task? Don't worry, since Firebase is a type of real-time database, the only thing you need to do is to observe the signal from the server and update in your app.</p>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-the-social-network-app"><em>5. The social network App</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#5-the-social-network-app" class="hash-link" aria-label="Direct link to 5-the-social-network-app" title="Direct link to 5-the-social-network-app" translate="no">​</a></h3>
<p>Yes, <em>you didn't hear wrong</em>. Create your own social network might sound like a joke but it's not. The social network has become a popular application in today's world. The key value of it is to connect people together. We think we don't need to talk too much about the features the app needs. You know better than anyone else. Social networks are one of the most popular iOS app ideas of the decade.</p>
<p>Let's refer to what we have done with <a href="https://www.iosapptemplates.com/templates/facebook-clone-app" target="_blank" rel="noopener noreferrer" class="">our social network template</a>. It got everything that Facebook has.</p>
<p><img decoding="async" loading="lazy" alt="facebook clone app" src="https://iosapptemplates.com/assets/images/facebook-clone-app-b53cd5f7b288d17c4ea2cba07e2b69f1.png" width="600" height="450" class="img_Denh"></p>
<p><img decoding="async" loading="lazy" alt="social network script" src="https://iosapptemplates.com/assets/images/social-network-script-d57cecf5f67c799fffb767da3c8317b9.png" width="139" height="300" class="img_Denh"></p>
<p><img decoding="async" loading="lazy" alt="notifications social network" src="https://iosapptemplates.com/assets/images/notifications-social-network-992789ef36394fb047e8b8355a1cb626.png" width="139" height="300" class="img_Denh"></p>
<p>We highly recommend you to <a href="https://www.iosapptemplates.com/templates/facebook-clone-app" target="_blank" rel="noopener noreferrer" class="">visit this page</a> to dive deeply into all essential features. They have been described in great detail. The backend we use is Firebase including Firebase Auth, Firebase Storage, and Firebase Firestore.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="6-to-do-list--tracking-task"><em>6. To-do list – Tracking task</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#6-to-do-list--tracking-task" class="hash-link" aria-label="Direct link to 6-to-do-list--tracking-task" title="Direct link to 6-to-do-list--tracking-task" translate="no">​</a></h3>
<p>After going through these big ideas above, if you feel you're still not good enough to do them. Don't get discouraged. Let's get inspiration back by this one – (<code>To-do list – Tracking task</code>). Although, apps like this are filled on AppStore but it never gets old for new developers. The main purpose is to keep track of what you're doing by days, by weeks, months and years.</p>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-must-have-features">The must-have features:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-must-have-features" class="hash-link" aria-label="Direct link to The must-have features:" title="Direct link to The must-have features:" translate="no">​</a></h5>
<ul>
<li class="">
<p>Keep track of tasks by days, weeks, months and years.</p>
</li>
<li class="">
<p>Calendars, for sure.</p>
</li>
<li class="">
<p>Local push notification.</p>
</li>
</ul>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-business-logic-2">The business logic:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-business-logic-2" class="hash-link" aria-label="Direct link to The business logic:" title="Direct link to The business logic:" translate="no">​</a></h5>
<p>From the key idea of this app, you can develop it into many versions to make differences. It could be tracking by process of the tasks, by group, by categories, by people.</p>
<p>After you have the percent, you can show, display these parameters in a various way. Let's take a look at this following image (or from this), for instance. With the calendar, it will enable users to navigate to any dates to re-check or update tasks.</p>
<p><img decoding="async" loading="lazy" alt="idea and must have features" src="https://iosapptemplates.com/assets/images/todo-list-calendar-view-31439048db815414134c55812bbe5ce8.png" width="600" height="586" class="img_Denh"></p>
<p>Which knowledge we can apply here:</p>
<ul>
<li class="">
<p>Calendar: Instead of using an existing library, why don't you create your own calendar? Try it and you will find out it's not easy.</p>
</li>
<li class="">
<p>Retain cycle and life cycle of the view controller: Since this kind of app doesn't need to use servers (actually it could), you can focus on the performance of the app. Whether it gets memory leaks, whether it has a bunch of view controllers having not been removed yet after every pushing.</p>
</li>
<li class="">
<p>Local push notification: it could be used for telling users updates.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="7-the-news-app"><em>7. The News App</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#7-the-news-app" class="hash-link" aria-label="Direct link to 7-the-news-app" title="Direct link to 7-the-news-app" translate="no">​</a></h3>
<p>Usually, we need this kind of app once we have already contents or a website as WordPress. Then we can integrate with any WordPress website, regardless of its purpose (magazines, blogs, news, etc). All you need to do is specify the address of your WordPress site.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="remarkable-features">Remarkable features:<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#remarkable-features" class="hash-link" aria-label="Direct link to Remarkable features:" title="Direct link to Remarkable features:" translate="no">​</a></h4>
<ul>
<li class="">
<p>Automatic WordPress integration</p>
</li>
<li class="">
<p>Real-time updates</p>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="reuters news reader iphone app template wordpress" src="https://iosapptemplates.com/assets/images/reuters-news-reader-iphone-app-template-wordpress-c7d9e5e412fbf856237726550bd9ebd6.png" width="768" height="576" class="img_Denh"></p>
<p>[What you can learn]</p>
<p>Again, you can refer to <a href="https://www.iosapptemplates.com/templates/news-reader-iphone-app-template" target="_blank" rel="noopener noreferrer" class="">our template</a> to see how we embed a WordPress into an iOS application in action. In theory, regarding building a new reader, you can learn more WKWebView, UIWebView. But recently, UIWebView has been deprecated by Apple since iOS 12, so you should pay attention to this in order to avoid getting rejected when submitting your app into AppStore.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="8-the-e-commerce-app"><em>8. The E-commerce App</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#8-the-e-commerce-app" class="hash-link" aria-label="Direct link to 8-the-e-commerce-app" title="Direct link to 8-the-e-commerce-app" translate="no">​</a></h3>
<p>Since online shopping on native e-commerce apps has exploded in recent years, it has brought a deep connection between businesses and their customers. The business logic and must-have features are quite similar to the Recipes App. And from now on, there will be a lot of applications having the same features, with similar business flow.</p>
<p>We wrote an article about <a href="https://www.iosapptemplates.com/blog/mobile-app-development/ecommerce-mobile-app-features" target="_blank" rel="noopener noreferrer" class="">Best Features Any Ecommerce Mobile App Must Have</a>, it is extremely detailed.</p>
<p><img decoding="async" loading="lazy" alt="ecommerce iOS app template" src="https://iosapptemplates.com/assets/images/ecommerce-iOS-app-template-d06ef27b1b5a96386aba472c78855723.png" width="768" height="576" class="img_Denh"></p>
<h5 class="anchor anchorTargetStickyNavbar_Jy_3" id="the-new-skills-you-can-learn-here">The new skills you can learn here<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#the-new-skills-you-can-learn-here" class="hash-link" aria-label="Direct link to The new skills you can learn here" title="Direct link to The new skills you can learn here" translate="no">​</a></h5>
<ul>
<li class="">
<p>Login with Touch ID (a.k.a fingerprint) or Face ID for frictionless user onboarding process.</p>
</li>
<li class="">
<p>Stripe payment with clouds: It instantly enables users to use their mobile phones for online payments. This task takes a lot of time and effort and it's really worth learning because you have to dive into back-end/ servers part deeper.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="9-the-around-me-app"><em>9. The Around me App</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#9-the-around-me-app" class="hash-link" aria-label="Direct link to 9-the-around-me-app" title="Direct link to 9-the-around-me-app" translate="no">​</a></h3>
<p>One of the popular applications on iPhones is AroundMe application. It allows you to quickly find out what you're searching around you. The app will show you a table view containing categories such as Coffee shops, Gas Stations, Restaurants, etc. Tapping on each item will lead you a list of requested places. Continue to tap on each place will show the detail page with necessary information. Think about this as a Yelp</p>
<p>You can also give users a map to make it more visual. This is also the main feature you need to know when implementing this kind of app. Here is <a href="https://apps.apple.com/us/app/aroundme/id290051590" target="_blank" rel="noopener noreferrer" class="">the example on AppStore</a></p>
<p><img decoding="async" loading="lazy" alt="visual represention with arround me map" src="https://iosapptemplates.com/assets/images/around-me-map-view-bb5e897851438bd5b38ba39c71746238.png" width="768" height="387" class="img_Denh"></p>
<p>Check out our article about MapKit to have a better understanding of this library.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="10-the-music-radio-app"><em>10. The Music/ Radio App</em><a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#10-the-music-radio-app" class="hash-link" aria-label="Direct link to 10-the-music-radio-app" title="Direct link to 10-the-music-radio-app" translate="no">​</a></h3>
<p>The last idea is streaming music collection and control music on iOS like Spotify. Yes, you can guess how it looks like. A table view with a bunch of songs and users can select any one of them and enjoy it! This is a fun iOS app idea!</p>
<p>With <a href="https://blog.rapidapi.com/top-free-music-data-apis/" target="_blank" rel="noopener noreferrer" class="">these free APIs</a>, you can retrieve and save them in your database then show them in your UI. The way and the flow are the same as the ideas above. The only new thing is MediaPlayer library where you can play, next/ previous or stop songs.</p>
<p>Next, you can let users "like" or "share onto the social networks". It is also a new thing you can learn. Let's try it. You could be the next <a href="https://apps.apple.com/us/app/spotify-discover-new-music/id324684580#?platform=iphone" target="_blank" rel="noopener noreferrer" class="">Spotify</a>, like this</p>
<p><img decoding="async" loading="lazy" alt="the music radio app" src="https://iosapptemplates.com/assets/images/music-player-interface-c62d61c65651a0861df994be9ce4bfc9.png" width="1024" height="521" class="img_Denh"></p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In general, ideas are just ideas. All the above applications need servers, need to be saved to the local database, need to be checked for memory leaks/retain cycle issues, etc. They could use either tabBar navigation or side menu. The important thing is you should know how to compose all of them from communicating to servers to save down to your local database and update UI in runtime without blocking UIs and provide users the best experience.</p>
<p>Besides that, during the development process, you will also learn the way to create and organize models and manage their relationships. The bigger your app is, the more complicated your business logic is. But you must absolutely consider one of these iOS app ideas in order to learn iOS development more quickly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="where-do-we-go-from-here">Where do we go from here?<a href="https://iosapptemplates.com/blog/10-best-ios-app-ideas-for-beginners/#where-do-we-go-from-here" class="hash-link" aria-label="Direct link to Where do we go from here?" title="Direct link to Where do we go from here?" translate="no">​</a></h2>
<p>There will be a lot of things you need to learn. That's architecture and writing tests. When you're good at Swift, you have to think about how to organize your code to make it easy to test, flexible, maintainable and scalable. Hopefully these iOS app ideas will help you get started with a real world mobile project, and will help you take your programming skills to the next level. And who knows? Maybe one of these iOS app ideas will end up making you millions.</p>
<p>You should always consider starting a project with a fully functional app template, in order to save time and learn from other people, who maybe know more about iOS development. Great artists steal. Check out our awesome <a href="https://www.iosapptemplates.com/" target="_blank" rel="noopener noreferrer" class="">iOS app templates</a>.</p>
<p>Thanks for reading to this article. And if you got here, you must love it. Why not share it with your friends?</p>]]></content:encoded>
            <category>Online Businesses</category>
            <category>Startups</category>
            <category>iOS App Ideas</category>
            <category>Beginners</category>
        </item>
        <item>
            <title><![CDATA[How to Make a Chat App for iOS in SwiftUI]]></title>
            <link>https://iosapptemplates.com/blog/swiftui-chat/</link>
            <guid>https://iosapptemplates.com/blog/swiftui-chat/</guid>
            <pubDate>Mon, 04 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[SwiftUI is the modern way of building user interfaces across all Apple platforms. In this tutorial, we are going to learn how to create a chat app in SwiftUI. There are a lot of interesting concepts that need to be engaged in building a SwiftUI chat app, so there's a lot to learn.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">December 28, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="swiftui chat app" src="https://iosapptemplates.com/assets/images/swiftui-chat-app-44744c3eac1e0c899befaadd08cd37c4.png" width="800" height="418" class="img_Denh"></p>
<p>SwiftUI is the modern way of building user interfaces across all Apple platforms. In this tutorial, we are going to learn how to create a chat app in SwiftUI. There are a lot of interesting concepts that need to be engaged in building a SwiftUI chat app, so there's a lot to learn. Here's how your final SwiftUI app will look like at the end of this tutorial:</p>
<!-- -->
<p>Since the day SwiftUI was introduced to the public, a lot of articles and tutorials have been starting to show up. Unfortunately, most of the articles are either too theoretical or too simple. And after a certain threshold of basic knowledge, you inevitably run into big problems in the real iOS world of SwiftUI. So in this SwiftUI article, we are going to conduct a tutorial that is applicable in practice: creating a chat screen UI, displaying messages in a chat application built from scratch. Sound similar, right? Our screen is quite simple but will show you how powerful SwiftUI is. To get a fully functional video chat app by saving years of development and hard work, check out our <a href="https://iosapptemplates.com/templates/video-audio-calling-app" target="_blank" rel="noopener noreferrer" class="">iOS Video Chat app in SwiftUI</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="getting-started">Getting Started<a href="https://iosapptemplates.com/blog/swiftui-chat/#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>This tutorial is geared toward developers who are fairly familiar with SwiftUI, so this time, the requirements might seem quite advanced. <em>Basic components</em> such as <em>VStack, HStack, modifiers such as padding, borders or properties like @Environment, @State, @PublishedSubject</em> will not be reintroduced. You can check out our previous SwiftUI tutorials, if you want to learn about these concepts. In most cases, you'll be able to understand what they do directly from the context, so no need to really learn the theory upfront. Instead, we will talk about how to use, why use and how to combine these concepts. If you are new to SwiftUI, you should read the following articles before continuing.</p>
<ul>
<li class="">Basic components – <a href="https://www.iosapptemplates.com/blog/ios-development/swiftui-introduction" target="_blank" rel="noopener noreferrer" class="">SwiftUI Introduction</a></li>
<li class="">Properties: <a href="https://www.iosapptemplates.com/blog/swiftui/environmentobject-state-swiftui" target="_blank" rel="noopener noreferrer" class="">SwiftUI State Management</a></li>
</ul>
<p>Besides that, you can read all our SwiftUI tutorials to get the basic knowledge on <a href="https://www.iosapptemplates.com/blog" target="_blank" rel="noopener noreferrer" class="">our blog</a>.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="building-a-swiftui-chat-app-for-ios">Building a SwiftUI Chat App for iOS<a href="https://iosapptemplates.com/blog/swiftui-chat/#building-a-swiftui-chat-app-for-ios" class="hash-link" aria-label="Direct link to Building a SwiftUI Chat App for iOS" title="Direct link to Building a SwiftUI Chat App for iOS" translate="no">​</a></h2>
<p>The business logic and the data flow will be very basic, to keep the article as simple as possible. It consists of 3 parts:</p>
<ul>
<li class="">Part 1: Model layer – Business logic code for the models</li>
<li class="">Part 2: UI Layer – The chat message cell</li>
<li class="">Part 3: Controller layer – Message view controller</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-implementing-the-model-layer">1. Implementing the Model Layer<a href="https://iosapptemplates.com/blog/swiftui-chat/#1-implementing-the-model-layer" class="hash-link" aria-label="Direct link to 1. Implementing the Model Layer" title="Direct link to 1. Implementing the Model Layer" translate="no">​</a></h3>
<p>In this SwiftUI tutorial, we have two models with the most basic properties.</p>
<ul>
<li class=""><strong>User</strong> with a name, an avatar and a variable to check whether it is the current user. In fact, this <strong>User</strong> class will need a lot of other parameters. But as said, these 3 properties are enough for this purpose of this SwiftUI tutorial.</li>
<li class=""><strong>Message</strong> stores the content of the message and who owns it.</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Message</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> avatar</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> isCurrentUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Bool</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Additonally, we have instantiated a few models to showcase the behavior of the SwiftUI chat app. You can think about that as mocking data. In general there are many ways to establish relationships between users and messages (even in actual projects) but this is the easiest way to help you understand it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-creating-the-views--ui-layer">2. Creating the Views – UI Layer<a href="https://iosapptemplates.com/blog/swiftui-chat/#2-creating-the-views--ui-layer" class="hash-link" aria-label="Direct link to 2. Creating the Views – UI Layer" title="Direct link to 2. Creating the Views – UI Layer" translate="no">​</a></h3>
<p><em>Apple encourages us to create as many views as we need</em>, to keep the code easy to read and maintain. Reusable views are greatly recommended. So let's keep this in mind every time we write UI code, and implicitly SwiftUI code. But first, let's paint the whole process before we get started:</p>
<ul>
<li class="">We will have a screen containing messages.</li>
<li class="">Corresponding to each message, we will have 2 views representing the content and the avatar, respectively</li>
<li class="">If we go into more detail, the content will have a background and font color depending on the type of user, and the remaining modifiers will be the same.</li>
</ul>
<p>Thus, we will have 3 views – in order from small to bigger:</p>
<ul>
<li class=""><strong>ContentMessageView</strong></li>
<li class=""><strong>MessageView</strong> – contains ContentMessageView</li>
<li class=""><strong>ChatView</strong> – contains multiple MessageView objects</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="21-contentmessageview">2.1. ContentMessageView<a href="https://iosapptemplates.com/blog/swiftui-chat/#21-contentmessageview" class="hash-link" aria-label="Direct link to 2.1. ContentMessageView" title="Direct link to 2.1. ContentMessageView" translate="no">​</a></h4>
<p>Okay, now, let's create a SwiftUI file in the User Interface and implement the body part. Let's add a few lines of code as follows:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Hello world"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">foregroundColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cornerRadius</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>So we have created the UI of the content message view. If you are a newbie, you will definitely be lost for words – just like me before. Although there are many issues, it is undeniable the power of SwiftUI – very clean, neat and easy to understand. We still have a few problems to resolve, the background color and the text color of the content view will depend on the type of user. And of course, the Text's content should not be a hardcoded string. Let's make some changes:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ContentMessageView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> contentMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> isCurrentUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Bool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contentMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">foregroundColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isCurrentUser </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">white </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">black</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isCurrentUser </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">blue </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">UIColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">red</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">240</span><span class="token operator" style="color:#393A34">/</span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> green</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">240</span><span class="token operator" style="color:#393A34">/</span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> blue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">240</span><span class="token operator" style="color:#393A34">/</span><span class="token number" style="color:#36acaa">255</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> alpha</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cornerRadius</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<p>To test it, run it in the previews section with some mocking values:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ContentMessageView_Previews</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">PreviewProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> previews</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">ContentMessageView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contentMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"Hi, I am your friend"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> isCurrentUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="chat cell SwiftUI" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAB0CAQAAACV3sfQAAAMYElEQVR42u3deXBd1X3A8c9btG+2ZWsBg9lsGdvYwVB26uAGMwECDTMFpixNoLRkCiGdodOWTgNJaTJJGBiYoQEGAkNaUihrAiGGAg4MxGYxS2WDhW1sYcWSJXmTLFnbe/1Dj4csy3jRkyU9zld/Pb33zr3vnu/5nd8599x7I8mkQCDjRMMhCASxAkGsQBArEAhiBYJYgSBWIBDECgSxAkGsQCCIFQhiBYJYgUAQKxDECgSxAoEgViCIFQhiBQJBrEAQKxDECgSCWIEgViCIFQgMh/hIFJqUkJAQLrIeXzGm/29MipWU0KNPQjJoNc6IiIiIiYuLDL+0TN67IaFHt0Soo3EuWFzusCNOBsXq06U3xKmsICZXzrDiVsbE6rVTX6iRLIpbeXKHoVY0aBUYOlvu0jOM/icjYiV0Ba2yUq3e0RQrqTtolZUkhjEUi2Zi8z0hZc9SevWMnlg9YYIhq9VKjI5YyWH0w4GxT98BpjnR4W84dIPZncKPkljhjGD2x6xEECswEjErORpiBa2yX6xRGhUGAkGsQBArEMQKBIJYgYNBfOQ30SshJrbbWKNPQlwU9Z42zSIFexmd9EqmvpF9JGy2wjo5Fjh0iN++0bMm+bqiDG6zz5saHe+I8ShWjyXWmu/EQYvGOi3W6CwzRD3qTiWOMfsLS2qzWIvzHJ6VYtW502LdDlUxhFg9nnS7MsXOycB69M9Lvc9LfmJaBss8aGJ1edQzbjR/UMxqd59l7nKMqDhie/1xW9ztA9MdNgKHYbTp9IinHeI80x0z5CdiiO4W94e/3bYDXr8w6l1hcg+z859fIHap6SY4ah+6i2yd59/uQ0W+6+I9pAM5LnKkIsePm0YVHws7Ue1ckSyMQ/tOu23KzNtjlhlRadG4OkZjQqxOLXJNHkagT2rTrEWfctVK0xGuRacp8rTaIKFSlRx0a9GoW4VD5A8RFzfpNkHJgGrs0CKuUiy1rSYtYqaoVJD6VFKbrQpNHlBOq50mKkavTWLK9WjQpMjcAUOQTq3qdUhotV6Ocnl2ahVRpVuDRgXm6LVZ3OR0hfVq1WS7iSpNSpfWqVVMpR4bNcoxxWSFg1KTJk1iKlRmv1jv+Wdz/ED5Abf3Zz1unS5Juaa7ygL56PQjb7hFi//UpE+pC/2NnR6y2BY9SpzlOofuFgfu9b/+wjXp+NHnWXc4y02Kbfdbj/tEl4gCs1zhdPlIeNr9Frg5fUh3+Jl33OACNLpBlcs86g3t5ntggNDvulWjjfr8gzzTfN8sK90ix00e8Zo2c9yt1k9V+6HDkFTvIa9q1SuuyvkuMVkEy/3IBDd72BLbJJU62bVmpH5hn1r3Wa5NzAQLXTKCSzTHhFg7fGzCAa+b7/CI2/U6ySF6rfGa1X7sz8QkNKjza8sdbbY/etvdujV7zQmKNVjmQXE3DWrTUbP9wu9cZGrqPzs9Y61r5NnpQXfodrJp+qzynHd930UikrZYrWZADpiw0WrbUuOvdTZar84skxy9y5RJmbnKbdNjljJVitBprU63WWa2OabJ0W6tnlSi3eDfPWmaU5Rp8ge32uQfFWGHNXLc5l1zlWqx1IOa3WUSWOFmr5rqJBO0eNzHGkcsZz1IYrVpHDT/1JKx0chGvxF1nYuVSGryQ895zJ+YmHr/dX/pCqW2edjP3W+KG5wv1xYPeMBbNpgxqMTjHOJ9q9OxbLUPVDlWzB/8Usx3XGayhHr3eMa9Zjl2H/ZztSrfc64SMTkD/l/jJnXqtbtejVha863qfNcFysTSnXu/5o/7nRlutECeNk+6w2NO9I3U3japc6OF8rV71m3e9o6z0e5XlpnpRmfKt8ML7rF2vEespywd1OH0WJOhsqf4FwlzUge/1KWes9K2tFizfUs1Sl3tKWtd7pvKUp98QZPG3cSqdqqPvOg0uejzii3ONUO7p21woWtNScWaG3yi1kuDYpA9TBh825WKh6iCUiXiokpMGPD/fJf66yE+/6kXFfsn58hDsctt9KAXnKUE5LnIBQpQ4kJvel6ts7Ha60pc73y5KHGxbrfaOUI1Hj1YnV2L5l3+WjMWsUqd4rQBbXqaiC7d6denpHO3KSYpUJOOCZOU6da5W4nFFpnoLVtSUwHvK3C2chu8Jc9ZKa2IqLFQwod27MN+Hu6MITTZM2UWDvn5VWpNc4a89Oe+ZqJPtKZeT3R6OjsscZg+G1Id4VpHWyg3Le7XR3Cy+SBFrD93xSCHN7tFbcZmkJvUW6/BVm0aBt3rpiS95f57qeSnX/fftCc5RGub7QQr1anEGnUOd5KkbVoVDOr2ZsnVpCMVLb6Iwr2cshoqku1On0bb/dFPB3SnzdptszX1Ki+VUfVHyXx0oddGnSbvsp9lA8aw41SsascPmkzYlLGzXp0We0idpKi4nN0u7ziQuZ8pTvSWV5yKZda5WDW69MoZpFCpqB0D4uOe2f9ZqMiQYm2X1Oz5Ae8mFSlNXy0V2aUJR1JNp1c78nap8Bx5IzYzNiZGhcMhYbkfaHKhr5ikRJFGfzvsUvOd7mHLfKrQEhHnyJWUKyahY1Ann1CY7l6Su8ytjcSIK6YINf4+3RV+Fg+P2uv3knp2GXv3juClxuNerD5LrXeJf1WROt/4RkbKPdE8y72v2v853lcQUabcBivMTrfzhFrdKhWm4kSnDmWp97p1jEC1xVQpEXeKiv2s6CoFmm0b0CFv1jxi9TIm16Ak90usTyVNV566D12XVzJSnfnO1eF9b9vu7NQI8zAn6vT7VFJP0ideFjFTkagScY0a0vu1wroRiQc1Zqm3NN31Ja3zW0t17aVbne1Ia7ye/l63l9V/ecTq84Z7Ld6nrKW/BR+KV61PdUxPeCxD1TnPBEs8YZLZqUS51LkqLPFwSq0Gd/vAEb4qR8QMpT72jHYk1borNRrLNIc7TZv/SKmVtNq/+Y7/2eso+xjzbXFvSq1uL/qFtvGevO/PVOp/+7XLLNznH3CmmZa6xskKfGi1P/WbjOzJVKd7HOeZk25/Z7jMg273glm6vWeNajekusb5FnnEPd5wtHa1pppr9QgcoQLfssoS1zrVYZq9qcl8f7XXwVCJb/vYcn9nvmrrfWSeHO+MV7EiJqhWvNvoI6pctUIR5KlSnqq8rVbpc9wuc9OfxabJqgelrESc4Fb3ed9jckx1lTMtVyKOiImqdzlhU65yQI4RVa5ziNPQnw3GF3keiwZkM4Wuc6RHfWSliGJfc6UzU+PdfN8T8YpatYotcLVfaU9tPWZKap/2VA3lu4zYclWk1ql93jVXpE5BR0zzY/d72St6xFW42pUOTx3JSsUDxt8RxapS064R8/zEzy31mohy33SluzQMOqGVsXof7q0iO/fSafVZZZMjdlul2K3WNjNVidisVplj5eIDV0p4wvTdStqpVpt5A2ZpPh8Z1ltlq0JHqNFnubjjFOq1Uqsa1ekVCO9pN0NF6nW3FTrV7PHk92LXm+KXg8ZbvRrU2Sqq3LHpsvrL32KlJpSbpVydVkerRqcPxNXscYK0w4d6zUlHna0+FDF3QKU3q5NvVrpZdPjIBh3yTTUzXW6rVeLmphtLQr16FWam93CzFZpFVZutxArNalTvJVsqPIB1JyMu1v6m7b93lQXuHHJy8Iu/mRg0gzNctvmR+13uZ+nJhF23RnSIWaA9vzMSUy3JA/jN+3ukDkysMZZjJWzW7eQ9dk9f1OXGMrgXW231kqeUu3gIrb5oa5GMLx/O9Mjr4OzhGBMraZNiR43ybnX5L09r0Ocq8wSyYlRY7XIzR30WpMBkM5zsGxm93OrLxBjLsfrzhugor+1O6tClQP6Xeh1+VuVYY2PGNqIoRKrRrsfQprO+UxstsYJa2S5WZDTEigWxsr5TGxWxokGsLI9X8dER62BOCAZGI17FDvB7wxYrJ9xkK4s50NtGZcCJ2BArEQLZQWzIE1oHSayInPG/wjkwpBy5ByxINDNe54VMKwvT9txh9EUZSo/iQa0s1Go4j+7N4MPGe3WFRzZlUSeYOzYeNk7/EznD0wvHf6yKyx32xHdGxeq/F3Kv3vAo33EbqeJiGbkzdYbF6pcrKaEvPBds3EkVE83YmZQRECsQCE+mCASxAkGsQBArHIJAECsQxAoEsQKBIFYgiBUIYgUCQaxAECsQxAoEgliBIFYgiBUIBLECQaxAECsQCGIFgliBIFYgEMQKBLECQaxAIIgVCGIFgliBQBArMOb4f0N6ctU/0DXVAAAAAElFTkSuQmCC" width="300" height="116" class="img_Denh"></p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="22-messageview">2.2. MessageView<a href="https://iosapptemplates.com/blog/swiftui-chat/#22-messageview" class="hash-link" aria-label="Direct link to 2.2. MessageView" title="Direct link to 2.2. MessageView" translate="no">​</a></h4>
<p>Are you addicted to social networks (specifically Messenger or Whatsapp)? If so, I am sure you will be able to visualize their UI / UX design in your mind. Let's start with the type of user who will receive your message.</p>
<ul>
<li class="">We need an image at the beginning – of course, it is going to be rounded into a circle.</li>
<li class="">The content message displays next to the avatar.</li>
</ul>
<p>Similar to the above, create a SwiftUI file and name it <strong>MessageView</strong></p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">HStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">alignment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> spacing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"My-avatar"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">resizable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> alignment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cornerRadius</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">ContentMessageView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contentMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"There are a lot of premium iOS templates on iosapptemplates.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                          isCurrentUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>While coding, you can see the UI will be constantly updated in the Canvas view (on the right side). This is one of the most popular SwiftUI features (live previews).</p>
<p><img decoding="async" loading="lazy" alt="message view implementation" src="https://iosapptemplates.com/assets/images/message-view-implementation-fa7c2a3ad98d2ec5961ead74d053e4a3.png" width="300" height="98" class="img_Denh"></p>
<p>It looks good, right? So what about the sender? According to the current UX, the sender's message will be on the trailing side and no avatar. At this step, we need a variable to check current user information in order to update the UI properly. As a side note, <strong>if/else</strong> or <strong>switch/case conditions</strong> can only live in <strong>HStack/VStack/Group</strong> or similar components. After combining the values and conditions, our code will look like this</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">MessageView</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> currentMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Message</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">HStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">alignment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> spacing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">checkedMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isCurrentUser </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">checkedMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">avatar</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">resizable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> alignment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">center</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cornerRadius</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name">Spacer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">ContentMessageView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contentMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> checkedMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                              isCurrentUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> checkedMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isCurrentUser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>If you would love to see how it displays, let's update code in the previews section as follows:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">MessageView_Previews</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">PreviewProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> previews</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">MessageView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">currentMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Message</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"There are a lot of premium iOS templates on iosapptemplates.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">DataSource</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">secondUser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="message view implementation" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAABMCAYAAADX/oqbAAAhWElEQVR42u2deXBdx3Wnv+5734KdAAECBECAOymS4CaSWq2NEmlJlrzJTuLYcUaZsUu27MQzccVTNZPx1FRNxomdeMZ2RomdjLcoY2WZ2JaojdZCSaRIiftOACRAbMS+b+/d2z1/nPewg6RkkpKi/qpYpSfcd9+93afPPX26z+8qa63F4XA43gNo1wQOh8M5LIfD4XAOy+FwOIflcDgczmE5HA6Hc1gOh8M5LIfD4XAOy+FwOJzDcjgczmE5HA6Hc1gOh8PhHJbD4XAOy+FwON4N+NfiR5IhXOiztPRYhhMWnD6Ew/G+RinIiClK5yiKcxS+9y5wWMbCqRbDP74Z8MZZQ3ufZTQAJ2jjcDiHFY/AvFzFjUs9Pna9x7JijVaX+N7V0sMKDDx7LOR7O5O0dFsXVDkcjpmdEFBRqHj0ngh3rvTw9TWOsCzw0qmQb+5I0j3oXJXD4bi4v6jvsHxzR5KYD7cu82aNtK5K0r25x/LYC85ZORyOy6e11/KDlwNae2f3G1fFYe08EXKu3Tkrh8Px1jjZbHitJsTYa+SwEgHsqQ4JjWt8h8Px1kgG8MY5w0jyGjms3mFLe79reIfD8fZo6LQkAnttHFYQQhC46aDD4Xh7jCbtrFufrkoOy7krh8NxNXhXlub4HkT991dH+B5EI9fmtyIeZMfVJTfpXTMjVJAd56peT2YUIv/KbEopiEV41/TjNRkn1/oHIx7ctMxjft70Vk4Elr21huvKNMV5in/YF5AM3h8dsWWxZlW55ke7ApLhxY/NiEq1wGyJyYtRUaj47K0+xsL3Xwxo63vn4+ElxZrP3+nz3Z1J6q7C6nJuhuILW32ONhp2HAqxQEG24oYlmpWlGiycbDHsrTGTtuJkxeCGpR7rKjS+huONhlfOGPqHp19jPCIOZDhx7dotP0vxe7f7PL4noKnr4u2WFZMSucR7fDxd8whLKyjKUVTMVSwrUXzqJp9blmsq5irKCzQZUZifp1hUpN5XT46iHMXSeRp1qdIEBR/d5LOtyrvksVPxNNyz2iMnrnhib0jP0Ltj8t4zZHnznKF/+CrlRALLkUZDQ5dUXJQXKP7o/ggPbPDoH7EMjFoe3ODxtQ9FKM2XRo1F4N/c5vOZm32GRi2dA5aPXu/z+9t8MqLTf2NblcdHrvfxruGIivqwukyTGb3EmNPw8O0RNi1+72sdXPMIazSAnx8I0EqeEMW5ih1HQl44HmIthAZuWjr+BCnIVowmLU1ddiyi8DUUz1EUZCkGRiyN3ZZkIB1YlKPoH4XSOYreYUtLt2VOpqI0X2GB5m5L7ywDNSdDijEjPnT0Wdr6LMbC3GyFUhIdzslSnG0zJAMozFEU5SoSATR1G4ZGZ3YwBVmK4jw5R0uPpWvg0o4iFoGyfEVWTNEzaGnptYQGSvIUq8s0/cOWow2Gxi47LSLzPTkuP0sxOArN3YZEAGUFiiXFmvZ+WYWZmtjMiMq9dg5Yygs0vje5vYrz5F6z45AZU9S2GrSS68yOK7oGLBdS15kVg5y4YjSA+XMUQwnpw4yo9IWx0NBpGE5A35Bld3VI/4glOy4RUXO3HRtspXMUHf2WwEBxrqJvRO5PK2joMoQGygs0sUjqegcnl4IlAzhYZxhKSLt+bLM4lv/+iyQtPRYFPD1H8ZUPRvjEFp/v7UxSkqe4aanH93Ym2VdrsMDuasPn7/QpzlOTIsGiXMWqMk12TLGoSNPQZRhNpuwpX+EpuNBr6R6UNi/MEVuMehLptfdbOvvtmD31DVmausX2CrMVyVD6tDhPMTQ6bu8zzV5K8xV5malx0WUJQumfNeWKoVFNY6d831r57ZI8RRCK/Q6MjD/YSubI2BscsTR32xmjeU9LPxRkK4YTco7hhJTalOYr+oahIFv6s73f0tprf+064ndkVh+E44ZkLIQzhKpl+RLuzs0Wx7S7OuTHrwaEBu5f77G9ymMoAdkxxd6zIX+3O6AkV/HV+yN0DUFxjmLHkYBjjYYvbI3ga2ngwVH43q+SnO+w037v393pU5ClsFY6/0evBeyrNXx4o8eaBRpjwYTw7eeSLCpS/MYNPqGRQVDXbvn+S8GkKYUCVpVp/u3t/phBBQb+/Jnpvz/Vcf7uBzzWlGlGkhCPKF48GfDkoZA7rtNUlSsSgUJpn796IZjkAGM+PHi9x92rvLHvnmgO+bvdIdvWeFSVKUaSCq19vv/i5O8uK9Z8eVuEg+dDFs7VzMlUdA1avrMzSWOn5eHbfLLjiuw49AzC/34hyQMbPDZUakYSkid68nDIM0dC1i7QfOIGn84BS2G2Yk6mYteZkIKsVIV+rmLX6ZD/80rA/HzF72+L8K2nkywtUdxb5fO1JxJYK070jz4U4a9ekB3Qf3hfhNY+S0GWYl6O4nizoWfIsnSeZl6uornH8hfPJOnot5Mc8Wdv9TnUYDhcb1i3QPP4noDGCdOopm7LjsMhv32zT2G22IBW4sAjvkz1zrQY/vifE9MeTLcs12xaqIl48KmbPf72ZQsKPn+Hz5xMcU7JEP7m5YCTTYaPb/KoLNIkAsu8XIUx8Gq1YeV8RWG2OP+/3ZVkb63ht270ycoQ28nPlHZ86VTI3+8Jpjmr377Z54YlmsFRmJMJu2sMT+wNuH+9x6JCTVZUkZuh+KsXk6ycr/n0LT5aieNs6bX84CVJEWyr8rh/ncfAqPTp8SbDT14LJt13xIP71nvcu9ZjNGVnNW2G778UMDAs/dTQZSnOU2THIDOq+J/PJTlUb957DutyyMtQfP/FgJpWy/pKzefu8Hn+eEg8orh3rcdPdwccrDcsmaf5g+0RjjQYuvotC/I1B+oDvv1MyGjS8rUHotR1GH76Woin4QtbfT62yee7zyfHHCdAXqbiWKNl16mAkSR85laPras8jpw3ZEQURdmKbz2TpKZVooBPbvF5+VTI88cMhTnwpXsi3LXa45/2BZOiqzmZ8KvjIbtOG3wP/uOHIty+0uMnr86eTLh9pWZVqebPnw1o7rJULVA8fHuEMxcs/7I/ZFGRpnfI8sNXAoam5EyuK9NsX+Pzw1cDDteblDPwuXWF5Wd7Q0rmKNp6LT99LZj21PQ9WFGieOqw5aevJsmMwR9sj/CRjT6PvZAkK6rIz1R8+7kkTV2Gm5Z6rFug+d7OgPMdhpuWeXxsk8+xRkPEUyzIV/zyYMj+c4btVR6fvtnnOzuT/PWLhluWaT6xxeeXB0M8JdGYpyHqi4GPpxAUOXGRH0lHW8caDY/9KmBRkeKPPxLl2aMB/+NJiYq+el+EFfPVJIellER8MV8cUNSD2rbJA8daON9piPvywKjvMDx/TBzYB1Z4HGkw7K8znG0z0zZFP30opCxfkxOHv9wZMJK0PHp3hKEEfHdnkmQAn7nV5+ObPb7VYciIimP60x0BPYOWR+/2uXuVxzefTtLaKw+G21d6HKwz5GZIju+bTyep7xBb+OLWCIfOm0klLPGoIjDw7WcDGrsMaxZovnBXhJ3HQ37yWsB1pZpdp0OePhQS9RW/eaPP4fOGn+8PyYqL/W6r8njqUMg9azxePm3YcSigOBVpxiMS3U3MOz64weenuwPePGsozIV/vz3CB6s8/nFfQG5cMScTvrUjSSKAR7b6PLBBxpP5NaKsd+2ktrbNcPqCoX/EcrJZdr4WZClWlChiEUU8qti4UFOUoxgNLGvK5VZ6RywvnQzpGrBkxxXLixXdg1C1QLGqTNExaFm/QBOfsiJXfcGwuzpkfr5iw0JNXlxCaz+VSDvaZDjeZBgYsVTOlTA4tLC+UlFRqOgfsaxboCflMIyF/ecMRxsNy0oU6yvkKVyYoy6ao9q8SPPmOUNN6v7314lxXleqSYSp5GkIQ4nJUj0KuK5U09Zv2X9Opli1rYZ9Zw3XV3okAzuWeB1KMKPhtPZZdp02Mp3usTx3LGTdApluAew9G1LbKtOrDZWaoYRMVTYs1MR8iWaWzJNGuNAr09a+YUttm+FCn+VEkySta9sM1tq3vBo8nJCd0D1DlvpOS2uf4WijTLcauw1dg5as2Ozt66V0l2aqxAiMNKJW0kaP7wn4xlNJTrUY1ldq/vjDER7ZGiErNj3NkUi17VBC7G5lqaZ32LJyvmLNAkXfiGVFiSY3Q67tRLOhrt3Q0W8532mp7zSca5ek/9k2Qzyi8D2ZOh88bziRsr2DdYb6TktV+eShOzBi2XEoRClYV6lZOFdsPDOqGEnILGY0Kf1elKtYWKgYTljWViiWzpMp5Mr5Gq2hvd9y4xLNrSs8rJUUztS64OUliv5hy95asbP6dssrZwxbFms8T7Y27a4JaeuzkqOsM5Tn67ecd33PRFijwbhRhQYCY/E8yIgqcuKwulQTWsk/VF+wY7WLgUkZXiopGYvAoiJFfpZOzbsVr5yZXqu0ebHHQ1s8eoYsPYPyJDZpL4AYcPo7GVFFRgRWlGiGEjaVOIZz7eGkDvE0fHCtx12rPFp6LAMjYsxK2YsuSmRGxcDTv5cMYCRhyYiOXc4s3g4yInJsOq9lrBhzRlQilEsxkkREFtMJ8WFLLMKY407rmSklzqkgS1FVrjBWoYCD9Ya2Pkt+piJpxtvMWghCizHj12Uvch+zfQzNeEoBO24b6d8wqWubNcGfym8V5yoaOu20hY8g5XS0Fjs6WGc4ct6QGRWn/If3RthdHbKv1lx0JTwekeS+l2p0TylePROOpT6S4fjDxlj5bCZ8nvjQ6xsez/2EBvpH7DSnWZCt+PI9EWIRaOuzeEoi5pkMJuqLDS+ZpynOkxMPjUJ1qzxMfvRKwO0rPW5drvnIRo+TzZYfvxqMLdIoJRGdOOrJ1zlmZ3byimkiAO8KLKK9p3amWAsdqeTdz/ZJ/iW96tg3DAVZk4/vH4G+Ydh1OuT1GjGwnLgiHoGRxOSp0L1rPc60GP5uT0gQWj55g8+qsplHeEe/pXcYfnkwpLbNoFILBJMGE5AVhwc3+DyxL2DXKXFmX73v4l7DGEnMLyxUxHxxILmZEtEdbpBw2lrpfMXkQW8ttPVb1lXIk7xrQCKYykLNhV476dpmY262Yv4cRW2rRSnJa3UOWEanVC8YI9EYGH78ashQwuJ7kiTu6Ldcv9B76/0LBAHEfUUs1Ue5GZLkv1J0DljqOix3Xudxonl8oSQ7Drev9DjfKVHPshLNHSs1T+wN6R609I9YDp2XKCcnQ826Cpse/N2DljfPGnYckcWkrJgiKyYLDG9pgGpYXCQR7mhSFjvKCxTHmyY7zDXlmiXzFF95PEH/sGXxPM3GhXqsXW3q+pSC/mFLR79l5/GQIw1ynvxMNeYQjYGf7w/4xUF5KH95W4Q3zir21Iw/GDr6LHmZsrDT3meJeLB4nhI7C8b78z2/SvjrcrTRcO9aj09u8XmtOqQsX/GB5R5/sytgNDG5iXqHLC+eDPnEZh9sSCK0bK/yqL5g+b+vB2Mtai10D0knry435GdqtizWDM+yz6muw1DbZviNGzyeOSrGuHWVx/PHZbVz4uJC77ClaoFM05YUaZaXKN6stxcdtL86GfKluyM8tMWnps2wZZGHpyV6MUYGw4ZKzY1LNfvrZEUqzaF6w92rPT5zi8/esyFLiiQf9pe/Sl6WAWVG4ZM3+Ow6HVKQqbi3yuMf3ghIzNAWr5w2fHmb5CZONBtWlWqWFisee+Htb/Zp7rHkZMBDm31q2wybF3sXneK9VQZH4RcHAh7ZGuGRuyLsrpH+umWZx3XzNd95PslwAoZGLRsXehTlKF48GRIYOSZpJPk+/SEGNy+VPjlUb3j5dMjdazwGE7Jt446VEr3/6JW33jYrShSf2OJT02rYssQj6ikO1JlpU8J4RKbpvcPikOPR8einc8By01KPhk7L6RbD4QbDxzb5xCIBvoatqz321hperzE8stWnsduy76xh8TxNMoTuocnXdLzJMDhq+eytPq9Wh1QUaDYv8njsxeRVVRT2vv71r3/9Sp5wYASePBTSexl7ajwtkUl1q520gTE3QwzrTItMizwtIe/JZlnGP9dhWVqs2bjQIy9T8exReVJ4WpGbAYfP27FkdG2rJR5RbF6sWVaiOd1iefpIOClZbS00dltK8zXrK2V/0/46Q0e/5Bpy4rJaVtMqoXkygNo2WQHZtMijNF/xeo3h1TPhpC0GgYGGLsk9rSn36B22HKw3tPZZqi9M7tXsuExHjjcZ2notbf2Sp1hT7jGSgJ/tDTnXJtOZzkFLYbamNF9zonnykvPACGPts77CIyMqOYgDdQastPeFXhFMm8r8OYqqBZrnjoXcuMSjslDz0qmQncdCEqHk3hq6ZD8TQNegpbXPsrpcs65CIqpfHhJpoYyobDs43iRbKuIRiEUURxsto8lUcj2uONIg2xVy4nCkQfJmgwnYUOmxoEBxpEGmmEcbDAOjkJ8FxxoNfcPj9nOq2dI1KNF2frbibJudlJDWSiKI+k5Zom/rkyhrabHmpqUeq8s1AyPw+OsBRxsM1qbasd2ypFhz8zKPqnJZsf3JawE1F6Yr6HYOWOZkKSrmaqovWI43STS8aZFm5XxNY5flqcMhvUNyzR0DlrOp/szLlBzomRaxr+y4IhnAmQuW6xdpGrotwwnYssRDWcmt1bRafK3Iz4TDDZaGTkkDbFniUTpHcaBeIsWjDbK/ra0PFhQo5mYrDp03nGq25GcpNi32qJyrOHje8NJJQ++QpXsIVpXK+MqOwS8PSrtMnKoOJSTPvLBIs6HSIzdD+n5vagtIca7iZIsdW/zIjCl8DQfqzCUfnAVZigc3+GREpz+orrhEckuP5fM/HOV856VPq5Ss3ATheN4pnQNQanx+nD4uGY7ntWK+DIAgtAwnGVuGjvqT801px5gRlRzLUMLOKn0T8yEaUSSScoyn5Vzpko6pWy8inszljRGDmimJrYB4FHxPkpyKyfc2cVrqacaipbTmdcSTRYXR5PQ8hK8Zu/fZ7iUIxaGlj4n68t8z7abfuFDzle0RPv/D0dR1yjVPbHMz5bsTrzORus709MP35D5t6qET8cZzYBP7Kn1d6X7TWvJ41kq7Rn1ZZLBWriF93FS7UEh5UzjFnlTq/KGdPGWPRxgbFMOJmfcaTTxmJGkvupM96ss9j6RsQafyfFqrSXnF6BR7mmrvvpea8itZpW3utfz97oB4RBEYy0hC2jh9/+n28FLtFlo5ZmKbpttGK8bswfcgIyLbLib2s0rtA4z6iuQU+5npnmMRRThhHKbbbeJ4Tff/5VRnLJmn+MHDMfKz1LtrSjhbecnUwTTTcaMB0/Mqs5wvNBIyX06if+I500Y/WzlDMoTksL1kXkaM3F5yb9rEwWRTScvhWb6XCCDxFu5l4vdm/U5S8lLGpnN8dto5Z+rDma4zNJNX4qZ+ntpXE//bTOmv2Y6bahcWpjn2sf8fzLzAMJK0l1yEuNQxk/okmHyPg6PT23FqH0y19yCEIPWA6B609A+Ls0uG9qLjIp2Qn7GtZmibIIT+0M7YXpd734nUCulM7XYxe3jf5LAcV4/qVsOf/DI546B3XHsSIfz96yGhcfonzmE5Znxadg64wfFuwaa2CjjGcW9+djgczmE5HA7HvwqHVZAt8jGec5eArKCUFagZZUscDsc77LBuW6n53J2RK7oh8EoxN1t2El9LLa6smOLRuyMsK7l0d5TlK+blKme5DuewrhWv1xge3xOM1eGlma0GTKmL/+1iXOzvM/3txmWaT97gjxX7vt1zvZVjtZKyoqmFwNOO0/DRTR5bV3sz/t7bbaPLvWbFlbl/h+Pt8o6sEkY0Yw5BK6gslB3WGVHF+U4pNh0cnfC3Ck3UE8mPow2i3JCboVhfqcfE4Q7UGZq7LFlxxboKxbl2y+oyTUG2oqbVcKRBRPeWFmsyY7InZVWZaBHtrzc0dVmWFSs2L9IsKNDcs8bj9RrZLbxgrmLtAk08qjjXZjjWKNeweJ5odYVWztvSbTjcYFkyT7G8RNM3bNlTI2oF6Up4a0UjazRp2XtWdrVPJS9TsaFSZKIHR+Xe2vqkRrCqXNM3DO19HrurZWf9shLNdaUaC5xoMlRfEAmUjCisq9AsmKsZTlgOn5dKgZmE+9ZVaBYWakaSshu/oVP2Y8UiUFWux0o0jjWOS6ysXaAJLeRlQlm+prbVUNNqWVWmqCjUtPZa3jwbpvYiORxXIH3yTpTm3LrcY9tanz3VIctKNF+6J0J+liLmK+5Y6TE3VYazYK7iy9siZMck33XndVLL1dhl+fTNPrcs90iGUkZw63KPN84Z5mTCV++LsnieJj9TShEe3OAzmJBymvvWenxii095gSIjqlhTrvnACo8TTYa5OaL9U5AlpTjn2i3FeZpHU9cXjyjuWeOhlKL6gmHbGp/fuVVE7fIzFdvX+iwrEanjrJgcm5sp9X0PbfZ4YINPWYHc5/WLNDcu8aRUwcI9azwO1Bs6+y2f/YDPliUegbFUlXvcsET0mBbP02xZ7OF7iu4hS3WrZfNij4dv99FaisC3V3m09UnJzIev9/jwRp+BUcvCQrnPw+fNNCG2T93s8+AGj9FAlC22V/mcbJHyl49vFh0nY2Q6ur3Ko6VXSmh+91afbWtFcrk4V/HBtT5L5omzKshU3LfWYzhVYuJwXC4XK815RyIsRbo0Q/HAeo+6DstjLyQZSkh5yBe2RthTYygrUER9qd9q6bEsLtJjBZ1HGgy/OBjS3ic1fX/6G1Eq5iq6By1zMhSnmkP+cV+ABR7c6PHQJp/d1SZVVwZ/+lRAbZvIJ//nD4uo3uN7AioLDavLND98RV6A8cW7fZp7LH/9YsBwwrJ1tccD6z1eO6PGyhx+8qooNX7qJp/tVR5feyJBc7flQxtEkTEeFSG63Az4258HtHRbinIV3/hklBuXanZXm0lTqf11hn9+I6S931JRqPjah6KU5yuePxayoVLT1idyH7kZivvXe+w6bfiX/SI7/Tu3+HxwnUdNm2V9hTjEn+4O8BRsWKin7TaumKvYtsbjz55OcrDOEPPht27yKc3XjCal0PwHuwJeOx3ie/DwbSLod6IxgVaiPJpum/9wb4R5uYr/9vMkfcOWz93hU1Wuefpw+J5/+YHjfTwlTJMdF+3oJw+NTxtqWy3dQ5bKQsXpFkMQenzxblEUPd5kON0sxbQNXZb1FZrCHJGNzc9UY9PMvhHLG+fCsdKaA3WGj2+Cwmz5fOqCiL9ZK6UPRxsNC4sUkSmKKJkxxcIixWgSPr7JG5uuzc1WzEnVOTX1WDoGpA6ra0Aim44BmU6lCz99rbBYjjUaWlJa5e19lmNNhhXzNXtqxr3IaCC65OsXyr0VZUuB60w5tdwMWFio6BxQfOpG6cr5cxSFOYqIhgP1hvvXSYH4iSYREpwqxFZaoBkNZCqZLvX48asBKJnyaS3TQGNlY+nrtSFfWRohMy73f7ZdJFdCI1pTo4HIlwQhdA5AUe7l6XA5HO96h5VmWmFlqrD1XLvlT55Msr5Cs65Cc9d1EV48GbLrdMgfbI/QPShSGec7LSNJPfv5SFVzqfTf7aQE8myibyr1r3/E0j4ginPt/aKa2d43rg2U/j075fNUppZSpQtWJ5KW+W3pEXWIhi7D+qSeNdGdlsZpTznH9n5L77D8e/JAwOlmw8aFmrtWeTy40eNbTyepbZ2sOz9zp6T+lhZTmtiOE743UYhv7P4nfnZjzHEFeUeffYOjEmmkX1XkaXlvXn6W4nynpWKuoihH8cKJkD9/OskLJ0OR6yjV5GUqfvhKwD+9GXKiyUwaeXkZSt4l54miwepySRh3DsjfV5RIst7TkrxfXaap77Bj1eUxX6Ki4YS8YWRgBHYeC3nqcMi+s4bOATtJlfPypsGKNaWaolyFTsmirC6VXNhEB1dRKNHi3+wK+Kc3A0402bEtFtZKYXA8IvfVPywvT2jvszxzJGTH4ZBjjYbuQTl+TbmmY0D02/9sRxJfi4RyxIOFRSJk2NxtifnSJp6We//wRo/NizUd/SJ/smK+SINEfdhYqWnusQyOOlfkeJ9EWCY18EaTohH0yF0RvnhPhI5+y6ZFIkpX2yo62g/f5vPmOUPPENy0ZPxvoYFP3+JT32lZOk/ySemBPxpYblvhMS9X3n5y+wqPn+0Lxl5XpRT83u0+1a2yMpgTh12nQkIjryp6aLPHb97k8eRBeQPMF7b6fPFuiXrWVWjOd47rHZkJhanp15RN/ZyKxYj4IsZf22ZZm9JX2lNjxr9nRZ4nMPKWl6Zu0QH3FGNKo/WdsnDQPSiLG88eC3lok8+81OvGNlSKhtXZNrhjlUdZvmJ3taEkT+LFU82GRfM0/+nBCI+9mOSNWhGbe/Qen1fPGApzFGvKNH+2I0lzt+WFEyEP3xZhdXlIdkyxboHmBy8nx+R0psr5TvycdrAuzHJcKd6RVcLQQGsfnO+wXOixnGg25GYoMqPw8mnD04flbTAXei117ZJUz4rBS6dCnj8W0tkPpy+IAJmn4LljhtMtsmrma1GG/P7LATFfkRlT/OJAwK7T4uTWVWgSBn5xMKS8QNHaK4Jo9Z3jU6qmbkssomjoEpG1E82GOZmKnAx4vdbw1CG5viCE5l5LY6dEIqERobS6DjumL94xAHXthg0LNe0D8NzRkMpCieh+sjugrVe+K5ra0h4nm628CxF47ljIqWbL2XZL/wg0dEqOz9eyXaM6lY8rzpOI8ZmjIa+clm0XJ5stiUDe2dczJCqrZ9vlnXaDCcuxBkvfsOSoOgdka0LPkOXxPQFnLkge7mSLbKkoyZN3HD6xT8QS07pY9R3j4otpwcKWnnR7yP00dlmc4IDjcnnXCvhdDSoLFf/1o1H+y/9LzKiq+Tu3+FQUKr7xZPKSr4S/YvNuBY/c5RONKP7iGafd4nBcjHetgN/VYDgBh86bWZUhG7ssoyHX/Ilf12HxfRdmOBzvqhzWxUpErgVtfZZvPzt7FPPCyfCaX5Ox8NTh0Fmbw/Hrzlau9AnTGs8Oh8PxdsiKq1n37l1xh5WXoSjPdw7L4XC8PZYWa2K+ujYOy9Nw5yrvLb+C3OFwODJjsn1ppsqOq+KwAG5brtlQqXFxlsPhuFyUghuXemxeNLvvuCoOKy9D8aV7Iiwudk7L4XBcHteVaj53h09e5uxe44rvw0pjLRxtMvyv55McqjeT3rnncDgcaSI+bFmsefTuCCtK9EXVfq+awwKpyOgcsLx0KuTFkyGNXam367rtSA7H+3z+JzWxlYWKras8PrDcIz9LXXJGdlUdVpq0NEnXoBQNW+ewHI73t79SIt+Un6mI+W9BxvtaOCyHw+G4EjhpNYfD4RyWw+FwOIflcDicw3I4HA7nsBwOh8M5LIfD4RyWw+FwOIflcDgczmE5HA7nsBwOh8M5LIfD4XAOy+Fw/Ovm/wNgu7Cb4lykVAAAAABJRU5ErkJggg==" width="300" height="76" class="img_Denh"></p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-chat-view">3. Chat View<a href="https://iosapptemplates.com/blog/swiftui-chat/#3-chat-view" class="hash-link" aria-label="Direct link to 3. Chat View" title="Direct link to 3. Chat View" translate="no">​</a></h3>
<p>In an actual real Xcode project, the messages will be stored on the server for synchronization between all users. In this tutorial, we are going to simulate the server by using an array function containing messages named <strong>DataSource</strong>. Each generated message will be appended to this array (this action is like sending a message to the server). And to do that, we'll create a helper class – and name it ChatHelper, to separate concerns appropriately. The didChange variable is used to fire a signal whenever a new message is created. Welcome to the world of reactive programming, now natively built into Swift.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ChatHelper</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">ObservableObject</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> didChange </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">PassthroughSubject</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Void</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Never</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute atrule" style="color:#00a4db">@Published</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> realTimeMessages </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">DataSource</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">messages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">sendMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> chatMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        realTimeMessages</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">chatMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        didChange</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">send</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Now, we will go to the main content of this section – <strong>Chat View</strong>. Let's create a file named <strong>ChatView</strong> and declare the following properties:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> typingMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@EnvironmentObject</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> chatHelper</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">ChatHelper</span><br></span></code></pre></div></div>
<p>typingMessage is the latest message that was lastly typed in by the user, and chatHelper is an object that manages and retrieves the data (our mock API object introduced above). Next, move to the <strong>body</strong> section, add the following lines of SwiftUI code:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">List</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">ForEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">chatHelper</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">realTimeMessages</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> msg </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">MessageView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">checkedMessage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">HStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">TextField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Message..."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $typingMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">textFieldStyle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RoundedBorderTextFieldStyle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">minHeight</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">CGFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sendMessage</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Send"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">minHeight</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">CGFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Well, obviously, SwiftUI makes our code much easier to read and visualize. We will not explain anything in the above code to challenge you. Your challenge is to visualize our screen from that block of code. Not a big deal, right? Important note: Because we use List, Message and User we need to implement the Hashable protocol to uniquely identify each row in the list.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">Message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Hashable</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Hashable</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>To make the UI more eye-catching, perhaps we won't need separator lines, you can do the following</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">UITableView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">appearance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">separatorStyle </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">none</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">UITableView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">appearance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">tableFooterView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>And here is the sendMessage function:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">sendMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    chatHelper</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sendMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Message</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> typingMessage</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">DataSource</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">secondUser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    typingMessage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Next, for someone who has been working with iOS for a long time like you, leaving the navigation blank is very annoying, isn't it? Let us help you.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">NavigationView</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">VStack</span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">navigationBarTitle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">DataSource</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">firstUser</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> displayMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">inline</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Believe it or not, you're going to get to the destination. What we need to do is updating some configuration in the <em>SceneDelegate</em> file. At the first line inside the <em>willConnectTo function, declare an environmentObject</em>:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">scene</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> scene</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIScene</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> willConnectTo session</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UISceneSession</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> options connectionOptions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIScene</span><span class="token punctuation" style="color:#393A34">.</span><span class="token class-name">ConnectionOptions</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> chatHelper </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ChatHelper</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Inside the same function, we are going to tell the compiler our rootViewController is <em>UIHostingController(rootView: chatView.environmentObject(chatHelper))</em></p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> chatView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ChatView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Use a UIHostingController as window root view controller.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> windowScene </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> scene </span><span class="token keyword" style="color:#00009f">as</span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token class-name">UIWindowScene</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> window </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">windowScene</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> windowScene</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rootViewController </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIHostingController</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rootView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> chatView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">environmentObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">chatHelper</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> window</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    window</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">makeKeyAndVisible</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Now, let's compile and run our screen.</p>
<p><img decoding="async" loading="lazy" alt="final chat app result" src="https://iosapptemplates.com/assets/images/final-chat-app-result-7d497d1a8251f1337171a35fe82001cd.png" width="586" height="1024" class="img_Denh"></p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/swiftui-chat/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>That's it. Building a SwiftUI chat app for iOS is not as hard as it looks like. Of course with a real chat application, everything will be a lot more complex for sure. But for the purposes of this tutorial, you and we can feel how much SwiftUI has helped us. Indeed, if done with UIKit, we will certainly take a lot more time and effort for repetitive, not meaningful tasks (especially for experienced people) such as drag and drop, register cell, reusing cells, caching images, etc. Hopefully you have learned something more interesting about SwiftUI from this hands-on experience rather than the sterile academic theory. Here is the <a href="https://github.com/mrcflorian/swiftUI-tutorials/tree/master/Tutorials/ChatViewTutorial" target="_blank" rel="noopener noreferrer" class="">complete source code</a> on Github (Please give us a Star ❤️️ ). And stay tuned! In the next tutorial, we will continue to improve this SwiftUI chat app!</p>]]></content:encoded>
            <category>SwiftUI</category>
            <category>iOS Development</category>
            <category>Chat App</category>
            <category>SwiftUI Tutorial</category>
        </item>
        <item>
            <title><![CDATA[SnapKit Tutorial: Simplifying Auto Layout in iOS App Development]]></title>
            <link>https://iosapptemplates.com/blog/snapkit-tutorial-ios/</link>
            <guid>https://iosapptemplates.com/blog/snapkit-tutorial-ios/</guid>
            <pubDate>Sat, 11 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[In this SnapKit tutorial, we describe our experience with SnapKit in Swift. Learn how to simplify Auto Layout in iOS App Development. SnapKit Code Examples]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">November 20, 2023</span></div></div>
<p>For iOS developers, setting up UI programmatically might feel hard and complicated, especially if you are not very experienced in Swift. But luckily, there are a lot of libraries supporting us with this problem. One of them is <strong>SnapKit</strong>. In our mobile app templates, we use SnapKit to set up UI programmatically, since it’s by far the best Swift UI Layout Library. In this SnapKit tutorial, we are going to give you a brief introduction to the SnapKit world.</p>
<!-- -->
<p>In this <strong>SnapKit tutorial</strong>, we are describing our experience of working with <strong>SnapKit</strong> to help you learn <strong>how to simplify auto layout in iOS App Development</strong>.</p>
<p><img decoding="async" loading="lazy" alt="SnapKit tutorial" src="https://iosapptemplates.com/assets/images/how-to-simplify-auto-layout-in-ios-app-development-19bb03fa9219c2ac5208412d803bcdd8.jpg" width="768" height="512" class="img_Denh"></p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-introduction-to-snapkit">1. Introduction to SnapKit<a href="https://iosapptemplates.com/blog/snapkit-tutorial-ios/#1-introduction-to-snapkit" class="hash-link" aria-label="Direct link to 1. Introduction to SnapKit" title="Direct link to 1. Introduction to SnapKit" translate="no">​</a></h3>
<p>For iOS programmers, the “Auto-layout” term is extremely familiar. It almost becomes a required part when implementing layout for mobile applications. Currently, there are two streams of ideas at play. One must decide whether to use Interface Builder for implementing layout or do it programmatically. When using <strong>Interface Builder</strong>, we can add all constraints by using <strong>storyboards</strong> or <strong>xib files</strong>, and in that case, our code will be less complicated, since fewer lines of code would be used and the time to write all this code would be discounted. It would be just “drag-drop” stuff.</p>
<p>However, the bigger and more complex your project gets and the higher the number of interface files you have, the more difficult it is to manage these files. And then, if you need some dynamic layouts, you have to drag many constraints to update the UI correspondingly. It makes your project hard to debug and hard to control. And like this is not enough, imagine now that you have a ton of iOS developers working on the same project, so a lot of other problems arise with that, such as merge conflict on autogenerated files. Ugly, right?</p>
<p>So, either way, you have to know how to do auto layout programmatically, since if your app becomes successful, this will be a requirement down the road.</p>
<p>But the biggest disadvantage of using Auto Layout programmatically is that it takes too long. You’ll have to write a ton of code to set constraints instead of a few mouse clicks. Apple’s Auto Layout is extremely verbose and time-consuming to write. <strong>SnapKit</strong> helps us address this problem, by providing a concise abstraction of Apple’s Auto Layout Constraints system.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-snapkit-and-usage">2. SnapKit and Usage<a href="https://iosapptemplates.com/blog/snapkit-tutorial-ios/#2-snapkit-and-usage" class="hash-link" aria-label="Direct link to 2. SnapKit and Usage" title="Direct link to 2. SnapKit and Usage" translate="no">​</a></h3>
<p>SnapKit is a tool allowing iOS developers to manipulate auto-layout constraints easily. <strong>By using SnapKit, you can create, update, remove and manage layout constraints of the UI views</strong>.</p>
<p>Let’s consider some examples, to give you an idea of how concise and clear SnapKit is, as opposed to Apple’s Cocoa Auto-Layout library. First of all, you need to install SnapKit via CocoaPods (a dependency manager). Add this to your Podfile:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token plain">pod '</span><span class="token class-name">SnapKit</span><span class="token plain">'</span><br></span></code></pre></div></div>
<p>And to save time and ink (lol), we won’t talk CocoaPods and the Podfile. They belong to another article, so feel free to Google it.</p>
<p>Do you remember how to add constraints programmatically? For example, if we want to vertically center a view, the code will be something like this:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> horizontalConstraint </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">NSLayoutConstraint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    item</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> view</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    attribute</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">NSLayoutConstraint</span><span class="token punctuation" style="color:#393A34">.</span><span class="token class-name">Attribute</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">centerX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    relatedBy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">NSLayoutConstraint</span><span class="token punctuation" style="color:#393A34">.</span><span class="token class-name">Relation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">equal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    toItem</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> view</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    attribute</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">NSLayoutConstraint</span><span class="token punctuation" style="color:#393A34">.</span><span class="token class-name">Attribute</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">centerX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    multiplier</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    constant</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Oops, that looks ugly. We don’t even want to think about it, let alone write them down. Let’s see how SnapKit solves this huge pain point for Swift developers.</p>
<p>Let’s display a UIView pinned to the four edges of its superview. So, just imagine we have four constraints such as the one above, with a lot of messy code. Let’s see how SnapKit handles this scenario.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="step-1-create-a-uiview-programmatically">Step 1: Create a UIView programmatically<a href="https://iosapptemplates.com/blog/snapkit-tutorial-ios/#step-1-create-a-uiview-programmatically" class="hash-link" aria-label="Direct link to Step 1: Create a UIView programmatically" title="Direct link to Step 1: Create a UIView programmatically" translate="no">​</a></h4>
<p>Imagine we have a blank view controller in a new Xcode project. In viewDidLoad(), we have some of the following lines of code:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> childView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">childView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">backgroundColor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSubview</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">childView</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>It is basically creating a new view, setting the background color for it and adding it into the view. That’s all there is to it.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="step-2-use-snapkit">Step 2: Use SnapKit<a href="https://iosapptemplates.com/blog/snapkit-tutorial-ios/#step-2-use-snapkit" class="hash-link" aria-label="Direct link to Step 2: Use SnapKit" title="Direct link to Step 2: Use SnapKit" translate="no">​</a></h4>
<p>First of all, we need to import this library.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SnapKit</span><br></span></code></pre></div></div>
<p>And let’s continue to write codes inside viewDidLoad()</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token plain">childView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">snp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">makeConstraints </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">make</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">top</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">left</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">right</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Now, let’s build and run the Xcode sample project:</p>
<p><img decoding="async" loading="lazy" alt="SnapKit tutorial" src="https://iosapptemplates.com/assets/images/xcode-sample-project-e6bff6c5ebbcc0fce4c58935da848bc2.png" width="328" height="758" class="img_Denh"></p>
<p>It’s really simple, right?! Literally, with one line, we have made all four edges of the childView equal to the edges of the super.view. If you compare this with the code we showed in the previous section, this is a much more concise approach. So you are already saving a ton of time while coding UI. But that’s not all. We can even refactor this code on step further:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token plain">childView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">snp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">makeConstraints </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">make</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">edges</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Now re-run and you can see we pinned four edges using just one single line of code, instead of twenty or thirty lines like we showed before.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-more-snapkit-examples">3. More SnapKit Examples<a href="https://iosapptemplates.com/blog/snapkit-tutorial-ios/#3-more-snapkit-examples" class="hash-link" aria-label="Direct link to 3. More SnapKit Examples" title="Direct link to 3. More SnapKit Examples" translate="no">​</a></h3>
<p>Let’s continue with another SnapKit example. We will create another view, called anotherChildView:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> anotherChildView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">anotherChildView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">backgroundColor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">yellow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSubview</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">anotherChildView</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Let’s try new things in SnapKit:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token plain">childView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">snp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">makeConstraints </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">make</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">size</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CGSize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">top</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">snp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">top</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">centerX</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">anotherChildView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">snp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">makeConstraints </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">make</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">size</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">childView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">top</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">childView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">snp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">centerX</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equalTo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>As you can see, we have a lot of functions</p>
<ul>
<li class=""><strong>size</strong>.equalTo</li>
<li class=""><strong>top</strong>.equalTo (Likewise, we have <strong>bottom</strong>.equalTo, <strong>left</strong>.equalTo and <strong>right</strong>.equalTo) with the offset.</li>
<li class="">**centerX.**equalTo and <strong>centerY</strong>.equalTo with the offset.</li>
</ul>
<p>Besides these, SnapKit also has .<strong>multipliedBy</strong>. You can use this function to create the <strong>aspect ratio</strong> for the views. Because these lines of code are quite easy and straightforward, we will not dig into the implementation details. You could refer to SnapKit.io website as its documentation is really detailed and easy to follow.</p>
<p>Now let’s run this once more.</p>
<p><img decoding="async" loading="lazy" alt="SnapKit tutorial" src="https://iosapptemplates.com/assets/images/xcode-sample-project-2-6c69ef277d54d3f566ed174f2b3bb5d5.png" width="442" height="1014" class="img_Denh"></p>
<p>It worked as expected. In addition, SnapKit also supports us with debugging. It will show us exactly the views for which the constraints are broken. We can then easily check and update those constraints correspondingly.</p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion-on-snapkit">Conclusion on SnapKit<a href="https://iosapptemplates.com/blog/snapkit-tutorial-ios/#conclusion-on-snapkit" class="hash-link" aria-label="Direct link to Conclusion on SnapKit" title="Direct link to Conclusion on SnapKit" translate="no">​</a></h2>
<p>After reading this SnapKit Tutorial, we hope you can see the benefits of SnapKit for setting up UI programmatically. It allows you to write less code, which in turn makes the whole process much simpler. As a small downside, however, we still need to continue to learn how to use Auto-layout programmatically with the available iOS APIs (because SnapKit is just a third-party library, which someday may not be supported anymore – this is highly unlikely since there’s a huge iOS Community around the SnapKit open-source project).</p>
<p>Overall, SnapKit is a useful library if you want to improve your code when making constraints programmatically. Your Xcode project will get more concise and more modularized, which is exactly the reason why we are heavily using SnapKit in our iOS Starter Kits. Here is the source code for this SnapKit Tutorial. Happy Coding!</p>]]></content:encoded>
            <category>iOS Development</category>
            <category>iOS App Templates</category>
            <category>Development Tips</category>
        </item>
        <item>
            <title><![CDATA[Build a Tinder-like Card Swipe in Swift with Koloda View | iOS Tutorial]]></title>
            <link>https://iosapptemplates.com/blog/tinder-card-swipe-swift-koloda/</link>
            <guid>https://iosapptemplates.com/blog/tinder-card-swipe-swift-koloda/</guid>
            <pubDate>Wed, 25 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to build Tinder Cards Swipe feature in Swift with Koloda View to make your own iOS dating app. Make a Tinder clone with card swipe Swift tutorial]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">November 20, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="Build a Tinder Card Swipes in Swifit with Koloda View" src="https://iosapptemplates.com/assets/images/tinder-cards-swift-49726b05cac4e532eafb028cd511553c.jpg" width="800" height="600" class="img_Denh"></p>
<p>Over the past few years, along with the popularity of social networking applications, dating apps have also rapidly emerged. One of these most prominent applications is Tinder. It’s not only an awesome dating app, but it also created new iOS trends on view animations or transitions, such as the Tinder Card Swipe or Tinder UI (our Swift Dating App was inspired by Tinder).</p>
<!-- -->
<p>In this iOS tutorial, we are going to learn how to build the Tinder Swipe Cards in Swift, so that you can include this feature into your iOS apps. There are currently a few libraries supporting this type of swipeable cards and one of them is KolodaView. In this tutorial, we’ll show you how to implement this animation in Swift, with code examples.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-introduction">1. Introduction<a href="https://iosapptemplates.com/blog/tinder-card-swipe-swift-koloda/#1-introduction" class="hash-link" aria-label="Direct link to 1. Introduction" title="Direct link to 1. Introduction" translate="no">​</a></h3>
<p>To learn general details about the Koloda View library, you can refer to its official documentation here. In this part, we’ll just give you a high-level overview of it. The highlight of this library is the swipe-to-like interface inspired by Tinder. The team did a great job of explaining how to design the UI and how it works. You can read their tutorials to understand more about their mechanism of action. Koloda View library uses the same the <strong>dataSource</strong> and <strong>delegate</strong> design patterns, by leveraging protocols. These patterns were inspired from the UITableView and UICollectionView design. It’s really convenient for iOS engineers to use this library, given they are already familiar with the overall architectural patterns. All we need to do is to conform our view controller to two protocols, and handle the necessary functions. Now let’s get started to learn concretely how to build an app like Tinder, by leveraging Koloda View for the Tinder-esque card interface.</p>
<p><img decoding="async" loading="lazy" alt="Build a Tinder Card Swipes in Swifit with Koloda View" src="https://iosapptemplates.com/assets/images/tinder-cards-swift-01ba9947e353ac4694d02557944c66f3.gif" width="210" height="480" class="img_Denh"></p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-building-the-ios-tinder-cards-in-swift">2. Building the iOS Tinder Cards in Swift<a href="https://iosapptemplates.com/blog/tinder-card-swipe-swift-koloda/#2-building-the-ios-tinder-cards-in-swift" class="hash-link" aria-label="Direct link to 2. Building the iOS Tinder Cards in Swift" title="Direct link to 2. Building the iOS Tinder Cards in Swift" translate="no">​</a></h3>
<p>First of all, since this is a third-party library, you need to install it from Carthage, CocoaPod or manually (“drag-drop” stuff), in order to include it as a dependency to your Xcode project. We’ll install KolodaView via CocoaPods, as usual. So add to your Podfile the following pod dependency:</p>
<div class="language-ruby codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-ruby codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token plain">pod "Koloda"</span><br></span></code></pre></div></div>
<p>Let’s run the newly created Xcode project and then write the code on the workspace with the same name. Our theme for this Swift tutorial will be about Marvel’s heroes. When we are writing this article, the whole world is going crazy over Endgame – the movie of the decade so we want to make this as a tribute about a long journey as well as our Iron Man. If you’re not familiar with the movie, no worries, you’ll understand the tutorial entirely anyway. Now, let’s write some code.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="step-1-setting-up-tinder-ui">Step 1: Setting up Tinder UI<a href="https://iosapptemplates.com/blog/tinder-card-swipe-swift-koloda/#step-1-setting-up-tinder-ui" class="hash-link" aria-label="Direct link to Step 1: Setting up Tinder UI" title="Direct link to Step 1: Setting up Tinder UI" translate="no">​</a></h4>
<p>By using the Interface Builder, drag a UIView object to your storyboard. Add constraints for it (you can refer to our way or add your own constraints). In the Identity Inspector, we set a custom class (KolodaView) for our UIView object as follows:</p>
<p><img decoding="async" loading="lazy" alt="Build a Tinder Card Swipes in Swifit with Koloda View" src="https://iosapptemplates.com/assets/images/setting-up-tinder-ui-aa075e13fccda094058bd0753948773c.png" width="496" height="198" class="img_Denh"></p>
<p>Pay attention to set the <strong>Module</strong> as Koloda, otherwise, your app will instacrash. After that, drag an IBOutlet connection from the UIView on the screen to the UIViewController. Do not forget to import the <strong>Koloda</strong> library, so that the code compiles successfully.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="step-2-conform-to-datasource-and-delegate-protocols">Step 2: Conform to DataSource and Delegate Protocols<a href="https://iosapptemplates.com/blog/tinder-card-swipe-swift-koloda/#step-2-conform-to-datasource-and-delegate-protocols" class="hash-link" aria-label="Direct link to Step 2: Conform to DataSource and Delegate Protocols" title="Direct link to Step 2: Conform to DataSource and Delegate Protocols" translate="no">​</a></h4>
<p>In the viewDidLoad of your view controller, let’s add the following code snippet:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">override</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">viewDidLoad</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">super</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">viewDidLoad</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    kolodaView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dataSource </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    kolodaView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">delegate </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>As we said, the way we conform to these protocols is the same way we’ve always done with UITableView or UICollectionView. We’ve separated the KolodaView <strong>delegate/dataSource</strong> into their own extensions to make it easier to explain:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">extension</span><span class="token plain"> </span><span class="token class-name">ViewController</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaViewDelegate</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">kolodaDidRunOutOfCards</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    koloda</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">reloadData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">koloda</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> didSelectCardAt index</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> alert </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIAlertController</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"Congratulation!"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"Now you're </span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">\(</span><span class="token string-literal interpolation">images</span><span class="token string-literal interpolation punctuation" style="color:#393A34">[</span><span class="token string-literal interpolation">index</span><span class="token string-literal interpolation punctuation" style="color:#393A34">]</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">)</span><span class="token string-literal string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> preferredStyle</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">alert</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    alert</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addAction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">UIAlertAction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> style</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">present</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">alert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> animated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">extension</span><span class="token plain"> </span><span class="token class-name">ViewController</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaViewDataSource</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">kolodaNumberOfCards</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Int</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> images</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">count</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">koloda</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> viewForCardAt index</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">UIView</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> view </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIImageView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIImage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">named</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> images</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">layer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cornerRadius </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clipsToBounds </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> view</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<p>As you can see, the two delegate methods inside <strong>KolodaViewDataSource</strong> look the same as UITableViewDataSource’s functions. In there, we declare the numbers of items (Tinder Cards) and how they will be displayed. For <strong>KolodaViewDelegate</strong>, you’ll handle performing actions on each item (on each swipeable card). These are just a few basic examples. In fact, you can use a lot of protocol methods supported by this library as follows: For <strong>KolodaViewDataSource</strong>:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">kolodaSpeedThatCardShouldDrag</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">DragSpeed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">koloda</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> viewForCardOverlayAt index</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">OverlayView</span><span class="token operator" style="color:#393A34">?</span><br></span></code></pre></div></div>
<p>There is a side note here, to set the custom overlay action on swiping (left/right), you should override didSet of overlayState property in OverlayView. For KolodaViewDelegate, you can find out in its documentation all the protocols supported by this library. In this iOS tutorial, we would like to mention some of the protocols that we feel are the most important.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">kolodaDidRunOutOfCards</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>This function is so noteworthy because you can not leave your UI empty after the view runs out of cards. You have to handle this scenario such as hiding the Koloda or showing a view that’s telling users that there are no more cards. Remember, treating your empty states graciously is a sign of awesome design skills, and makes your mobile app stand out from the crowd.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">koloda</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> koloda</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">KolodaView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> didSelectCardAt index</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Int</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>This function is called when users tap on a Tinder card (similar to didSelectRowAt of UITableViewDelegate). In our iOS app example, we showed an alert, for example. The rest of the delegate methods refer mostly to animations, so you should carefully research them, to make your dating app richer in visual features. Now, let’s run the app to see our heroes.</p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/tinder-card-swipe-swift-koloda/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Alright! We built a simple Tinder UI Card Swipe Swift with KolodaView successfully. In the near future, this behavior will become increasingly common, so we hope you’ll like this article. Download the complete source code here (since we update some UIs to make the UI better and don’t forget to run pod install before opening it up). Don’t forget to share this article if you’ve enjoyed it. Also, if you’re looking to build your own dating app, you can skip a few weeks of design &amp; development, by buying our dating app template. Happy Coding! PS: All images used in this project is downloaded here: <a href="https://www.pixelstalk.net/thor-backgrounds-free" target="_blank" rel="noopener noreferrer" class="">https://www.pixelstalk.net/thor-backgrounds-free</a>.</p>]]></content:encoded>
            <category>iOS</category>
            <category>Swift</category>
            <category>Koloda</category>
            <category>Tinder</category>
            <category>Dating App</category>
            <category>Card Swipe</category>
        </item>
        <item>
            <title><![CDATA[How to Integrate WebRTC in Swift for Video & Audio Chat]]></title>
            <link>https://iosapptemplates.com/blog/webrtc-swift/</link>
            <guid>https://iosapptemplates.com/blog/webrtc-swift/</guid>
            <pubDate>Tue, 05 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[WebRTC (Web Real-Time Communication) is a powerful technology that enables real-time communication (like video and voice chats) in web and mobile applications. Integrating WebRTC into iOS applications often involves a combination of the native WebRTC SDK and bridging techniques to adapt it for specific platforms like SwiftUI or UIKit.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">September 5, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="swift webrtc" src="https://iosapptemplates.com/assets/images/swift-webrtc-a5acd4a02ff6bd5c978b4b8ea7853aab.jpg" width="1024" height="576" class="img_Denh"></p>
<p>WebRTC (Web Real-Time Communication) is a powerful technology that enables real-time communication (like video and voice chats) in web and mobile applications. Integrating WebRTC into iOS applications often involves a combination of the native WebRTC SDK and bridging techniques to adapt it for specific platforms like SwiftUI or UIKit.</p>
<!-- -->
<p>In this brief guide, I'll walk you through the process of setting up WebRTC for an iOS application using Swift:</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-setting-up-the-webrtc-sdk">1. Setting Up the WebRTC SDK<a href="https://iosapptemplates.com/blog/webrtc-swift/#1-setting-up-the-webrtc-sdk" class="hash-link" aria-label="Direct link to 1. Setting Up the WebRTC SDK" title="Direct link to 1. Setting Up the WebRTC SDK" translate="no">​</a></h2>
<p>To start, you need the WebRTC framework for iOS:</p>
<ul>
<li class="">You can either compile it from source (which can be time-consuming) or fetch precompiled binaries.</li>
<li class="">Check out popular GitHub repositories that offer these precompiled frameworks for easier integration.</li>
</ul>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-initialize-webrtc">2. Initialize WebRTC<a href="https://iosapptemplates.com/blog/webrtc-swift/#2-initialize-webrtc" class="hash-link" aria-label="Direct link to 2. Initialize WebRTC" title="Direct link to 2. Initialize WebRTC" translate="no">​</a></h2>
<p>First, set up your view controller or SwiftUI view for video display:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">UIKit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">WebRTC</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">VideoViewController</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIViewController</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> remoteVideoTrack</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCVideoTrack</span><span class="token operator" style="color:#393A34">?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> remoteVideoView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCEAGLVideoView</span><span class="token operator" style="color:#393A34">?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">override</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">viewDidLoad</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">super</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">viewDidLoad</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">remoteVideoView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">RTCEAGLVideoView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">frame</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">frame</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> remoteVideoView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">remoteVideoView </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSubview</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">remoteVideoView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-set-up-rtcpeerconnection">3. Set Up RTCPeerConnection<a href="https://iosapptemplates.com/blog/webrtc-swift/#3-set-up-rtcpeerconnection" class="hash-link" aria-label="Direct link to 3. Set Up RTCPeerConnection" title="Direct link to 3. Set Up RTCPeerConnection" translate="no">​</a></h2>
<p>RTCPeerConnection is a key component in WebRTC. It represents the connection between peers.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> configuration </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">RTCConfiguration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> peerConnection </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> peerConnectionFactory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">peerConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> configuration</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> constraints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> delegate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-handle-offer-and-answer">4. Handle Offer and Answer<a href="https://iosapptemplates.com/blog/webrtc-swift/#4-handle-offer-and-answer" class="hash-link" aria-label="Direct link to 4. Handle Offer and Answer" title="Direct link to 4. Handle Offer and Answer" translate="no">​</a></h2>
<p>For peers to connect, one needs to create an offer, and the other should answer:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Creating an offer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">peerConnection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCMediaConstraints</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">mandatoryConstraints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> optionalConstraints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sdp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">guard</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> sdp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdp </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Send this sdp to the other peer using your signaling server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Setting remote description and creating an answer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">receivedOfferFromPeer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">offerSDP</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> remoteSDP </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">RTCSessionDescription</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">offer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sdp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> offerSDP</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    peerConnection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setRemoteDescription</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">remoteSDP</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">guard</span><span class="token plain"> error </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        peerConnection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">answer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">for</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCMediaConstraints</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">mandatoryConstraints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> optionalConstraints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token nil constant" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sdp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">guard</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> sdp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdp </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// Send this sdp back to the offerer using your signaling server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-signal-handling">5. Signal Handling<a href="https://iosapptemplates.com/blog/webrtc-swift/#5-signal-handling" class="hash-link" aria-label="Direct link to 5. Signal Handling" title="Direct link to 5. Signal Handling" translate="no">​</a></h2>
<p>WebRTC does not define how signaling should be done, but it's an essential component. You might want to use WebSockets, Firebase, or any other communication mechanism to exchange offers, answers, and ICE candidates between peers.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="6-handle-ice-candidates">6. Handle ICE Candidates<a href="https://iosapptemplates.com/blog/webrtc-swift/#6-handle-ice-candidates" class="hash-link" aria-label="Direct link to 6. Handle ICE Candidates" title="Direct link to 6. Handle ICE Candidates" translate="no">​</a></h2>
<p>For NAT traversal, you need to handle ICE candidates:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">peerConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> peerConnection</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCPeerConnection</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> didGenerate candidate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCIceCandidate</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Send this candidate to the other peer using your signaling server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">receivedICECandidateFromPeer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">candidate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCIceCandidate</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    peerConnection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">candidate</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="7-displaying-video">7. Displaying Video<a href="https://iosapptemplates.com/blog/webrtc-swift/#7-displaying-video" class="hash-link" aria-label="Direct link to 7. Displaying Video" title="Direct link to 7. Displaying Video" translate="no">​</a></h2>
<p>When receiving a video track:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">peerConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> peerConnection</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCPeerConnection</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> didAdd stream</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RTCMediaStream</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> videoTrack </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> stream</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">videoTracks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">first </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        videoTrack</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">remoteVideoView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/webrtc-swift/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Setting up WebRTC on iOS requires careful coordination between signaling, session establishment, and media handling. Once set up, WebRTC provides a robust solution for real-time communication in your app. Remember that you also need a STUN/TURN server for NAT traversal, especially for production applications. There are various platforms and services (like Twilio, Agora.io, etc.) that offer easy integration for WebRTC on iOS if you'd like to avoid setting up everything from scratch.</p>]]></content:encoded>
            <category>Swift Programming</category>
            <category>WebRTC</category>
            <category>Video Chat</category>
            <category>Audio Chat</category>
            <category>iOS Development</category>
            <category>Real-Time Communication</category>
        </item>
        <item>
            <title><![CDATA[Top 10 SwiftUI Libraries to Speed Up iOS App Development]]></title>
            <link>https://iosapptemplates.com/blog/swiftui-libraries/</link>
            <guid>https://iosapptemplates.com/blog/swiftui-libraries/</guid>
            <pubDate>Sat, 19 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[SwiftUI has revolutionized iOS app development by offering a declarative and intuitive way to build user interfaces. To further enhance your SwiftUI development experience and make your apps stand out, various third-party libraries have emerged. In this blog post, we'll dive into 10 SwiftUI libraries that can supercharge your iOS app development journey.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">August 19, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="swftui libraries" src="https://iosapptemplates.com/assets/images/swftui-libraries-a1c89ff50eb59314c10061e52d3f9211.png" width="1024" height="1024" class="img_Denh"></p>
<p>SwiftUI has revolutionized iOS app development by offering a declarative and intuitive way to build user interfaces. To further enhance your SwiftUI development experience and make your apps stand out, various third-party libraries have emerged. In this blog post, we'll dive into 10 SwiftUI libraries that can supercharge your iOS app development journey. Each library comes with a code example explained line by line to help you understand its implementation.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-alamofireimage">1. AlamofireImage<a href="https://iosapptemplates.com/blog/swiftui-libraries/#1-alamofireimage" class="hash-link" aria-label="Direct link to 1. AlamofireImage" title="Direct link to 1. AlamofireImage" translate="no">​</a></h2>
<p>AlamofireImage is an image downloading and caching library built on top of Alamofire, simplifying the process of fetching and caching images. It provides features like automatic caching, image decompression, and prioritized downloading.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">AlamofireImage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ImageView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"AlamofireImage Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uiImage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIImage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">named</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"placeholder"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">resizable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">aspectRatio</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contentMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">fit</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">afImageCache</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-kingfisher">2. Kingfisher<a href="https://iosapptemplates.com/blog/swiftui-libraries/#2-kingfisher" class="hash-link" aria-label="Direct link to 2. Kingfisher" title="Direct link to 2. Kingfisher" translate="no">​</a></h2>
<p>Kingfisher is another powerful image downloading and caching library that is widely used in the iOS community. It supports various image formats, caching strategies, and customizable loading indicators.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-1">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-1" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">Kingfisher</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ImageViewWithKingfisher</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Kingfisher Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">KFImage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">URL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">string</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"https://example.com/image.jpg"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">resizable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">aspectRatio</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contentMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">fit</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-sdwebimageswiftui">3. SDWebImageSwiftUI<a href="https://iosapptemplates.com/blog/swiftui-libraries/#3-sdwebimageswiftui" class="hash-link" aria-label="Direct link to 3. SDWebImageSwiftUI" title="Direct link to 3. SDWebImageSwiftUI" translate="no">​</a></h2>
<p>SDWebImageSwiftUI is an integration of the popular SDWebImage library into SwiftUI. It provides asynchronous image loading, caching, and displaying with support for placeholder images and image transformation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-2">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-2" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SDWebImageSwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">WebImageView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"SDWebImageSwiftUI Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">WebImage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">URL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">string</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"https://example.com/image.jpg"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">resizable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">aspectRatio</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contentMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">fit</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">200</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-viewinspector">4. ViewInspector<a href="https://iosapptemplates.com/blog/swiftui-libraries/#4-viewinspector" class="hash-link" aria-label="Direct link to 4. ViewInspector" title="Direct link to 4. ViewInspector" translate="no">​</a></h2>
<p>ViewInspector is a library that enables SwiftUI view hierarchy introspection, helping developers with debugging and UI testing. It allows you to access and modify the properties of a SwiftUI view.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-3">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-3" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">ViewInspector</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">InspectableView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> count </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"ViewInspector Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Count: </span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">\(</span><span class="token string-literal interpolation">count</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">)</span><span class="token string-literal string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">onTapGesture </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            count </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">inspect </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> view </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> view</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">find</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ViewType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"Count: 0"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-swiftuix">5. SwiftUIX<a href="https://iosapptemplates.com/blog/swiftui-libraries/#5-swiftuix" class="hash-link" aria-label="Direct link to 5. SwiftUIX" title="Direct link to 5. SwiftUIX" translate="no">​</a></h2>
<p>SwiftUIX is a collection of extensions and utilities that expand the capabilities of SwiftUI. It provides additional components, modifiers, and functionality not present in the standard SwiftUI library.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-4">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-4" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUIX</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ExtendedView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"SwiftUIX Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name">Label</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Submit"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> systemImage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"arrow.right.circle.fill"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">buttonStyle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">PlainButtonStyle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="6-pulley">6. Pulley<a href="https://iosapptemplates.com/blog/swiftui-libraries/#6-pulley" class="hash-link" aria-label="Direct link to 6. Pulley" title="Direct link to 6. Pulley" translate="no">​</a></h2>
<p>Pulley is a versatile library that simplifies the creation of custom drawer and bottom sheet interfaces. It provides a smooth and interactive experience for users to reveal additional content.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-5">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-5" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">Pulley</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">PulleyView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">PulleyView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Main Content"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Drawer Content"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">maxWidth</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">infinity</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> maxHeight</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">infinity</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">gray</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="7-alerttoast">7. AlertToast<a href="https://iosapptemplates.com/blog/swiftui-libraries/#7-alerttoast" class="hash-link" aria-label="Direct link to 7. AlertToast" title="Direct link to 7. AlertToast" translate="no">​</a></h2>
<p>AlertToast offers an elegant way to display toast messages and alerts in SwiftUI applications. It supports various customization options and animations for presenting messages to users.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-6">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-6" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">AlertToast</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ToastView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> showToast </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"AlertToast Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Show Toast"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                showToast </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">alertToast</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isPresented</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $showToast</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> alert</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name">AlertToast</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">complete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"Success"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="8-swiftentrykit">8. SwiftEntryKit<a href="https://iosapptemplates.com/blog/swiftui-libraries/#8-swiftentrykit" class="hash-link" aria-label="Direct link to 8. SwiftEntryKit" title="Direct link to 8. SwiftEntryKit" translate="no">​</a></h2>
<p>SwiftEntryKit is a flexible library for displaying custom popup alerts, banners, and notifications in your SwiftUI app. It supports various presentation styles and animations.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-7">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-7" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftEntryKit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">CustomPopupView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"SwiftEntryKit Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Show Popup"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">showCustomPopup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">showCustomPopup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> attributes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">EKAttributes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">centerFloat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        attributes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">entryBackground </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">color</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">color</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> customView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">YourCustomPopupView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">SwiftEntryKit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">display</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">entry</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> customView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> using</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> attributes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="9-motion">9. Motion<a href="https://iosapptemplates.com/blog/swiftui-libraries/#9-motion" class="hash-link" aria-label="Direct link to 9. Motion" title="Direct link to 9. Motion" translate="no">​</a></h2>
<p>Motion is a library that adds smooth animations and transitions to your SwiftUI views. It simplifies the process of creating complex animations and adds delightful user interactions.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-8">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-8" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">Motion</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">AnimatedView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> scale</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">CGFloat</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Motion Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Circle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">scaleEffect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scale</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">onTapGesture </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token function" style="color:#d73a49">withAnimation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">spring</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        scale </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> scale </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.5</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="10-colorpicker">10. ColorPicker<a href="https://iosapptemplates.com/blog/swiftui-libraries/#10-colorpicker" class="hash-link" aria-label="Direct link to 10. ColorPicker" title="Direct link to 10. ColorPicker" translate="no">​</a></h2>
<p>The ColorPicker library provides a SwiftUI color picker view, allowing users to select colors easily. It supports a wide range of customization options and integrations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="example-9">Example<a href="https://iosapptemplates.com/blog/swiftui-libraries/#example-9" class="hash-link" aria-label="Direct link to Example" title="Direct link to Example" translate="no">​</a></h3>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">ColorPicker</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ColorPickerView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> selectedColor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Color</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">red</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"ColorPicker Example"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">ColorPicker</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> selection</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $selectedColor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/swiftui-libraries/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>These 10 SwiftUI libraries offer a wide range of functionalities to enhance your iOS app development journey. Whether you're looking to improve image handling, add animations, or customize UI components, these libraries have got you covered. By integrating these libraries into your projects, you can significantly speed up your development process and create more polished, feature-rich applications.</p>]]></content:encoded>
            <category>SwiftUI</category>
            <category>Libraries</category>
            <category>iOS Development</category>
            <category>Swift</category>
            <category>UI Components</category>
            <category>Productivity</category>
        </item>
        <item>
            <title><![CDATA[Top Xcode Shortcuts Any iOS Developer Should Know]]></title>
            <link>https://iosapptemplates.com/blog/xcode-shortcuts/</link>
            <guid>https://iosapptemplates.com/blog/xcode-shortcuts/</guid>
            <pubDate>Wed, 09 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Xcode, Apple's primary development environment, offers a multitude of shortcuts to boost your productivity. Familiarizing yourself with these shortcuts can significantly speed up your development process. In this tutorial, we'll delve into the top Xcode shortcuts every iOS developer should have in their arsenal.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">August 9, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="xcode-shortcuts" src="https://iosapptemplates.com/assets/images/xcode-shortcuts-2cf0dc2bccf623fc1e013a8ae133737b.jpg" width="1024" height="683" class="img_Denh"></p>
<p>Xcode, Apple's primary development environment, offers a multitude of shortcuts to boost your productivity. Familiarizing yourself with these shortcuts can significantly speed up your development process. In this tutorial, we'll delve into the top Xcode shortcuts every iOS developer should have in their arsenal.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="navigating-files-and-code">Navigating Files and Code<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#navigating-files-and-code" class="hash-link" aria-label="Direct link to Navigating Files and Code" title="Direct link to Navigating Files and Code" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-jump-to-definition">1. Jump to Definition<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#1-jump-to-definition" class="hash-link" aria-label="Direct link to 1. Jump to Definition" title="Direct link to 1. Jump to Definition" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + Click</code> on a method/variable</p>
</li>
<li class="">
<p>This shortcut enables you to quickly navigate to the definition of a method, class, or variable.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">exampleFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Hello, World!"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<blockquote>
<p>Just <code>Cmd + Click</code> on <code>exampleFunction</code> anywhere it's used to jump to its definition.</p>
</blockquote>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-open-quickly">2. Open Quickly<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#2-open-quickly" class="hash-link" aria-label="Direct link to 2. Open Quickly" title="Direct link to 2. Open Quickly" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + Shift + O</code></p>
</li>
<li class="">
<p>This opens a dialog where you can quickly find and open any file or symbol.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Type the name of the file or symbol in the dialog</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// E.g., "ViewController.swift"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-switch-between-header-and-implementation">3. Switch Between Header and Implementation<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#3-switch-between-header-and-implementation" class="hash-link" aria-label="Direct link to 3. Switch Between Header and Implementation" title="Direct link to 3. Switch Between Header and Implementation" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut:   Cmd + Ctrl + Up/Down Arrow</p>
</li>
<li class="">
<p>Toggle between the header  <code>.h</code> file and its corresponding implementation <code>.m</code> or <code>.swift</code> file.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// ViewController.h</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@interface</span><span class="token plain"> </span><span class="token class-name">ViewController</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIViewController</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@end</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ViewController.m</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@implementation</span><span class="token plain"> </span><span class="token class-name">ViewController</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@end</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="editing-code">Editing Code<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#editing-code" class="hash-link" aria-label="Direct link to Editing Code" title="Direct link to Editing Code" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-comment--uncomment-code">1. Comment / Uncomment Code<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#1-comment--uncomment-code" class="hash-link" aria-label="Direct link to 1. Comment / Uncomment Code" title="Direct link to 1. Comment / Uncomment Code" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + /</code></p>
</li>
<li class="">
<p>Quickly comment out a line or a selected block of code.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Cmd + / will toggle commenting for the selected lines</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"This line is commented"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// print("This line is uncommented")</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-duplicate-lines">2. Duplicate Lines<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#2-duplicate-lines" class="hash-link" aria-label="Direct link to 2. Duplicate Lines" title="Direct link to 2. Duplicate Lines" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + D</code></p>
</li>
<li class="">
<p>Duplicate the current line or selected block.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Original line"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Original line"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Duplicate using Cmd + D</span><br></span></code></pre></div></div>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-delete-line">3. Delete Line<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#3-delete-line" class="hash-link" aria-label="Direct link to 3. Delete Line" title="Direct link to 3. Delete Line" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + Delete</code></p>
</li>
<li class="">
<p>Removes the current line or selected block.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"This line will be deleted"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Use Cmd + Delete</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="debugging">Debugging<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#debugging" class="hash-link" aria-label="Direct link to Debugging" title="Direct link to Debugging" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-toggle-breakpoint">1. Toggle Breakpoint<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#1-toggle-breakpoint" class="hash-link" aria-label="Direct link to 1. Toggle Breakpoint" title="Direct link to 1. Toggle Breakpoint" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + \</code></p>
</li>
<li class="">
<p>Set or remove a breakpoint on the current line.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">debugFunction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Breakpoint here"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Cmd + \ to toggle breakpoint</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-activatedeactivate-all-breakpoints">2. Activate/Deactivate All Breakpoints<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#2-activatedeactivate-all-breakpoints" class="hash-link" aria-label="Direct link to 2. Activate/Deactivate All Breakpoints" title="Direct link to 2. Activate/Deactivate All Breakpoints" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + Y</code></p>
</li>
<li class="">
<p>Control all the breakpoints in your project with a single command.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="interface-builder">Interface Builder<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#interface-builder" class="hash-link" aria-label="Direct link to Interface Builder" title="Direct link to Interface Builder" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-zoom-inout-on-interface-builder-canvas">1. Zoom In/Out on Interface Builder Canvas<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#1-zoom-inout-on-interface-builder-canvas" class="hash-link" aria-label="Direct link to 1. Zoom In/Out on Interface Builder Canvas" title="Direct link to 1. Zoom In/Out on Interface Builder Canvas" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + =</code> or <code>Cmd + -</code></p>
</li>
<li class="">
<p>Adjust your view of the Interface Builder canvas to see more or less detail.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// No code snippet needed. Use this directly in the Interface Builder</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-toggle-sidebar-in-interface-builder-shortcut-cmd--0">2. Toggle Sidebar in Interface Builder Shortcut: Cmd + 0<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#2-toggle-sidebar-in-interface-builder-shortcut-cmd--0" class="hash-link" aria-label="Direct link to 2. Toggle Sidebar in Interface Builder Shortcut: Cmd + 0" title="Direct link to 2. Toggle Sidebar in Interface Builder Shortcut: Cmd + 0" translate="no">​</a></h3>
<p>Quickly hide or reveal the sidebar in Interface Builder for a broader view of your canvas.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="simulator-controls">Simulator Controls<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#simulator-controls" class="hash-link" aria-label="Direct link to Simulator Controls" title="Direct link to Simulator Controls" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-rotate-simulator-leftright">1. Rotate Simulator Left/Right<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#1-rotate-simulator-leftright" class="hash-link" aria-label="Direct link to 1. Rotate Simulator Left/Right" title="Direct link to 1. Rotate Simulator Left/Right" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + Left Arrow</code> or <code>Cmd + Right Arrow</code></p>
</li>
<li class="">
<p>Rotate your simulator to landscape or portrait orientations.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// No code snippet needed. Use this directly in the ios Simulator.</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-go-home-in-simulator">2. Go Home in Simulator<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#2-go-home-in-simulator" class="hash-link" aria-label="Direct link to 2. Go Home in Simulator" title="Direct link to 2. Go Home in Simulator" translate="no">​</a></h3>
<ul>
<li class="">
<p>Shortcut: <code>Cmd + Shift + H</code></p>
</li>
<li class="">
<p>Mimic the "Home" button press on devices without a physical button.</p>
</li>
</ul>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// No code snippet needed. Use this directly in the ios Simulator.</span><br></span></code></pre></div></div>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/xcode-shortcuts/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Mastering these shortcuts will streamline your iOS development in Xcode. Practice using them until they become second nature, and you'll find your efficiency significantly improved. Happy coding!</p>]]></content:encoded>
            <category>iOS Programming</category>
            <category>Xcode</category>
            <category>Shortcuts</category>
            <category>Productivity</category>
            <category>iOS Development</category>
        </item>
        <item>
            <title><![CDATA[How to Use WebView in SwiftUI - A Comprehensive Tutorial]]></title>
            <link>https://iosapptemplates.com/blog/webview-swiftui/</link>
            <guid>https://iosapptemplates.com/blog/webview-swiftui/</guid>
            <pubDate>Fri, 14 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[If you're building an application in SwiftUI and looking to incorporate web content directly into your app, a WebView is what you need. In this tutorial, we'll walk through how to create and customize a Read more…]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">July 14, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="How to Use WebView in SwiftUI" src="https://iosapptemplates.com/assets/images/webview-swiftui-f14a1c6e247bcc3ad032b19d481a8327.jpg" width="768" height="513" class="img_Denh"></p>
<p>If you’re building an application in SwiftUI and looking to incorporate web content directly into your app, a WebView is what you need. In this tutorial, we’ll walk through how to create and customize a WebView in SwiftUI.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="introduction">Introduction<a href="https://iosapptemplates.com/blog/webview-swiftui/#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h3>
<p>SwiftUI, Apple’s declarative UI framework, does not have a built-in WebView. However, SwiftUI allows you to integrate UIKit views, meaning we can use the WKWebView from the WebKit framework to create a WebView. Let’s learn how to do this.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="getting-started-integrating-wkwebview-with-swiftui">Getting Started: Integrating WKWebView with SwiftUI<a href="https://iosapptemplates.com/blog/webview-swiftui/#getting-started-integrating-wkwebview-with-swiftui" class="hash-link" aria-label="Direct link to Getting Started: Integrating WKWebView with SwiftUI" title="Direct link to Getting Started: Integrating WKWebView with SwiftUI" translate="no">​</a></h3>
<p>First, we need to create a SwiftUI View that represents a WKWebView. We can do this using the UIViewRepresentable protocol:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">SwiftUI</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token class-name">WebKit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">WebView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIViewRepresentable</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">URL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">makeUIView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> webView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        webView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">load</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">URLRequest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> webView</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">updateUIView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> uiView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// This space can be left blank</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>This WebView struct takes a URL and creates a WKWebView that loads that URL.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="customizing-the-webview">Customizing the WebView<a href="https://iosapptemplates.com/blog/webview-swiftui/#customizing-the-webview" class="hash-link" aria-label="Direct link to Customizing the WebView" title="Direct link to Customizing the WebView" translate="no">​</a></h3>
<p>To customize our WebView, we can make use of the various delegate methods provided by WKWebView.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="webview-navigation-delegate">WebView Navigation Delegate<a href="https://iosapptemplates.com/blog/webview-swiftui/#webview-navigation-delegate" class="hash-link" aria-label="Direct link to WebView Navigation Delegate" title="Direct link to WebView Navigation Delegate" translate="no">​</a></h4>
<p>To track the loading progress of a webpage or handle navigation decisions, we can use the WKNavigationDelegate. Let’s update our WebView struct to include a Coordinator class that acts as the navigation delegate:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">WebView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">UIViewRepresentable</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">URL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">makeCoordinator</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Coordinator</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Coordinator</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">makeUIView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> webView </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        webView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">navigationDelegate </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">coordinator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        webView</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">load</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">URLRequest</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> webView</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">updateUIView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> uiView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// This space can be left blank</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Coordinator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">NSObject</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">WKNavigationDelegate</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> parent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WebView</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> parent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WebView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">parent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> parent</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">webView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> webView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> didStartProvisionalNavigation navigation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKNavigation</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Webview started loading."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">webView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> webView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> didFinish navigation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKNavigation</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Webview finished loading."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">webView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token omit keyword" style="color:#00009f">_</span><span class="token plain"> webView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKWebView</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> didFail navigation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">WKNavigation</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> withError error</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Webview failed with error: </span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">\(</span><span class="token string-literal interpolation">error</span><span class="token string-literal interpolation punctuation" style="color:#393A34">.</span><span class="token string-literal interpolation">localizedDescription</span><span class="token string-literal interpolation-punctuation punctuation" style="color:#393A34">)</span><span class="token string-literal string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="now-whenever-a-webpage-starts-loading-finishes-loading-or-fails-to-load-the-corresponding-message-will-be-printed-to-the-console">Now, whenever a webpage starts loading, finishes loading, or fails to load, the corresponding message will be printed to the console.<a href="https://iosapptemplates.com/blog/webview-swiftui/#now-whenever-a-webpage-starts-loading-finishes-loading-or-fails-to-load-the-corresponding-message-will-be-printed-to-the-console" class="hash-link" aria-label="Direct link to Now, whenever a webpage starts loading, finishes loading, or fails to load, the corresponding message will be printed to the console." title="Direct link to Now, whenever a webpage starts loading, finishes loading, or fails to load, the corresponding message will be printed to the console." translate="no">​</a></h3>
<p>Using the WebView in your SwiftUI App
Using the WebView in your app is as simple as using any other SwiftUI View. Here’s an example:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ContentView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">WebView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">URL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">string</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"https://www.example.com"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">!</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="wrapping-up">Wrapping Up<a href="https://iosapptemplates.com/blog/webview-swiftui/#wrapping-up" class="hash-link" aria-label="Direct link to Wrapping Up" title="Direct link to Wrapping Up" translate="no">​</a></h3>
<p>In this tutorial, we learned how to use a WebView in SwiftUI, and how to customize it to track webpage loading status. By leveraging the power of UIViewRepresentable, we can integrate virtually any UIKit view into our SwiftUI apps.</p>
<p><strong>Please note that the above code has been written with Swift 5.3 and SwiftUI 2.0. If you’re using a different version, the code may need adjustments</strong>.</p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/webview-swiftui/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Now that you’ve mastered the basics of using a WebView in SwiftUI, you’re all set to include web content in your iOS applications more smoothly. This could include anything from loading websites to interacting with HTML interfaces directly within your application. Through the use of SwiftUI and WebKit, Apple has opened up vast possibilities for enhancing your app’s user experience.</p>]]></content:encoded>
            <category>SwiftUI</category>
            <category>WebView</category>
            <category>iOS</category>
            <category>Tutorial</category>
        </item>
        <item>
            <title><![CDATA[How to Build a Login Screen in SwiftUI]]></title>
            <link>https://iosapptemplates.com/blog/login-screen-swiftui/</link>
            <guid>https://iosapptemplates.com/blog/login-screen-swiftui/</guid>
            <pubDate>Thu, 13 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello fellas, welcome back to our SwiftUI series. In the previous few tutorials, you learned a lot about components, operators as well as how to work with UIKit. Now, it's time to put those skills Read more…]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">July 14, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="How to build a login screen in swiftui" src="https://iosapptemplates.com/assets/images/how-to-build-a-login-screen-31c70fed6e53084743067167f06a6396.png" width="768" height="512" class="img_Denh"></p>
<p>Hello fellas, welcome back to our SwiftUI series. In the previous few tutorials, you learned a lot about components, operators as well as how to work with UIKit. Now, it’s time to put those skills to work and get your hands dirty with real practice – design a catchy Login Screen in SwiftUI. After this article, you will find SwiftUI much more convenient and clear.</p>
<!-- -->
<p>Along with that, it’s time to break up with our beloved UIViewController. Goodbye old friend, we had a really good time, right?</p>
<p>With a declarative, data-driven language like SwiftUI, your imagination will almost be “printed” onto the phone screen in a few minutes. Let’s take our Login screen as an example. I’d like you all to close your eyes, please … and imagine: we have a big title, then an image, text fields, and so on. Now open your eyes. BOOM!</p>
<p><img decoding="async" loading="lazy" alt="How to build a login screen in swiftui" src="https://iosapptemplates.com/assets/images/ios-app-templates-a444214f1aacb5c414e81f35d4ca2868.png" width="591" height="1024" class="img_Denh"></p>
<p>Yeah, I know that feeling. Feel like reach for the stars, right? Let’s now look under the hood to see how this magic works.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-build-the-skeleton">1. Build the Skeleton<a href="https://iosapptemplates.com/blog/login-screen-swiftui/#1-build-the-skeleton" class="hash-link" aria-label="Direct link to 1. Build the Skeleton" title="Direct link to 1. Build the Skeleton" translate="no">​</a></h3>
<p>Add this block of code inside <strong>body</strong> property. Also, declare two properties as follows:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// MARK: - Propertiers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> email </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> password </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// MARK: - View</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token class-name">VStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"iOS App Template"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"iosapptemplate"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">TextField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Email"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">TextField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$password</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Sign In"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>The above code is so easy to understand that a person who has never been exposed to SwiftUI (not even to iOS programming) can have a rough idea of what our app is doing. We declare the components that we want and trust SwiftUI that it will help with rendering the UI part.</p>
<p>Believe it or not, we are halfway there already. The next part is just reorganizing the structure and re-styling the components to create an eye-catching screen.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-reorganize-the-structure-and-style-our-components">2. Reorganize the structure and style our components<a href="https://iosapptemplates.com/blog/login-screen-swiftui/#2-reorganize-the-structure-and-style-our-components" class="hash-link" aria-label="Direct link to 2. Reorganize the structure and style our components" title="Direct link to 2. Reorganize the structure and style our components" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="a-textfields">a. Textfields<a href="https://iosapptemplates.com/blog/login-screen-swiftui/#a-textfields" class="hash-link" aria-label="Direct link to a. Textfields" title="Direct link to a. Textfields" translate="no">​</a></h4>
<p>Change two textfields as follows</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">VStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token class-name">TextField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Email"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token class-name">SecureField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$password</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<p>We should put the text fields on the same stack for easy control. Normally, in screens during the Authentication stage (such as Login, SignUp), text fields often have the same frames or constraints, for a great UI &amp; UX. Let’s give a try.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">VStack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">alignment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">leading</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> spacing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token class-name">TextField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Email"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$email</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">themeTextField</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cornerRadius</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token class-name">SecureField</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$password</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">themeTextField</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cornerRadius</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">leading</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">trailing</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">27.5</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>As you can see, the parts like padding or spacing of these text fields are the same. Instead of having to configure each one, we put all the text fields into VStack and just do it on this component itself.</p>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="b-texts-and-images">b. Texts and Images<a href="https://iosapptemplates.com/blog/login-screen-swiftui/#b-texts-and-images" class="hash-link" aria-label="Direct link to b. Texts and Images" title="Direct link to b. Texts and Images" translate="no">​</a></h4>
<p>Basically, this section does not have too many details to talk about. If you look at their definitions, you can see the APIs that you need. Also, right-click on the Previews section will also update our code directly. Now let’s try some text and image modifiers.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"iOS App Template"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">font</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">largeTitle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">foregroundColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">top</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"iosapptemplate"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">resizable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">250</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">250</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clipShape</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Circle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">overlay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Circle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stroke</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lineWidth</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">shadow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">radius</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="c-buttons">c. Buttons<a href="https://iosapptemplates.com/blog/login-screen-swiftui/#c-buttons" class="hash-link" aria-label="Direct link to c. Buttons" title="Direct link to c. Buttons" translate="no">​</a></h4>
<p>In the first piece of code, you might have noticed one of the Button declarations. Very easy to understand, right? We usually divide a Button into two parts, part one being its action. And part two is where we will layout all of it.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Sign In"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">font</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">headline</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">foregroundColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">padding</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">green</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">cornerRadius</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">15.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Jy_3" id="d-color-gradient">d. Color Gradient<a href="https://iosapptemplates.com/blog/login-screen-swiftui/#d-color-gradient" class="hash-link" aria-label="Direct link to d. Color Gradient" title="Direct link to d. Color Gradient" translate="no">​</a></h4>
<p>By now basically everything is done, the next step is to “color” them. In this section, we will also show you how to use gradient colors. Add the following code in the closing curly bracket of the biggest <strong>VStack</strong> to the following code.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token class-name">LinearGradient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">gradient</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Gradient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">colors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">purple</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">blue</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> startPoint</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">top</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> endPoint</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bottom</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">edgesIgnoringSafeArea</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">all</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>We used the <strong>Gradient</strong> object with purple and blue to blend and the gradient color to be blended from top to bottom. Gradient(colors: [.purple, .blue]), startPoint: .top, endPoint: .bottom).</p>
<p>Everything is fine now except for one thing. Our <strong>VStack</strong> doesn’t fill up the entire screen. Here is the tip. Add <strong>Spacer()</strong> inside the <strong>VStack</strong>, it will make the <strong>VStack</strong> fill the height of the screen.</p>
<p>We can make it more eye-catching with a shadow for each component. Now, let’s build and run the app to enjoy the fruits of our labor.</p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-where-to-go-from-here">3. Where to go from here?<a href="https://iosapptemplates.com/blog/login-screen-swiftui/#3-where-to-go-from-here" class="hash-link" aria-label="Direct link to 3. Where to go from here?" title="Direct link to 3. Where to go from here?" translate="no">​</a></h3>
<p>You now you know how to build a complex UI containing TextFields, Texts, Images, and Buttons, but there’s plenty more you can do, including authenticating emails or passwords, show an alert to tell users if they logged in successfully or failed.</p>
<p>I hope you learned something new in this tutorial. Since a lot of stuff about SwiftUI is coming, make sure you do not miss any updates in this series. If you have any concerns or questions, feel free leave a comment below! And don’t forget to give us 1 star on Github. Thanks so much.</p>]]></content:encoded>
            <category>SwiftUI</category>
            <category>Login</category>
            <category>iOS</category>
            <category>Tutorial</category>
        </item>
        <item>
            <title><![CDATA[How to Implement a Navigation Drawer in SwiftUI]]></title>
            <link>https://iosapptemplates.com/blog/navigation-drawer-swiftui/</link>
            <guid>https://iosapptemplates.com/blog/navigation-drawer-swiftui/</guid>
            <pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Tutorial to learn how to implement a navigation drawer in SwiftUI, with code example. SwiftUI code snippet, steo-by-step coding guide for a side bar menu]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">July 14, 2023</span></div></div>
<p>Welcome back to a new tutorial of our SwiftUI series. In this tutorial, we are going to learn how to implement a navigation drawer in SwiftUI, also know as side menu, side bar menu or hamburger menu. If you have ever worked with it in UIKit, you will understand its nature thoroughly. We will simply create a ViewController and assign it as a quick navigator.</p>
<!-- -->
<p><img decoding="async" loading="lazy" alt="navigation drawer" src="https://iosapptemplates.com/assets/images/navigation-drawer-ae07b13324bb16934fa155b385050411.jpg" width="768" height="576" class="img_Denh"></p>
<p>Before getting into it, we would like to make sure that you do not miss any of <a href="https://www.iosapptemplates.com/blog" target="_blank" rel="noopener noreferrer" class="">our previous articles</a> related to SwiftUI – they are extremely clear, concise and helpful. Let's get started.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-create-the-navigation-drawer-swiftui-component">1. Create the Navigation Drawer SwiftUI Component<a href="https://iosapptemplates.com/blog/navigation-drawer-swiftui/#1-create-the-navigation-drawer-swiftui-component" class="hash-link" aria-label="Direct link to 1. Create the Navigation Drawer SwiftUI Component" title="Direct link to 1. Create the Navigation Drawer SwiftUI Component" translate="no">​</a></h2>
<p>In this first step, we are going to create two things. The first one is the content of the navigation drawer. This will usually be a list of screens that users can navigate to. You could see an example in the image below. This is <a href="https://www.iosapptemplates.com/templates" target="_blank" rel="noopener noreferrer" class="">one of our templates</a> where we implemented the navigation drawer.</p>
<p><img decoding="async" loading="lazy" alt="navigation drawer swiftui" src="https://iosapptemplates.com/assets/images/navigation-drawer-swiftui-1fc1ea8bc976e02714823ee92ba2466e.png" width="429" height="858" class="img_Denh"></p>
<p>To keep this tutorial simple, we only create a simple view with a background color. Here's the SwiftUI code snippet:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">DrawerContent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">blue</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<p>The second part is the underlying padding. Its responsibility is to take care of tasks such as frames, transitions, opacities, borders, etc. In general, one view can do both tasks, but it's better to split it up because the DrawerContent view can be very complex.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">NavigationDrawer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> width </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">UIScreen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">bounds</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">width </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> isOpen</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Bool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">HStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">DrawerContent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">frame</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">offset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isOpen </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">width</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">animation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Spacer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Through the above code, we achieve the following:</p>
<ul>
<li class="">We embedded our DrawerContent inside NavigationDrawer through a <strong>HStack</strong>.</li>
<li class="">We've also made the frame for it. You can adjust the width as you want. <strong>isOpen</strong> is a property telling us if our navigation drawer is currently visible or not. Changing this flag will also change the visibility of the navigation drawer menu accordingly.</li>
</ul>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-adding-the-navigation-drawer-to-the-contentview">2. Adding the Navigation Drawer to the ContentView<a href="https://iosapptemplates.com/blog/navigation-drawer-swiftui/#2-adding-the-navigation-drawer-to-the-contentview" class="hash-link" aria-label="Direct link to 2. Adding the Navigation Drawer to the ContentView" title="Direct link to 2. Adding the Navigation Drawer to the ContentView" translate="no">​</a></h2>
<p>In this step, all that's left to do is to add the ability to call this function from the main view – our <strong><em>ContentView</em></strong>.</p>
<p>Add this block of SwiftUI code into the ContentView's body:</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token class-name">ContentView</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token attribute atrule" style="color:#00a4db">@State</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> isDrawerOpen</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Bool</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">some</span><span class="token plain"> </span><span class="token class-name">View</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">ZStack</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">/// Navigation Bar Title part</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isDrawerOpen </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name">NavigationView</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token class-name">EmptyView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">navigationBarTitle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Navigation Drawer"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">navigationBarItems</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">leading</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token class-name">DispatchQueue</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">asyncAfter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">deadline</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isDrawerOpen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toggle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">systemName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"sidebar.left"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">/// Navigation Drawer part</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">NavigationDrawer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isOpen</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isDrawerOpen</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">/// Other behaviors</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Color</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">white</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">onTapGesture </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isDrawerOpen </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isDrawerOpen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toggle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Don't panic! This block of code looks quite wordy but it is relatively simple. We're going to explain it step by step.</p>
<p>First, let's take a look at the block of code including the NavigationView below.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">NavigationView</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">EmptyView</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">navigationBarTitle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-literal string" style="color:#e3116c">"Navigation Drawer"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">navigationBarItems</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">leading</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Button</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">action</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">DispatchQueue</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">asyncAfter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">deadline</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isDrawerOpen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toggle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name">Image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">systemName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string-literal string" style="color:#e3116c">"sidebar.left"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>It declares a navigation bar with the title and a left item which is a button. Tapping on that will trigger our drawer. <strong>asyncAfter</strong> is just used for making the slide out animation more smooth – nothing special here.</p>
<p><img decoding="async" loading="lazy" alt="drawer menu swiftui" src="https://iosapptemplates.com/assets/images/drawer-menu-swiftui-3d6a2d75666710c700f5921a559f2464.png" width="577" height="1024" class="img_Denh"></p>
<p>Now, this is the most important part – how to emit a signal to show or hide the navigation drawer. As you can see, in the ContentView, the navigation bar only appears when <strong>isDrawerOpen</strong> is false. That means the navigation drawer is getting hidden.</p>
<p>Tapping on the button will update the <strong>isDrawerOpen</strong> value. Then, we will pass the latest value into the <strong>NavigationDrawer</strong>. And once the NavigationDrawer receives the signal, it will update its frame correspondingly.</p>
<div class="language-swift codeBlockContainer_RFY4 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_MLxb"><pre tabindex="0" class="prism-code language-swift codeBlock_O8hZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AO9E"><span class="token-line" style="color:#393A34"><span class="token class-name">NavigationDrawer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isOpen</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> isDrawerOpen</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Lastly, we just handle one more small behavior. Tapping anywhere on the screen to dismiss that view. All set! Build and run to see this feature.</p>
<p><img decoding="async" loading="lazy" alt="sidebar menu swiftui" src="https://iosapptemplates.com/assets/images/sidebar-menu-swiftui-18863bb44bf67010df4d146580ac7c54.png" width="577" height="1024" class="img_Denh"></p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-conclusion">3. Conclusion<a href="https://iosapptemplates.com/blog/navigation-drawer-swiftui/#3-conclusion" class="hash-link" aria-label="Direct link to 3. Conclusion" title="Direct link to 3. Conclusion" translate="no">​</a></h2>
<p>In this tutorial, you learned the basic concepts needed to implement a navigation drawer in SwiftUI. In an actual iOS app, you'd create a complex view instead of just simply coloring the background. Check out the <a href="https://github.com/mrcflorian/swiftUI-tutorials/tree/master/Tutorials/NavigationDrawerTutorial" target="_blank" rel="noopener noreferrer" class="">final source code on Github</a> for more details. Please don't forget to star our Github repository if you've found this tutorial helpful.</p>
<p>We hope you've enjoyed reading it! If you have any questions or comments as you work through this SwiftUI tutorial, feel free to comment below or ask us <a href="https://www.iosapptemplates.com/contact" target="_blank" rel="noopener noreferrer" class="">here</a>. Thanks so much and be sure to stay tuned for more tutorials!</p>]]></content:encoded>
            <category>SwiftUI</category>
            <category>Navigation</category>
            <category>Drawer</category>
            <category>Sidebar</category>
            <category>Menu</category>
            <category>iOS Development</category>
        </item>
        <item>
            <title><![CDATA[Firebase Database as backend for your Android/iOS app | iOS App Templates]]></title>
            <link>https://iosapptemplates.com/blog/firebase-database-backend-ios-app/</link>
            <guid>https://iosapptemplates.com/blog/firebase-database-backend-ios-app/</guid>
            <pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Firebase Database is a free backend infrastructure product, provided by Google, that serves as a backend for your mobile app.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">June 26, 2023</span></div></div>
<p><img decoding="async" loading="lazy" alt="firebase server ios app templates swift" src="https://iosapptemplates.com/assets/images/firebase-server-ios-app-templates-swift-9b73171c78cb8758f725b8e42686c675.png" width="750" height="422" class="img_Denh"></p>
<p><a href="https://firebase.google.com/docs/database/" target="_blank" rel="noopener noreferrer" class="">Firebase Database</a> is a free backend infrastructure product, provided by Google, that serves as a backend for your mobile app. It can store an unlimited amount of unstructured data, that can be queried in real-time by mobile apps with only a few lines of code, due to the powerful SDKs provided by Google.</p>
<!-- -->
<p>Any mobile app that relies on dynamic data needs a backend database, to store that data. For a shopping app, you would need to store your products, orders (customers and shipping addresses), payments, and product details. For a social media app, you would need to store all the content created by users (posts, comments, likes, etc). For a news reader app, you'd need a database to store your articles, comments, etc. You get the point.</p>
<p>The things get even more difficult because storing that data is not enough. You also need a way of serving the data in the database to the web or mobile clients (iOS/Android/Web apps). Not even this is enough though: you also need a way of keeping the clients in sync, up to date, with all the changes in your database (a.k.a real-time updates).</p>
<p>Achieving all of this requires a solid software infrastructure, that will take a very long time to build, and also could cost tens of thousands of dollars. This is where Firebase Database comes into play.</p>
<p>Firebase Database is a free backend infrastructure product, provided by Google, that serves as a backend for your mobile app. Its usability and scalability make it very powerful, and it should be the first server choice for someone trying to build an Android/iOS mobile app, especially for someone who doesn't want to spend months and thousands of dollars for it. By adopting Firebase Database, you'll take advantage of all its amazing features:</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="data-storage">Data storage<a href="https://iosapptemplates.com/blog/firebase-database-backend-ios-app/#data-storage" class="hash-link" aria-label="Direct link to Data storage" title="Direct link to Data storage" translate="no">​</a></h2>
<p>The data in Firebase is being stored in JSON format. This is the universal HTTP data transfer format, used by all the mobile apps out there. Your data can have any structure you want. This is very convenient because it makes it very easy to import data from anywhere, be it from your WooCommerce online store, your WordPress MySQL database or your Excel spreadsheet. All you need to do is import a .json file in the Google Firebase dashboard. Here's an example of how the data for our <a href="https://iosapptemplates.com/templates/firebase-ios-shopping-app-template" target="_blank" rel="noopener noreferrer" class="">Firebase iOS Shopping App template</a> is being stored:</p>
<p><img decoding="async" loading="lazy" alt="firebase database swift ios mobile app" src="https://iosapptemplates.com/assets/images/firebase-database-swift-ios-mobile-app-38a79e1e8e858c61952859265ec6dd3a.png" width="978" height="878" class="img_Denh"></p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="firebase-database-iosandroid-sdks">Firebase Database iOS/Android SDKs<a href="https://iosapptemplates.com/blog/firebase-database-backend-ios-app/#firebase-database-iosandroid-sdks" class="hash-link" aria-label="Direct link to Firebase Database iOS/Android SDKs" title="Direct link to Firebase Database iOS/Android SDKs" translate="no">​</a></h2>
<p>This is by far the most powerful feature – integration with Swift and Java, for iOS and Android codebases. Google provides SDKs for all mobile clients. This basically means that you'll fetch this data into your mobile app with only a few lines of code. This just saved you a few weeks of work, since it does everything for you: networking, API management, JSON parsing, performance analytics, etc. Here's how easy we are querying the e-commerce products from the database pictured above:</p>
<p><img decoding="async" loading="lazy" alt="firebase database shopping products fetch json ios swift 4 code" src="https://iosapptemplates.com/assets/images/firebase-database-shopping-products-fetch-json-ios-e46190c919e0274dc9586b60b20f019c.png" width="759" height="243" class="img_Denh"></p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="bidirectional-real-time-updates">Bidirectional real-time updates<a href="https://iosapptemplates.com/blog/firebase-database-backend-ios-app/#bidirectional-real-time-updates" class="hash-link" aria-label="Direct link to Bidirectional real-time updates" title="Direct link to Bidirectional real-time updates" translate="no">​</a></h2>
<p>Not only the SDKs provide your classes and methods to easily fetch the data from the Firebase server, but it also provides you ways of writing and updating the data on your server, from the mobile app. This means that you can easily store anything you want (users, payments, orders, articles, comments, etc), by simply calling one of the APIs provided in the free Swift SDK.</p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="scalability-and-security">Scalability and Security<a href="https://iosapptemplates.com/blog/firebase-database-backend-ios-app/#scalability-and-security" class="hash-link" aria-label="Direct link to Scalability and Security" title="Direct link to Scalability and Security" translate="no">​</a></h2>
<p>Firebase is based on top of the enormous cloud computing infrastructure at Google. If there's something Google knows how to do, is this: scalability. You can add millions of entries into your database, your app's performance won't decline (please make sure you paginate though :). Obviously, the whole communication between clients and server is being done through secure channels.</p>
<p>In conclusion, if you'll ever think about building a mobile app, you should consider Firebase to be your backend server. Not only it's free and saves you a lot of development time, but it also takes advantage of Google's scalable and secure infrastructure. It's hard to imagine you can create a more secure server that scales better than Google.</p>]]></content:encoded>
            <category>Mobile Programming</category>
            <category>Firebase</category>
            <category>Backend</category>
            <category>iOS</category>
            <category>Android</category>
            <category>Database</category>
        </item>
        <item>
            <title><![CDATA[Best Android App Templates]]></title>
            <link>https://iosapptemplates.com/blog/best-android-app-templates-2019/</link>
            <guid>https://iosapptemplates.com/blog/best-android-app-templates-2019/</guid>
            <pubDate>Tue, 03 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Best Android app templates coded in Kotlin. Free app templates, with source code and backend integration. Download android templates and starter kit]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">January 3, 2026</span></div></div>
<p>While we are solely building <a href="https://www.iosapptemplates.com/" target="_blank" rel="noopener noreferrer" class="">iOS App Templates</a>, being huge fans of Swift, there's a whole other world out there, when it comes to mobile, and that's the Android side. In this article, we thought about taking a look at the dark side, and see what are the <strong>best Android app templates</strong>, that you could use for inspiration in your mobile app design and development process.</p>
<!-- -->
<p>If you are looking for a cross-platform solution that works for both iOS and Android, you can check out this detailed list of the best <a href="https://instamobile.io/mobile-development/best-mobile-app-templates/" target="_blank" rel="noopener noreferrer" class="">app templates</a> on the market.</p>
<p>We've tried our best to curate only up-to-date Kotlin templates, that are truly gorgeous. After all, all of our iOS customers who become successful want to eventually launch an Android app as well, so they are turning to app templates again, in order to bootstrap the app development process, and save a ton of money.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-dating-app-template-for-android">1. Dating App Template for Android<a href="https://iosapptemplates.com/blog/best-android-app-templates-2019/#1-dating-app-template-for-android" class="hash-link" aria-label="Direct link to 1. Dating App Template for Android" title="Direct link to 1. Dating App Template for Android" translate="no">​</a></h2>
<p>If you're looking to build your own Tinder clone for Android, check out this amazing <a href="https://www.instakotlin.com/templates/android-dating-app-template-kotlin/" target="_blank" rel="noopener noreferrer" class="">Android Dating app template</a>. It has been released recently, which means it's really up to date when it comes to code compatibility and Kotlin coolness.</p>
<p><img decoding="async" loading="lazy" alt="android app templates" src="https://iosapptemplates.com/assets/images/android-app-templates-be3fab15d21bb389f19a33239af92fb0.png" width="800" height="600" class="img_Denh"></p>
<p>With amazing rich features, such as the Tinder Swipe cards, Matching, Realtime Chat, and Photo Galleries, this Android app template is the best dating template you can find on the market as of 2019. On top of that, it is also integrated with Firebase backend, which means you can launch a dating app to the Google Play Store literally in minutes. Developing such a powerful dating app in Kotlin is extremely expensive, and it probably cost more than $5000 to reach feature parity. So it's really a steal, given Instakotlin is giving it away for such a low price.</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-android-chat-app-template">2. Android Chat App Template<a href="https://iosapptemplates.com/blog/best-android-app-templates-2019/#2-android-chat-app-template" class="hash-link" aria-label="Direct link to 2. Android Chat App Template" title="Direct link to 2. Android Chat App Template" translate="no">​</a></h2>
<p>Any Android developer has dealt with building an Android chat app eventually. Almost all the apps have it, be it the core functionality or a nice to have feature helping with customer support. Chances are you'll need to implement a chat feature in your development career. Fortunately, we found this beautiful <a href="https://www.instakotlin.com/templates/android-chat-app-template-kotlin/" target="_blank" rel="noopener noreferrer" class="">Android Chat App Template</a>, that works in real-time and is fully integrated with a backend system (Firebase Firestore). It has a set of amazing features, such as 1:1 chat, group chatting, photo messaging, and more. The app is really slick, performant and optimized for smooth user experience.</p>
<p><img decoding="async" loading="lazy" alt="Best Android App Templates" src="https://iosapptemplates.com/assets/images/Best-Android-App-Templates-7cf46eaa1d45c09367439f37a515397b.png" width="800" height="600" class="img_Denh"></p>
<p>Additionally, users can manage their friendships, by adding, rejecting and accepting friend requests. As you can see from the screenshot, the design is inspired by Facebook Messenger, having even a stories tray. This is by far one of the most complete Android app template, that you can find on the marketplace. And yes, it is 100% written in Kotlin.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-restaurant-app-template-for-android">3. Restaurant App Template for Android<a href="https://iosapptemplates.com/blog/best-android-app-templates-2019/#3-restaurant-app-template-for-android" class="hash-link" aria-label="Direct link to 3. Restaurant App Template for Android" title="Direct link to 3. Restaurant App Template for Android" translate="no">​</a></h2>
<p>Food delivery apps have become mainstream. Companies such as Uber Eats, Doordash, Postmates, Grubhub, Deliveroo, etc. have revolutionized the food delivery process. So chances are building a restaurant app for Android is becoming more and more popular. This <a href="https://www.instakotlin.com/templates/android-restaurant-app-template/" target="_blank" rel="noopener noreferrer" class="">Restaurant App Template for Android</a> allows developers to bootstrap their app development for restaurant apps or food delivery apps. You can check out all the features on the product page, but to name a few: shopping cart, order placement, backend integration, onboarding screens, etc.</p>
<p><img decoding="async" loading="lazy" alt="free android app templates" src="https://iosapptemplates.com/assets/images/free-android-app-templates-57edb44edd58f8c4385e36f98cdb1f5d.png" width="800" height="600" class="img_Denh"></p>
<p>As you'd expect by this point, this Android app template is also fully coded in Kotlin, which is the new cool kid in town, if you're into Android development. The best part about this Android app template is that, given the fully functional shopping cart feature, it can be easily converted into an e-commerce native app. Think about it – if you change all your products to represent shopping items rather than food items, you can pretty much see the shopping app already.</p>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-e-commerce-android-app-template">4. E-commerce Android App Template<a href="https://iosapptemplates.com/blog/best-android-app-templates-2019/#4-e-commerce-android-app-template" class="hash-link" aria-label="Direct link to 4. E-commerce Android App Template" title="Direct link to 4. E-commerce Android App Template" translate="no">​</a></h2>
<p>If you ever end up working on a native mobile e-commerce app for Android, check out this Kotlin <a href="https://www.instamobile.io/app-templates/ecommerce-android-app-template-kotlin-download/" target="_blank" rel="noopener noreferrer" class="">app template</a>. With a great design, featuring multiple product formats (such as carousels, grids, and lists), this Kotlin template can save you a few weeks of development, and a few thousand bucks.</p>
<p><img decoding="async" loading="lazy" alt="Kotlin app templates" src="https://iosapptemplates.com/assets/images/Kotlin-app-templates-9e65e462cfd2a38c07f127881ae10eff.png" width="853" height="640" class="img_Denh"></p>
<p>Using a shopping Android app template to jumpstart the development of your Kotlin app is a smart idea. You get to save thousands of dollars and many months of development, by shipping your product faster and at a fraction of the cost. Mobile development is extremely expensive and complex. Rather than reinventing the wheel, you get to focus on what truly matters for your Android business, such as your customers and marketing. This is why it's highly recommended to use an Android app template to develop your minimum viable product.</p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-video-conference-app-template">5. Video Conference App Template<a href="https://iosapptemplates.com/blog/best-android-app-templates-2019/#5-video-conference-app-template" class="hash-link" aria-label="Direct link to 5. Video Conference App Template" title="Direct link to 5. Video Conference App Template" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="video conference app" src="https://iosapptemplates.com/assets/images/video-conference-app-70d9aa80036fb399bb396740986e97e7.png" width="800" height="600" class="img_Denh"></p>
<p>This gorgeous <a href="https://www.instakotlin.com/templates/video-chat-app-android/" target="_blank" rel="noopener noreferrer" class="">Video Conference App Template</a> is another great source code to speed up your app development. You can simply add a video chat feature to any Kotlin app with a single line of code. That's just mind-blowing. You can skip at least 3 months of hard development work and save more than $10,000 just by simply downloading this library. Kotlin is a fairly new programming language, and the number of Android app templates in the marketplace (as of 2019) is not that high. But the Android templates that we've featured in this post are truly exceptional, both in terms of design and code quality. You can also find a number of free Android app templates on Github, but unfortunately, most of them are still written in Java, which is being deprecated by Google, in Android app development. Even if you're just looking to learn Kotlin, getting your hands dirty with a free/open-source starter kit is an effective way to learn Android development quickly. Especially if you already know how to code (in a different language). Kotlin is very similar to Java, so a starter kit will teach you the general syntax and program lifecycle easily. In other words, learn by doing. Did we miss any gorgeous Android app templates? Let us know in the comments. Also, don't forget to share this article with your friends, if you've found it useful. Looking forward to all the Android app templates that y'all are going to recommend.</p>]]></content:encoded>
            <category>Mobile Development</category>
            <category>Android</category>
            <category>App Templates</category>
        </item>
        <item>
            <title><![CDATA[Best iOS Walkthrough App Designs 2023 | iOS App Templates]]></title>
            <link>https://iosapptemplates.com/blog/best-ios-walkthrough-app-designs-inspiration/</link>
            <guid>https://iosapptemplates.com/blog/best-ios-walkthrough-app-designs-inspiration/</guid>
            <pubDate>Mon, 19 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[We are featuring the best iOS walkthrough app designs of 2023, which you can use for your own inspiration. Elegant, clean and optimized Walkthrough designs.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">December 20, 2022</span></div></div>
<p>In this blog post, we are featuring the best iOS walkthrough app designs of 2023, which you can use for your own inspiration. We’ve selected a list of gorgeous UI app templates that are meant to inspire the readers. All of them contain modern mobile user interfaces, that are clean and elegant. The criteria we’ve used in order to curate this list of onboarding flow designs were based on a variety of properties, such as UI, UX as well as the expected conversion rate, from a growth perspective. The last one is extremely relevant because it’s the property that measures the effectiveness of the walkthrough flow. The role of the walkthrough onboarding flow is to educate the new users, convince them to create an account and eventually retain them long term into your app.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="think-ui-walkthrough"><a href="https://www.thinkui.com/walkthrough" target="_blank" rel="noopener noreferrer" class="">Think UI Walkthrough</a><a href="https://iosapptemplates.com/blog/best-ios-walkthrough-app-designs-inspiration/#think-ui-walkthrough" class="hash-link" aria-label="Direct link to think-ui-walkthrough" title="Direct link to think-ui-walkthrough" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Best iOS Walkthrough App Designs for Your Inspiration" src="https://iosapptemplates.com/assets/images/think-ui-walkthrough-88e544a491e48152c9095e6c17d8853b.png" width="898" height="427" class="img_Denh"></p>
<p>We’ve selected this template due to its elegance. Modern mobile walkthroughs should be as clean as possible, to not distract users from their main purpose: conversion. While optimized for call to action, the design lays out clearly the value proposition of the app. It welcomes the customers to the newly installed app while at the same time it educates them on what the app is about and why they should sign up. All this in a very subtle manner, providing them optionality (notice the “Skip” button at the top). Genius!</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="dashboard-ios-app-template-walkthrough"><a href="https://www.iosapptemplates.com/templates/dashboard-ios-app-template" target="_blank" rel="noopener noreferrer" class="">Dashboard iOS App Template Walkthrough</a><a href="https://iosapptemplates.com/blog/best-ios-walkthrough-app-designs-inspiration/#dashboard-ios-app-template-walkthrough" class="hash-link" aria-label="Direct link to dashboard-ios-app-template-walkthrough" title="Direct link to dashboard-ios-app-template-walkthrough" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Best iOS Walkthrough App Designs for Your Inspiration" src="https://iosapptemplates.com/assets/images/dashboad-ios-app-template-walkthrough-8551c5907581473ee45562743fbe3506.png" width="1024" height="519" class="img_Denh"></p>
<p>If you’re making an iOS app that’s targeting more professional users, such as business owners, entrepreneurs or developers, you’d like a walkthrough app design flow that expresses more seriosity and professionalism. This walkthrough flow is perfect for that. Simple, effective and pro. We’ve already integrated it into our fully-implemented Dashboard iOS app template, that’s helping business owners stay up to date with their business metrics. Oh, the implementation of this walkthrough can be also downloaded FOR FREE on our app templates page. You’re welcome!</p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="capi-walkthrough-design"><a href="https://www.iosapptemplates.com/templates/capi-ios-app-template" target="_blank" rel="noopener noreferrer" class="">Capi Walkthrough Design</a><a href="https://iosapptemplates.com/blog/best-ios-walkthrough-app-designs-inspiration/#capi-walkthrough-design" class="hash-link" aria-label="Direct link to capi-walkthrough-design" title="Direct link to capi-walkthrough-design" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Best iOS Walkthrough App Designs for Your Inspiration" src="https://iosapptemplates.com/assets/images/capi-walkthrough-design-3dc6b25f8a6f588ed64f3997437da057.png" width="773" height="410" class="img_Denh"></p>
<p>Next time you’re looking for an amazing walkthrough onboarding design, that’s also easy to implement, get your inspiration from this excellent piece of art. It has a clear value proposition and it conveys it elegantly. It uses a well-known iOS UX pattern (the iOS pagination elements) and extremely simple image assets. Having only one dominant color saves you a lot of headaches with matching texts, backgrounds, and icons. Plus, you can adapt it to any app trivially. Oh, and you can simply use a UIPaginationViewController and the implementation is done. Convenient, right?</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="big-bite-walkthrough-app-designs"><a href="https://iosapptemplates.com/blog/best-ios-walkthrough-app-designs-inspiration/#" class="">Big Bite Walkthrough App Designs</a><a href="https://iosapptemplates.com/blog/best-ios-walkthrough-app-designs-inspiration/#big-bite-walkthrough-app-designs" class="hash-link" aria-label="Direct link to big-bite-walkthrough-app-designs" title="Direct link to big-bite-walkthrough-app-designs" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Best iOS Walkthrough App Designs for Your Inspiration" src="https://iosapptemplates.com/assets/images/big-bite-walkthrough-app-designs-f76a3f96a4c9708a06128de6c5456966.png" width="708" height="392" class="img_Denh"></p>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<p>Still looking for your perfect walkthrough design? What about this one? While extremely similar to the previous onboarding design, it reverses the color scheme to white out the background. This is much more suitable for mobile apps that have a lighter app theme. What we absolutely love about this app onboarding template is the brilliant iconography work. Observe how regular icons are being blended into the app’s color scheme through the concentric circles whose colors are fading away gradually. Incredible! Aaand it’s a wrap. These are, in our opinion, the best iOS walkthrough app designs of 2018, so far. Any other walkthrough designs you came across and you’d like to share? We’re always seeking inspiration so please share them with us!</p>]]></content:encoded>
            <category>iOS Design</category>
            <category>Walkthrough</category>
            <category>App Design</category>
            <category>UI Inspiration</category>
            <category>Mobile Apps</category>
            <category>iOS App Templates</category>
            <category>User Onboarding</category>
        </item>
        <item>
            <title><![CDATA[The Best Features Any Mobile Dating App Should Have in 2023]]></title>
            <link>https://iosapptemplates.com/blog/mobile-dating-app-features/</link>
            <guid>https://iosapptemplates.com/blog/mobile-dating-app-features/</guid>
            <pubDate>Sun, 27 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[The best features any mobile dating app should have in 2023. Learn how to make an app like Tinder. Mobile dating app development cost & product design.]]></description>
            <content:encoded><![CDATA[<div style="display:flex;justify-content:space-between;align-items:center;margin:10px 0;padding:10px 0"><div style="color:#666;font-size:0.9em">Last updated on<!-- --> <span style="font-weight:bold">January 29, 2025</span></div></div>
<p><img decoding="async" loading="lazy" alt="Best Features Any Mobile Dating App Should Have" src="https://iosapptemplates.com/assets/images/mobile-dating-app-blog-1-d06ed95ea975fd9b208d5d71acc8e877.png" width="800" height="600" class="img_Denh"></p>
<p>In the past few years, dating applications have created an online revolution, changing the way people get to know and date each other. Online dating is faster and more convenient than traditional dating, and it offers more choices to users. As the number of dating apps is increasing, more entrepreneurs and developers are starting new ventures in the mobile dating space. In this article, we are listing the key features that any <strong>mobile dating app</strong> should have, to stay ahead of the competition and to provide a thrilling user experience.</p>
<!-- -->
<p>So how can we create an application that not only competes with the other dating applications, but it is unique enough so that it stands out from the crowd? In this article, we will help you answer this question by describing the most relevant key features that a mobile dating app should incorporate. You can also refer to our <a href="https://www.iosapptemplates.com/templates/ios-dating-app-template" target="_blank" rel="noopener noreferrer" class="">mobile dating templates</a>, to check out these features in action. We believe that by following our recommendations, your mobile app will stand out on the App Store. We are going to present all these cool mobile dating app features, along with our actual project <a href="https://www.iosapptemplates.com/templates/ios-dating-app-template" target="_blank" rel="noopener noreferrer" class="">dating app template</a> for which we inspired from successful dating apps such as Tinder and Bumble. In this way, we are going to paint a better picture around these crucial features, and hopefully, you’ll understand the value of adding them when making your own dating app for iOS or Android. If you’re looking to learn how to make an app like Tinder, by using our Swift project you’ll get the best mobile dating app development cost. Without further ado, let’s get started.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="1-safe--frictionless-user-onboarding-process">1. Safe &amp; Frictionless User Onboarding Process<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#1-safe--frictionless-user-onboarding-process" class="hash-link" aria-label="Direct link to 1. Safe &amp; Frictionless User Onboarding Process" title="Direct link to 1. Safe &amp; Frictionless User Onboarding Process" translate="no">​</a></h3>
<p>Safety is a critical feature of dating apps. Ideally, you should collect core user information, by protecting user data, especially if you are asking for sensitive information, such as marital status, age or gender. You want to also allow your users to be comfortable with the amount of information they share, so don’t be too pushy. In general, the more information you can collect, the better the user experience will be, but make sure the app doesn’t get too creepy. Set some robust limits on how much personal information should users provide. After that, the dating app should also ensure users look the same as their photos (you can use social networks like Facebook or Instagram to check automatically). Here’s a small pro-tip for you: using videos through chat-box is also a trusted way to help users know more about their new potential dates. As an example, in our dating template, we have the following features, that are meant to provide a frictionless dating onboarding experience, while collecting enough user information and by also keeping users accountable for their online behavior:</p>
<ul>
<li class="">
<p><strong>Login/ Signup with Facebook</strong>: we know this is a basic function but at least it can help you connect to Facebook – the biggest social network where you can get the most reliable personal information, such as username and profile pictures, in one click.</p>
</li>
<li class="">
<p><strong>User Profile View/ Profile Editing Screen/ Add Profile Photo Flow</strong>: These screens will show/update all the user’s profile fields (especially photos, which are the core of dating apps)</p>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Best Features Any Mobile Dating App Should Have" src="https://iosapptemplates.com/assets/images/login-and-profile-view-27286b24761b4a8795baa50ccd355fdf.png" width="877" height="486" class="img_Denh"></p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="2-eye-catching-user-interface">2. Eye-catching User Interface<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#2-eye-catching-user-interface" class="hash-link" aria-label="Direct link to 2. Eye-catching User Interface" title="Direct link to 2. Eye-catching User Interface" translate="no">​</a></h3>
<p>The user interface is your product. It’s the only way your users interact with your product, so you need to make sure they have an amazing interface. Photos are the heart of dating apps since they play a central role for the first impressions. So make sure the features around photos are slick, beautifully animated, and smooth. Take a look at the app designs below, which were inspired by <a href="https://www.iosapptemplates.com/blog/ios-development/tinder-card-swipe-swift-koloda" target="_blank" rel="noopener noreferrer" class="">Tinder swipe cards</a>:</p>
<p><img decoding="async" loading="lazy" alt="Best Features Any Mobile Dating App Should Have" src="https://iosapptemplates.com/assets/images/user-interface-6bdedc7913fd34c2bff5287b4bcdc390.png" width="685" height="513" class="img_Denh"></p>
<p>As you can see, swiping around cards with people’s faces on them is a lot of fun. By designing your app to be playful, you can get your users hooked to it. Creating addictive behavior is the engine for growth in social apps. If you want to learn how to build these cards, you can follow our <a href="https://www.iosapptemplates.com/blog/ios-development/tinder-card-swipe-swift-koloda" target="_blank" rel="noopener noreferrer" class="">Tinder cards Swift tutorial</a> here or buy our <a href="https://www.iosapptemplates.com/templates/ios-dating-app-template" target="_blank" rel="noopener noreferrer" class="">dating app template</a>, directly to save yourself some time &amp; energy. Additionally, choose the main colors of your app to represent romance and delicacy, to build a harmonious design system. All of the design elements need to be clean, attractive and simplistic, without displaying too many components at a time. As you can see, in our dating template, we have the following features related to addictive, beautiful UI:</p>
<ul>
<li class="">
<p><strong>Tinder Swipe</strong>: We applied the latest UI trends, with a beautiful swiping gesture, colorful call to actions and great native animations</p>
</li>
<li class="">
<p><strong>Matchmaking</strong>: Getting a match has a special app screen, thrilling users and make them feel rewarded for using the app. That’s how you build addictive behavior and get users to be hooked to your valuable dating app product.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="3-advanced-matching-recommendations">3. Advanced Matching Recommendations<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#3-advanced-matching-recommendations" class="hash-link" aria-label="Direct link to 3. Advanced Matching Recommendations" title="Direct link to 3. Advanced Matching Recommendations" translate="no">​</a></h3>
<p>Obviously, people use mobile dating apps in order to find people they have things in common with. So recommending high-quality dates is a crucial part of your matching algorithm. Make sure the recommendation algorithm takes into account basic features, such as age, interests, location, and religion. Having something in common can make it easier for people to connect with each other. You should also consider creating a feature filtering out people who are not a good fit. In our dating template, we can help you manage users with Firebase. We also provide a settings screen, where users can choose their preferences, in terms of age, gender and location. Thus, you can change or update any fields you want. It’s really convenient. Having a profile field such as “bio”, allows users to express themselves in original ways, enhancing the value of our dating app.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="4-chat--text-photo--video-messaging">4. Chat – Text, Photo &amp; Video Messaging<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#4-chat--text-photo--video-messaging" class="hash-link" aria-label="Direct link to 4. Chat – Text, Photo &amp; Video Messaging" title="Direct link to 4. Chat – Text, Photo &amp; Video Messaging" translate="no">​</a></h3>
<p>While this may seem obvious, having a chatting feature in a dating app is extremely important. This is how users who matched, get to know each other, get familiar with each other and set up real-world dates. Make sure the chat is real-time since no one wants to use e-mail for this. The chat should be playful, interactive and performant. It should support at the very least sending texts, photos, and videos. You should also consider supporting audio calls, video calls, GIFs, stickers, etc. Another nice feature could be conversation opener suggestions, to encourage users to start up a conversation with a predefined question. Our dating app template powers most of these chat features. <strong>The real-time chat</strong> part is fully integrated with Firebase backend including <strong>Text Messages, Photo Messaging, Photo Camera, emojis</strong>, etc.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="5-push-notifications">5. Push Notifications<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#5-push-notifications" class="hash-link" aria-label="Direct link to 5. Push Notifications" title="Direct link to 5. Push Notifications" translate="no">​</a></h3>
<p>Like other most <strong>chat applications</strong>, dating apps should have a push notification feature to surface the latest updates in real-time. Users want to know right away what happens to their online dating profile, so you need a way to let them know when they get new chat messages, photos, or new matches. In addition to great user experience, <strong>push notifications are also a growth tactic since they bring users back into the app. Push notifications are the most powerful tool for increasing user retention</strong>. They are also a key differentiator from traditional online dating websites, where everything was done via e-mail.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="6-user-blocking--reporting">6. User Blocking &amp; Reporting<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#6-user-blocking--reporting" class="hash-link" aria-label="Direct link to 6. User Blocking &amp; Reporting" title="Direct link to 6. User Blocking &amp; Reporting" translate="no">​</a></h3>
<p>Obviously, everything has two sides. Aside from easily connecting people together, users are also at risk of encountering bad guys, scammers or pathetic, perverted people who intentionally send pornographic/ sensitive messages or images. <strong>Users need to feel safe while using your app</strong>. To empower them, your dating app needs to include features such as blocking or reporting other users. In this way, you keep a high-quality user base, making the experience great for everyone who uses your network. In fact, Apple even requires you to have this feature, so you can’t publish any dating apps to the App Store without having a bulletproof way of banning users off the platform. Check out their User Generated Content policy in the <a href="https://developer.apple.com/app-store/review/guidelines/" target="_blank" rel="noopener noreferrer" class="">App Store Review Guidelines</a>. You can use our blocking &amp; reporting user flow as inspiration for your brand new dating app:</p>
<p><img decoding="async" loading="lazy" alt="Best Features Any Mobile Dating App Should Have" src="https://iosapptemplates.com/assets/images/user-blocking-and-reporting-c0f8337b2544f6a1964634b004ae0b39.png" width="440" height="472" class="img_Denh">
<img decoding="async" loading="lazy" alt="Best Features Any Mobile Dating App Should Have" src="https://iosapptemplates.com/assets/images/user-blocking-and-reporting-2-69bb8caeffdf2a1713af32ba991635c5.png" width="437" height="467" class="img_Denh"></p>
<div style="border:1px solid #ccc;margin:1rem;padding:1rem;text-align:center;border-radius:0.5rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1)"><p style="display:inline-block;font-size:1rem;color:#333;margin-right:1rem"><b>Mega Bundle Sale is ON!</b> Get ALL of our <!-- -->React Native<!-- --> codebases at 90% OFF discount 🔥</p><a href="https://instamobile.io/app-templates/react-native-mega-bundle/?ref=blog" style="display:inline-block;background-color:#4B51CF;color:#fff;padding:0.5rem 2rem;text-decoration:none;border-radius:0.5rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2)">Get the Mega Bundle</a></div>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="7-reviews--ratings-after-the-first-date">7. Reviews &amp; Ratings After the First Date<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#7-reviews--ratings-after-the-first-date" class="hash-link" aria-label="Direct link to 7. Reviews &amp; Ratings After the First Date" title="Direct link to 7. Reviews &amp; Ratings After the First Date" translate="no">​</a></h3>
<p>Definitely consider adding a feature of leaving reviews and ratings after the first date. It sounds funny but your app should have this part. It helps users know what the other half thinks of them, whether that person still wants to continue dating. It is also a lot of fun! You can even allow the users to publish their own reviews, to brag about how great they are at dating. There’s a ton of awesome key features you can build in this area, so be creative and original.</p>
<h3 class="anchor anchorTargetStickyNavbar_Jy_3" id="8-other-mobile-dating-app-feature-ideas">8. Other Mobile Dating App Feature Ideas<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#8-other-mobile-dating-app-feature-ideas" class="hash-link" aria-label="Direct link to 8. Other Mobile Dating App Feature Ideas" title="Direct link to 8. Other Mobile Dating App Feature Ideas" translate="no">​</a></h3>
<ul>
<li class="">Small Games that help people get to know each other</li>
<li class="">Group dating, to make people have more fun and feel safer</li>
<li class="">Place Recommendations (restaurant, bar, activity, etc) for the First Date (it could also be a great monetization strategy)</li>
<li class="">Gift suggestions, based on user preferences</li>
<li class="">Digital gifts (such as digital flowers, chocolate, etc)</li>
<li class="">“Superlike” button, for which users need to pay extra</li>
</ul>
<div style="padding:1rem;text-align:center;border-radius:0.25rem;margin-bottom:1rem;box-shadow:0 0 10px rgba(0, 0, 0, 0.1);border:1px solid #ccc;background-color:#f8f9fa"><h5 style="color:#333;margin-bottom:0.5rem;font-size:1.25rem">Looking for a custom mobile application?</h5><p style="color:#333;margin-bottom:1rem;font-size:1rem">Our team of expert mobile developers can help you build a custom mobile app that meets your specific needs.</p><a href="https://instamobile.io/app/custom-app-development?ref=blog-conclusion" target="_blank" rel="noopener noreferrer" class="btn btn-success" style="background-color:#788eec;color:white;padding:0.5rem 1rem;font-size:1.25rem;border-radius:0.25rem;font-weight:bold;box-shadow:0 0 5px rgba(0, 0, 0, 0.2);text-decoration:none">Get in Touch</a></div>
<h2 class="anchor anchorTargetStickyNavbar_Jy_3" id="conclusion">Conclusion<a href="https://iosapptemplates.com/blog/mobile-dating-app-features/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>As you can see, there are a ton of great key features that a mobile dating app can have. Use this article as inspiration and extract the features that you consider the most valuable. Make sure your final dating app stands out from the crowd. To achieve that, you need to be creative and original, while also maintaining the core features that represent the status quo in mobile dating apps (such as Tinder Cards, for instance).</p>
<p>If there’s a single take away from this article, let it be this: <strong>Dating should be FUN!</strong> Regardless of what features you decide to go with, you should definitely consider starting your app development with a <a href="https://www.iosapptemplates.com/templates/ios-dating-app-template" target="_blank" rel="noopener noreferrer" class="">dating app template</a>, to avoid wasting your precious resources (money, time and energy) on reinventing the wheel. Please help us out by sharing our article with your friends, if you found it useful.</p>]]></content:encoded>
            <category>Dating App</category>
            <category>Mobile Development</category>
            <category>Tinder</category>
            <category>App Features</category>
            <category>Product Design</category>
            <category>iOS Development</category>
            <category>Android Development</category>
            <category>App Ideas</category>
            <category>2023 Trends</category>
            <category>User Experience</category>
        </item>
    </channel>
</rss>