Appbot Logo

A/B testing app icons in App Store Connect with Product Page Optimizations

Published 24th July, 2024 by Stuart Hall A/B testing app icons in App Store Connect with Product Page Optimizations diagram App Store Connect has great A/B testing capabilities for screenshots and icons. Testing screenshots is very straightforward, but icons take a bit more work. It wasn't obvious to me how to get it all setup, so I've written out the process for future me and hopefully to help others.

What we cover:

Monitor Icon

Want to monitor & track your app reviews?

Try Appbot free now, no credit card needed →

Adding The Icons To Your Assets

When you want to A/B test your screenshots you can simply add the screenshots to App Store Connect and start the test. If you want to A/B test icons, however, you need to add them as assets and submit a new build. So it's a bit more effort than screenshots, but still not too hard!

Obviously, first you need to add all the icons to you your Asset file. Pretty easy, just drag them in and give them unique names. I like to prefix them all with "AppIcon-" and call the default icon "AppIcon-Default", but dealers choice!

Icon Assets

Configuring Your Build Settings

Now you need to let the project know they are icons, and which is which.

  1. Locate "Build Settings" for your target
  2. Search for "icon" in the top right
  3. Set "Primary App Icon Set Name" to the default icon your added above. What I usually call "AppIcon-Default"
  4. Set "Include All App Icon Sets" to "Yes" so all the icons are included in the final build.
  5. Add all of your alternative icons to "Alternative App Icon Sets".
Icon Assets

Add a Screen to Change Icons

This is a totally optional step, but I like to add a screen so the user can pick the icon. If you just want to A/B test then you can skip this :)

Icon Assets

Here's some example SwiftUI code for the screen above, obviously you'll need to swap out the icons for your own names.

import SwiftUI

struct IconSelectionView: View {
    private static let defaultIcon = "AppIcon-Default"
    
    let iconNames: [(name: String, displayName: String)] = [
        (name: defaultIcon, displayName: "Default"),
        (name: "AppIcon-Cake", displayName: "Cake"),
        (name: "AppIcon-Birthday Text", displayName: "Birthday Text"),
        (name: "AppIcon-Popper", displayName: "Popper")
    ]
    @State private var currentIconName: String = UIApplication.shared.alternateIconName ?? defaultIcon
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        NavigationView {
            VStack {
                List(iconNames, id: \.name) { icon in
                    IconRow(icon: icon, currentIconName: $currentIconName, setAppIcon: setAppIcon)
                }
                Spacer()
            }
            .navigationTitle("Select Icon")
            .navigationBarItems(trailing: Button("Close") {
                presentationMode.wrappedValue.dismiss()
            })
        }
    }

    private func setAppIcon(to iconName: String) {
        guard UIApplication.shared.supportsAlternateIcons else { return }

        UIApplication.shared.setAlternateIconName(iconName == IconSelectionView.defaultIcon ? nil : iconName) { error in
            if let error = error {
                print("Error setting icon: \(error.localizedDescription)")
            } else {
                self.currentIconName = iconName
            }
        }
    }
}

struct IconRow: View {
    let icon: (name: String, displayName: String)
    @Binding var currentIconName: String
    let setAppIcon: (String) -> Void

    var body: some View {
        if let uiIcon = UIImage(named: icon.name) {
            Button(action: { setAppIcon(icon.name) }) {
                HStack {
                    Image(systemName: currentIconName == icon.name ? "checkmark.circle.fill" : "circle")
                        .padding(.trailing, 10)
                    Image(uiImage: uiIcon)
                        .resizable()
                        .frame(width: 50, height: 50)
                        .cornerRadius(10)
                        .padding(.trailing, 10)
                    Text(icon.displayName)
                    Spacer()
                }
                .padding()
            }
        }
    }
}

struct IconSelectionView_Previews: PreviewProvider {
    static var previews: some View {
        IconSelectionView()
    }
}

Submit Your Build

Now you'll need to archive and submit a new version of your app like you would for any update. I'm going to assume you know how to do this step :)

When you choose the build in App Store Connect the default icon should appear like below.

Uploaded Icon

If you click on it you should be able to screen through your alternative icons. If you can then you have succeeded!

Alternative Icons

Create the Product Page Optimization

Once the version is approved you are ready to setup the optimization / a/b test.

  1. Choose Product Page Optimization from the side menu of App Store Connect.
  2. Give the test a Reference Name, e.g. "Icon Test".
  3. Choose the number of treatments. So if you want to test your original and 1 other icon, choose 1 here.
  4. Traffic proportion I just leave with their recommendation.
Alternative Icons

On the next screen select "Icon" and then select the alternative icons to test.

Test Setup

You're done!

The Results

After a few days you'll start seeing results trickling in. Depending on how many impressions you get for your app, it might take a while to get meaningful results. Below are some results for my app WordBoard. I definitely recommend not testing as many icons as I have below!

Icons TestedIcons Tested Results

Conclusion

Testing icons can be fun, and rewarding! However, they do take a bit of setup. I hope you found this useful to start your testing. Let me know how you go!

Monitor Icon

Want to monitor & track your app reviews?

Try Appbot free now, no credit card needed →

Where to from here?

  • Explore the strategies employed by top grossing apps and learn how to achieve success.
  • Master the art of writing an irresistible app store description that captures attention and drives downloads.
  • Reply to app store reviews on the Apple and Google Play stores for happier customers and better star ratings.
  • Dive into the secrets of creating addictive apps that keep users hooked and coming back for more.


About The Author

stu

Stuart is Co-founder & Co-CEO of Appbot. Stuart has been involved in mobile as a developer, blogger and entrepreneur since the early days of the App Store. He built the 7 Minute Workout app in one night and blogged the story of growing the app to 2.3 million downloads before exiting to a large fitness device company. Previously he was the co-founder of the Discovr series of applications which achieved over 4 million downloads. You can connect with him on LinkedIn.


Enjoying the read? You may also like these

App pricing strategy 101: Roadmap to pricing your app App pricing strategy 101: Roadmap to pricing your app

Whether you're launching a new app or looking to optimize an existing one, this guide will empower you to level up your app's profitability.

Switching to app store subscriptions

Are App Store subscriptions better than one-off in-app purchases? Read about our subscription pricing experiments to the first $1k in MRR.

Prompting for app reviews and ratings on iOS and Android

Want to learn WHEN to prompt an app review? See our advice after talking to thousands of mobile app developers on best techniques for IOS and Android apps.

Feedback driven growth: A process for sustainable growth

Your app or game name is one of the most difficult, but also most important, decisions you will make.

Ready to better understand your apps?

Quick setupFree for 14 daysNo credit card required