Framing your App Store screenshots greatly improves your store listing. But doing it manually takes hours away from perfecting your app. Instead, here's how you automate the process of adding device frames and text to your screenshots.
Automate Screenshot Framing with Text Using Fastlane
Written by
In my last post, I shared how to generate localized screenshots of an app through the use of UI testing and Fastlane. Let's get our screenshots ready for the App Store with this step-by-step guide on how you add device frames, localized text and a background to each of them - everything automated with Fastlane frameit.
I hope you're ready to not ever using Photoshop to frame your screenshots again? This might get you extremely productive - proceed with caution!
Initializing Fastlane frameit
The first thing you need to do is to install Fastlane if you haven't already. Open your terminal and run this command: sudo gem install fastlane -NV
.
We'll be working with frameit which depends on ImageMagick, so we need that as well: brew install imagemagick
.
Framing screenshots
When you generate your screenshots using Fastlane, as demonstrated in the last post, you end up with a folder called "screenshots" containing subfolders with screenshots inside for all the languages that you support. It looks like this:
That is our starting point. To add frames to your screenshots, open the terminal, navigate to the directory containing the screenshots and run fastlane frameit
. You can also add silver frames instead of space gray frames by running fastlane frameit silver
.
What happens is that frameit looks for screenshots inside the directory with names matching its supported devices. It then creates framed versions of those screenshots.
Now, that's how you add frames to your screenshots. Let's build on this by adding text and a background to our screenshots.
Text and background
We can easily add a background and text below or above the framed screenshots in fonts and colors that we define. The magic behind this all starts in a Framefile.json where we define general and screenshot specific information. Create this at the top of the "screenshots" folder. It could look like this:
{ "default": { "keyword": { "fonts": [ { "font": "./fonts/BebasNeue-Regular.ttf", "supported": ["en-US"] } ], "color": "#000000" }, "title": { "fonts": [ { "font": "./fonts/BebasNeue-Regular.ttf", "supported": ["en-US"] } ], "color": "#FFFFFF" }, "background": "./background.jpg", "padding": 50 }, "data": [ { "filter": "AllCards" }, { "filter": "CreateCard" }, { "filter": "Presentation" }, { "filter": "DarkMode" } ] }
In here, we define colors and fonts for text in our screenshots, more specifically keywords and titles. We also provide a path to a background image to be used. The data key contains screenshot specific properties which is related to keywords and titles.
The result of this is a screenshot that looks like this:
Here, we see that the keyword is "CUE CARDS" and the title is "PREPARE THEM ON THE GO" using our defined font and colors. We also see that a nice blue background image was added.
Keywords and titles
Adding keywords and titles to screenshots is done using the data key that specifies screenshot specific properties. The filter property inside of data is used to link keywords and titles with screenshots. An example from Fastlane docs:
If a screenshot is named
iPhone 8-Brainstorming.png
you can use valueBrainstorming
forfilter
. If there are more than onefilter
matching an entry, they will all be applied in order (which means that the last one has the highest precedence). All other keys from that array element will only be applied on this specific screenshot.
So basically, provide a filter property for every screenshot of your app (disregarding all variations of different screen sizes and languages). Now you just need to provide the specific text strings to be used. Inside each of the different languages subfolders, we create a keyword.strings and title.strings file with text specific to the language and screenshot.
Here's an example of the keyword.strings file:
"AllCards" = "CUE CARDS"; "CreateCard" = "FAST AND EASY"; "Presentation" = "PRESENT IT"; "DarkMode" = "DARK MODE";
The title.strings could look like this:
"AllCards" = "Prepare Them On The Go"; "CreateCard" = "Think Content, Not Layout"; "Presentation" = "With Timer To Guide You"; "DarkMode" = "Choose Your Preference";
This is all there is to keywords and titles. That leaves us with a file structure looking like this:
Go ahead and run fastlane frameit
at the top of the directory containing the screenshots. This time, frameit will look at the screenshot information we provided in Framefile.json and generate nicely looking framed screenshots ready for the App Store.
Optional: iPad Pro (12.9-inch) (3rd generation) support
Fastlane is currently missing support for iPad Pro (12.9-inch) 3rd gen. If you plan on using that, I suggest that you take a look at this GitHub issue. As a workaround right now, you can manually add support by running:
// fetch missing device frames curl https://user-images.githubusercontent.com/24507532/66273840-689ba700-e880-11e9-95e6-7ecb63728b2c.png -o ~/.fastlane/frameit/latest/Apple\ iPad\ Pro\ \(12.9-inch\)\ \(3rd\ generation\)\ Space\ Gray.png curl https://user-images.githubusercontent.com/24507532/66273839-66394d00-e880-11e9-85cf-50f4dc0210c5.png -o ~/.fastlane/frameit/latest/Apple\ iPad\ Pro\ \(12.9-inch\)\ \(3rd\ generation\)\ Silver.png // update device offset sed -i '' -e '$ d' ~/.fastlane/frameit/latest/offsets.json sed -i '' -e '$ d' ~/.fastlane/frameit/latest/offsets.json cat >> ~/.fastlane/frameit/latest/offsets.json <<EOL , "iPad Pro (12.9-inch) (3rd generation)": { "offset": "+200+200", "width": 2048 } } } EOL
Conclusion
That's it! Fastlane frameit will save you a lot of time after you finish the setup. A complete example of generating screenshots and framing them can be found in the source code for my app called QCards on GitHub.
Stay tuned for future posts like this one about automating your workflow!
Share this post
Facebook
Twitter
LinkedIn
Reddit
You may also like
Automation
iOS Continuous Integration Using Travis CI and Fastlane
Continuous Integration (CI) is a powerful practice to keep any app in a stable state throughout its development. Here’s how you set up CI for iOS apps to automatically perform code validation and testing whenever your code changes.
Automation
The Ten Commandments of iOS Development
Here’s a set of key principles to guide you to do iOS development according to best practices. They are all about the bigger picture of iOS development, including processes and architecture decisions – not simply language specific challenges.
DevOps
3 EAS Pipelines for Deploying React Native Apps in Teams
One of the best ways to increase productivity in a react native project is to automate the process of deploying builds you want to share internally in your team or with actual costumers via the app store. And you might be surprised at how easy it can actually be implemented when you have the right set of tools like GitHub Actions and EAS.