一周前让小伙伴尝试构建一个产品的 Web 版,当中使用到了 PWA 技术(Progressive Web Application)。这个产品原本计划就是主要针对 iOS 系统的,不过 PWA 本身是一个非系统特定的技术,因此并没有在一开始就主动排除在其他系统上的运行尝试。
当在一台 Android 设备(貌似是 OPPO A9s,Origin 3)上进行相关操作后,发现了一个有趣的现象。一个需要提前了解的信息是,从某个大版本的 Android 开始,拥有 install shortcut 权限的第三方 app 如果向桌面创建了新的快捷方式,该快捷方式的图标的右下角会自带一个创建者 app 的小图标,系统称之为 badge。似乎是为了向用户明确表明两个信息:第一,这是个快捷方式而非 app;第二,这个快捷方式的创建者是哪个 app。这种完全是工程师化的思维其实在用户那里并不受欢迎,事实上是,无数的用户都在搜索消除掉该 badge(可译为“徽章”)的方法。这是一个系统级别的限制,即便是浏览器创建 PWA 的快捷方式到桌面,也不能例外。
可是例外偏偏就发生了。就在上述提到的那台设备上,经由浏览器创建的一个快捷方式,一开始的时候,能够看到它的图标右下角带着 Chrome 的图标,神奇的是,过了几天后,那个“屈辱性”的 Chrome badge 竟然消失了!也就是说,它似乎被系统认可为一个 app 而不再仅仅是个快捷方式了!但它的几个兄弟姐妹快捷方式就无此殊荣。
三太爷已经接触 Android 系统有些年头了,一时也没想明白为何会出现此现象。只好求助 Grok,在其解释下才能够白其中缘由。AI 一般针对某个问题会给出几个可能的答案,而经过验证,可以确信准确的答案就是这个:
浏览器生成了 WebAPK
当你通过支持 PWA 的浏览器(如 Google Chrome 或 Samsung Internet)将 PWA 添加到主屏幕时,浏览器最初可能会创建一个带有浏览器角标的快捷方式。然而,如果设备支持 WebAPK(一种更原生的 Android 应用包),浏览器可能会在后台通过云端铸造服务器(minting server)生成 WebAPK 文件并替换原有的快捷方式。WebAPK 安装后,图标会呈现为原生应用的样式,不再带有浏览器角标,提供更接近原生应用的体验。
经过了解,这种 WebAPK 必须是具有 Google 移动服务(GMS)的设备才支持,并没有办法从其它切入点进行干预。这恐怕也是 Google 的 Android 霸权的一种体现。
一个 PWA 快捷方式,如何才能进化成功,转变为一个 WebAPK 安装后的 app,必须满足一定的标准,例如:
- 提供有效的
manifest.json文件,包含name、short_name、start_url和至少一个符合要求的图标(通常为 512×512 或更大的 PNG 图标,支持 maskable 图标以适配 Android 自适应图标)。 - 使用 HTTPS 协议。
- 注册了 Service Worker 以支持离线功能。
- 设置了
display属性为standalone或fullscreen。
示例 manifest.json:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[crayon-68ad7211e20b7544337074 inline="true" ]{ "name": "My PWA", "short_name": "PWA", "start_url": "/", "display": "standalone", "icons": [ { "src": "icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" } ], "background_color": "#ffffff", "theme_color": "#000000" } |
用户通过支持 WebAPK 的浏览器(如 Chrome)访问 PWA 网站,点击“添加到主屏幕”选项(通常在浏览器的“三点菜单”中),浏览器最初可能会创建一个带有浏览器角标的快捷方式。
重点来了:浏览器检测到 PWA 满足 WebAPK 要求后,会将 manifest.json 和其他元数据发送到 Google 的云端铸造服务器(WebAPK Minting Server)。服务器根据 PWA 的配置生成一个轻量级 APK 文件(WebAPK),并签名后返回给设备。设备静默安装这个 WebAPK,替换原有的快捷方式。新图标不再带有浏览器角标,看起来像原生应用。
你看,决定权完全在远端。事实上,变成了 WebAPK 的那个快捷方式,其目标 app 是 YouTube,正是 Google 自家的 app,而其它的几个就无此待遇了。
