Installing a PWA on Android does more than just add the Progressive Web App to the user's Home Screen. Chrome automatically generates and installs a special APK of your app. We sometimes refer to this as a WebAPK. Being installed via an APK makes it possible for your app to show up in the app launcher, in Android's app settings and to register a set of intent filters.
To generate the WebAPK, Chrome looks at the web app manifest and other metadata. When an update to the manifest is detected, Chrome will need to generate a new APK.
Note: Since the WebAPK is regenerated each time an updated manifest is detected, we recommend changing it only when necessary. Don't use the manifest to store user specific identifiers, or other other data that might be customized. Frequently changing the manifest will increase the overall install time.
When a Progressive Web App is installed on Android, it will register a set of intent filters for all URLs within the scope of the app. When a user clicks on a link that is within the scope of the app, the app will be opened, rather than opening within a browser tab.
Consider the following partial manifest.json
:
When a web app using it is launched from the app launcher, it would open https://example.com/
as a standalone app, without any browser chrome.
The WebAPK would include the following intent filters:
If the user clicks on a link within an installed app to https://example.com/read
, it would be caught by the intent and opened in the Progressive Web App.
Note: Navigating directly to https://example.com/app/
from the address bar in Chrome will work exactly the same as it does for native apps that have an intent filter. Chrome assumes the user intended to visit the site and will open this site.
scope
to restrict intent filters #If you don't want your Progressive Web App to handle all URLs within your site, you can add the scope
property to your web app manifest. The scope
property tells Android to only open your web app if the URL matches the origin
+ scope
. It gives you control over which URLs will be handled by your app, and which should be opened in the browser. This is helpful when you have your app and other non-app content on the same domain.
Consider the following partial manifest.json
:
When launched from the app launcher, it would open https://example.com/app/
as a standalone app, without any browser chrome.
Like before, the generated WebAPK would include an intent filter, but with a different android:pathPrefix
attribute in the APK's AndroidManifest.xml
:
Let's take a look at a few examples:
See scope
for more information about scope
, what happens when you don't set it, and how you can use it to define the scope of your app.