Hours Lost to PWA Icons: The `any maskable` and `apple-touch-icon` Traps

I was trying to make a PWA icon look right on Android. Launchers can crop icons into circles, rounded squares, or other shapes, so I experimented with the Manifest's `purpose` property.

A 1-minute summary

I was trying to make a PWA icon look right on Android. Launchers can crop icons into circles, rounded squares, or other shapes, so I experimented with the Manifest's purpose property. That simple task turned into hours of testing. The purpose property describes how an icon can be used. any means a regular icon, while maskable indicates that the image is designed to survive launcher cropping. Combining both keywords can make one resource eligible for both uses. At first, that seemed like the simplest possible solution. With only maskable, Android could use the image as an adaptive icon, but the results were not consistently what I expected across devices and launchers. A separate regular icon use case can still matter.

Next to readWhy `any maskable` Alone May Not Be Enough for PWA Icons on Android and iPhone

Contents

I was trying to make a PWA icon look right on Android. Launchers can crop icons into circles, rounded squares, or other shapes, so I experimented with the Manifest's purpose property. That simple task turned into hours of testing.

My initial conclusion: any maskable looked like the answer

The purpose property describes how an icon can be used. any means a regular icon, while maskable indicates that the image is designed to survive launcher cropping.

JSON
{
  "src": "/icon.png",
  "sizes": "512x512",
  "type": "image/png",
  "purpose": "any maskable"
}

Combining both keywords can make one resource eligible for both uses. At first, that seemed like the simplest possible solution.

1P1A-EN

What happened when I used maskable alone

With only maskable, Android could use the image as an adaptive icon, but the results were not consistently what I expected across devices and launchers. A separate regular icon use case can still matter.

The key lesson was not that maskable is broken. It was that declaring an image maskable is a promise about its safe area, not an instruction to the operating system to display it at a particular size.

Then iPhone added another complication

On iOS, Safari may prioritize apple-touch-icon. A page-specific Manifest icon can therefore be ignored in favor of a shared touch icon, especially when the page is meant to have its own identity.

This becomes particularly noticeable with 1P1A (One Page. One App.), where different pages are intended to appear as different home screen entries.

Fixed icons and dynamic icons need different decisions

For a conventional site-wide app, a stable apple-touch-icon is usually sensible. For dynamically generated page icons, that same tag may get in the way unless it is updated to match the page before installation.

A practical Manifest can explicitly provide normal and maskable variants:

JSON
"icons": [
  { "src": "/icon-regular.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
  { "src": "/icon-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
]
1P1A_EN

What I learned

There is no universal icon configuration that guarantees identical appearance on iPhone and every Android launcher. The reliable approach is to understand what each platform may select, design the maskable safe area deliberately, and test the resulting home screen icon on real devices.

OJappTools-en

Why `any maskable` Alone May Not Be Enough for PWA Icons on Android and iPhone

I once thought that adding `purpose: "any maskable"` to a single Manifest icon was the perfect cross-platform solution. It is a valid declaration, but my real-device tests revealed an i

Ojach

Hi, I'm a solo web developer based in Japan.I'm the creator of One Page. One App. (1P1A), a page-first approach to Progressive Web Apps. I build WordPress plugins and web tools that make it easy to turn individual web pages into installable home screen apps.Most articles on this site are first written in Japanese and then translated into English. While the English may not always be perfect, every article is based on extensive real-device testing with iPhone, Android, Safari, Chrome, Web App Manifest, Service Workers, and modern PWA architecture.

← Back to articles