<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Steven J. Selcuk</title>
    <description>The latest articles on DEV Community by Steven J. Selcuk (@stevenselcuk).</description>
    <link>https://dev.to/stevenselcuk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3564464%2Fab138b4a-75ed-4ea1-88dc-e521c2b72c1b.jpg</url>
      <title>DEV Community: Steven J. Selcuk</title>
      <link>https://dev.to/stevenselcuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stevenselcuk"/>
    <language>en</language>
    <item>
      <title>Create AppStore Images with one liner</title>
      <dc:creator>Steven J. Selcuk</dc:creator>
      <pubDate>Mon, 09 Mar 2026 09:52:28 +0000</pubDate>
      <link>https://dev.to/stevenselcuk/create-appstore-images-with-one-liner-pal</link>
      <guid>https://dev.to/stevenselcuk/create-appstore-images-with-one-liner-pal</guid>
      <description>&lt;p&gt;As an iOS developer, the absolute worst part of releasing an app is creating App Store screenshots. &lt;/p&gt;

&lt;p&gt;There are expensive micro-SaaS tools out there. But honestly? They just take your money, and you still end up doing a lot of manual work. I am already paying too much money to Digital Ocean and Google Cloud. I don't need this.&lt;/p&gt;

&lt;p&gt;Here is my personal solution. It kills two birds with one stone:&lt;/p&gt;

&lt;p&gt;First, we automate our App Store screenshots,&lt;br&gt;
Second, we write UI tests and increase our code coverage.&lt;/p&gt;

&lt;p&gt;Here is how you can do it, step-by-step:&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Take Screenshots with XCTest
&lt;/h3&gt;

&lt;p&gt;Write a simple UI test and use XCTest to take a screenshot. Make sure to keep the attachment so Xcode saves it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;XCUIScreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;attachment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;XCTAttachment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lifetime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keepAlways&lt;/span&gt;
&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AppStore_Home"&lt;/span&gt;
&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Run Your Tests
&lt;/h3&gt;

&lt;p&gt;Just run your UI tests in Xcode (&lt;code&gt;Cmd + U&lt;/code&gt;). Xcode will automatically save all these screenshots inside a hidden &lt;code&gt;.xcresult&lt;/code&gt; file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Export to Desktop using a Custom CLI Command
&lt;/h3&gt;

&lt;p&gt;Instead of writing a long, messy bash file every time, let's turn this into a simple custom CLI command!&lt;/p&gt;

&lt;p&gt;You just need a tool called &lt;strong&gt;xcparse&lt;/strong&gt; (you can install it via Homebrew).&lt;/p&gt;

&lt;p&gt;To make it a simple command, open your terminal and add this small function to your &lt;code&gt;~/.zshrc&lt;/code&gt; (or &lt;code&gt;~/.bash_profile&lt;/code&gt;) file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add this to your .zshrc&lt;/span&gt;
extract_screens&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;LATEST_RESULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;find ~/Library/Developer/Xcode/DerivedData &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.xcresult"&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"%m %N"&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; + | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f2-&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Desktop/Screenshots
    xcparse screenshots &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LATEST_RESULT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; ~/Desktop/Screenshots

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"🚀 Success! Screenshots extracted to your Desktop."&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, restart your terminal. After your tests finish, just type this single command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ extract_screens&lt;/code&gt; and hit the enter.&lt;/p&gt;

&lt;p&gt;Boom! All your App Store screenshots are sitting perfectly on your Desktop. You saved money, saved time, and tested your app. We have a raw screenshot and tot impressed? Totally understandable. The second part will be SVG-based image generation and localization. Click to follow the button. Stay tuned. &lt;/p&gt;

&lt;p&gt;How do you currently handle your App Store screenshots? Paying others? Let me know below! 👇&lt;/p&gt;




</description>
      <category>ios</category>
      <category>appstore</category>
      <category>swift</category>
      <category>marketing</category>
    </item>
    <item>
      <title>Patterns and Folder Structure for iOS Development</title>
      <dc:creator>Steven J. Selcuk</dc:creator>
      <pubDate>Wed, 21 Jan 2026 10:05:56 +0000</pubDate>
      <link>https://dev.to/stevenselcuk/patterns-and-folder-structure-for-ios-development-4pa8</link>
      <guid>https://dev.to/stevenselcuk/patterns-and-folder-structure-for-ios-development-4pa8</guid>
      <description>&lt;p&gt;Every two years, a design pattern becomes famous. VIPER was the golden boy before. I mean, it was the top %1 popular question for the whiteboarding stage. So what? It was MVC in UIKit times. Now it's MVVM for modern Swift6/SwiftUI/iOS development&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's talk
&lt;/h2&gt;

&lt;p&gt;It's just naming and putting files in the correct place. Do not get confused with all the mumbo-jumbo and CS666 something. All these patterns only affect your workflow. Not your code. Views are the same views in SwiftUI, nothing new or changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Domain/Feature-Based Modules
&lt;/h2&gt;

&lt;p&gt;If you know REACT this is what we have been using for decades. Create containers in a name, e.g., Dashboard display, and do stuff here. It can be Login, About, Services, Landing Page, and Onboarding. One Job -&amp;gt; One domain, so you can isolate them from each other&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not do business logic in Views
&lt;/h2&gt;

&lt;p&gt;The second rule is not put functions except UI related stuff in views. Do it on ViewModel. Same thing again. Separation &amp;amp; isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a Common/Shared folder
&lt;/h2&gt;

&lt;p&gt;This is kinda conflicts with a rule, much more important than all this folder thing. DO NOT REPEAT YOURSELF! So create a common/shared folder for reusable components (like in React), views, etc. Use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reality check: Design Patterns and Architecture Designing are Different Things
&lt;/h2&gt;

&lt;p&gt;MVVM is not a superhero. Yea most of the companies/startup and their teams lives with an idea and are ready to fight. But hey, it's just a decision of naming / foldering, that's it. Not &lt;code&gt;System Architecture&lt;/code&gt;. Do not confuse. I mean. If you don't have a solid foundation, eventually your view models inflate and explode, or you have to deal with a race condition for 4 hours, and MVVM can't save you from this. Do not get hyped with random letters shows up in your LinkedIn feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Conclusion
&lt;/h2&gt;

&lt;p&gt;Every two years, fully refactor your code. Maybe ten years ago, it was five. One simple thing you need to keep in mind if you're starting a project, except if you're a newcomer to an existing storyboard-used VIPER project, it's a different story. Good luck with that. How can I make it easy to rewrite/refactor the whole app 2 years later? Question is: How maintainable? How long does it take? If you have an answer for it. Choose whatever you want for "pattern."&lt;/p&gt;

</description>
      <category>ios</category>
      <category>interview</category>
      <category>swiftui</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
