{"id":47456,"date":"2025-04-22T15:37:41","date_gmt":"2025-04-22T19:37:41","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=47456"},"modified":"2025-04-22T15:37:41","modified_gmt":"2025-04-22T19:37:41","slug":"automating-screenshots-for-the-mac-app-store","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2025\/04\/22\/automating-screenshots-for-the-mac-app-store\/","title":{"rendered":"Automating Screenshots for the Mac App Store"},"content":{"rendered":"<p><a href=\"https:\/\/www.jessesquires.com\/blog\/2025\/03\/24\/automate-perfect-mac-screenshots\/\">Jesse Squires<\/a>:<\/p>\n<blockquote cite=\"https:\/\/www.jessesquires.com\/blog\/2025\/03\/24\/automate-perfect-mac-screenshots\/\"><p>Meeting the <a href=\"\/blog\/2024\/01\/16\/app-store-screenshot-requirements\/\">requirements for screenshots<\/a> is a frustrating experience. On iOS, tooling like <a href=\"https:\/\/github.com\/shinydevelopment\/SimulatorStatusMagic\">SimulatorStatusMagic<\/a>, <a href=\"https:\/\/github.com\/jessesquires\/nine41\">Nine41<\/a>, and <a href=\"https:\/\/docs.fastlane.tools\/actions\/snapshot\/\">fastlane snapshot<\/a> help make the process easier. However, on macOS there is much less support (and, sadly, demand) for automated tooling &mdash; so you are kind of on your own to figure it out. I spent some time recently solving this process for myself. I want to share how I have managed to automate perfect screenshots for the Mac App Store.<\/p><p>[&#8230;]<\/p><p>As of Xcode 9, <a href=\"https:\/\/developer.apple.com\/documentation\/XCUIAutomation\">Xcode UITest<\/a> allows you to <a href=\"https:\/\/developer.apple.com\/documentation\/xctest\/xcuiscreenshot\">capture screenshots<\/a> during tests. This is the API that fastlane uses under-the-hood for iOS. Again, because fastlane is not an option for macOS, you can implement this yourself. Xcode makes this process rather simple and easy. Here&rsquo;s a helper method that saves a screenshot.<\/p><p>[&#8230;]<\/p><p>The screenshots from XCUITest have ugly artifacts in the window corners. They are not correctly cropped and clipped with a transparent background, like when you take a screenshot via the built-in functionality in macOS.<\/p><p>[&#8230;]<\/p><p>Using Retrobatch, I created a workflow to round the corners. Through trial and error, I arrived at a corner radius of 24 points.<\/p><\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Jesse Squires: Meeting the requirements for screenshots is a frustrating experience. On iOS, tooling like SimulatorStatusMagic, Nine41, and fastlane snapshot help make the process easier. However, on macOS there is much less support (and, sadly, demand) for automated tooling &mdash; so you are kind of on your own to figure it out. I spent some [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2025-04-22T19:37:43Z","apple_news_api_id":"580b384d-a2a5-4e08-a643-1d2a4e966a96","apple_news_api_modified_at":"2025-04-22T19:37:44Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/AWAs4TaKlTgimQx0qTpZqlg","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[2],"tags":[30,39,2598,1669,282,226],"class_list":["post-47456","post","type-post","status-publish","format-standard","hentry","category-technology","tag-mac","tag-macappstore","tag-macos-15-sequoia","tag-retrobatch","tag-screenshots","tag-xcode"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/47456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=47456"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/47456\/revisions"}],"predecessor-version":[{"id":47457,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/47456\/revisions\/47457"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=47456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=47456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=47456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}