PWA Incident Report: Fixing iPhone's Mini UI, Breaking Android, and Fighting Unexpected Google Overlays

I only wanted to remove the small browser-style UI that appeared in a PWA on iPhone. That sounded like a simple Manifest adjustment. Instead, it became a cross-platform debugging puzzle

A 1-minute summary

I only wanted to remove the small browser-style UI that appeared in a PWA on iPhone. That sounded like a simple Manifest adjustment. Instead, it became a cross-platform debugging puzzle involving id, name, scope, and some unexpected interface elements on Android. The goal was to make a page-specific home screen app feel like an app on iOS without sacrificing the ability to install multiple pages from the same origin on Android. I changed Manifest settings and compared the results on actual devices. The problem was that a configuration that improved the iPhone experience could make Android treat separate pages as belonging to the same installed app. A Manifest's id identifies the installed application. name is a display label, not a substitute for a distinct identity. scope defines the app's navigation boundary.

Next to readHow to Add Any Website to Your Home Screen on iPhone and Android

Contents

I only wanted to remove the small browser-style UI that appeared in a PWA on iPhone. That sounded like a simple Manifest adjustment. Instead, it became a cross-platform debugging puzzle involving id, name, scope, and some unexpected interface elements on Android.

The experiment that started it all

The goal was to make a page-specific home screen app feel like an app on iOS without sacrificing the ability to install multiple pages from the same origin on Android.

I changed Manifest settings and compared the results on actual devices. The problem was that a configuration that improved the iPhone experience could make Android treat separate pages as belonging to the same installed app.

1P1A-EN

The suspects: id, name, and scope

A Manifest's id identifies the installed application. name is a display label, not a substitute for a distinct identity. scope defines the app's navigation boundary.

For a page-specific system such as 1P1A, these settings cannot be chosen independently of the installation goal. A broad scope may be desirable for iOS presentation, while Android app identity and duplicate-install behavior can make that same choice problematic.

The OS conflict

The practical requirement was contradictory:

That is why simply copying one Manifest across platforms was not the solution I wanted.

The workaround: deliver platform-specific Manifest settings

The experiment led me to split the Manifest behavior by user agent. The iOS version could include the scope needed for the desired presentation, while the Android version could omit or narrow it according to the page-installation design.

Conceptually:

JavaScript
const isIOS = /iPhone|iPad|iPod/.test(navigator.userAgent);
const manifestURL = isIOS ? '/manifest-ios.json' : '/manifest-android.json';
document.querySelector('link[rel="manifest"]').href = manifestURL;

This is an illustration of the branching strategy, not a drop-in replacement for the actual dynamically generated Manifests. It also requires testing because user-agent detection and browser behavior can change.

1P1A_EN

Then came the cache—and the unexpected UI

Even after the Manifest logic changed, an installed PWA could continue behaving as though it had old settings. Browser caching, installation metadata, and the operating system's stored app configuration complicate debugging.

On Android, I also encountered unexpected Google-related interface prompts and a bottom sheet that interfered with the clean presentation I was trying to create. The lesson was to distinguish UI injected by the platform from UI created by the page before attempting CSS fixes.

What this incident taught me

PWA behavior is not determined by a single Manifest property. App identity, navigation scope, installed metadata, browser UI, and caching interact. The only reliable way to understand a surprising result is to change one condition at a time and test it on both operating systems.

For 1P1A, the design target remains simple: let the user save a specific page as its own home screen entry without surprising them when they open it.

OJappTools-en

How to Add Any Website to Your Home Screen on iPhone and Android

Keep your favorite websites one tap away. Follow the iPhone and Android steps, and learn what to check when the icon or menu is not what you expected.

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