WebToApp URL/Webpage 配置项详解:Target URL、PWA 分析与故障转移镜像
【免费下载链接】web-to-appThe most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone项目地址: https://gitcode.com/GitHub_Trending/web/web-to-app
本篇讲解 WebToApp「Edit Common Config(通用配置编辑)」中Basic info卡片顶部的URL / Webpage字段——它是所有 Web 类应用类型的核心字段,决定 WebView 要加载的目标网站。读完本文,你将了解该字段的配置方式、WEB类型专属的PWA 分析功能的完整工作机制(从 URL 归一化、manifest 抓取到 meta 标签降级),以及目标不可达时如何通过故障转移镜像 URL 兜底,并能结合仓库源码定位每一项行为对应的实现位置。
URL/Webpage 字段的位置与作用
URL / Webpage是目标 WebView 所加载的内容,是 Web 类应用类型的主字段。它位于 Edit Common Config 编辑器顶部的Basic info卡片中。打开方式:在应用卡片上点 ⋮,选择Edit Common Config(对 Web 应用,该入口直接叫Edit)。
当前该卡片下唯一的选项是:
- Target URL— 要加载的网站地址,例如
https://example.com。
需要注意的是「target(目标)」对不同应用类型含义不同:
- 对 Web 类类型,target 就是这个 URL;
- 对非 Web 类型(本地文件夹、项目、媒体等),target 是类型专属的源,在 Edit Core Config 中配置,而非本字段。
这一点在 Edit Common Config 总览 的提示中也明确区分:Basic info 等卡片存放的是所有应用共享的选项,类型专属的源/运行时配置一律归入 Edit Core Config。
PWA 分析(仅 WEB 类型)
对WEB应用,编辑器中的PWA analysis小节可以检查目标站点并检测 Progressive Web App / 离线缓存线索,帮助你决定离线策略。这一小节对应的 UI 是 CreateAppScreen.kt 中的PwaAnalysisSection组件,完整调用链为:
PwaAnalysisSection (UI) └─ MainViewModel.analyzePwa(editState.url) // 触发分析 └─ PwaAnalyzer.analyze(url) // Dispatchers.IO 上执行 └─ PwaAnalysisState.Success(result) └─ MainViewModel.applyPwaResult(result) // 用户确认后应用建议三个关键方法分别位于 MainViewModel.kt 的analyzePwa(L235)、applyPwaResult(L255)和resetPwaState(L349)。UI 侧通过viewModel.pwaAnalysisState.collectAsStateWithLifecycle()订阅分析状态;URL 为空或正在分析时按钮禁用,失败时以WtaStatusBanner展示错误,成功后弹出可「应用/关闭」的PwaResultCard。
分析流程与请求约束
核心实现是 PwaAnalyzer.kt 中的analyze()(L67)。它是一条严格的降级式流水线:
- URL 归一化(L126-L132):去除首尾空白;若不以
http://或https://开头,则自动补https://前缀。因此填example.com与https://example.com等价。 - 抓取 HTML(
downloadHtml,L159-L166):使用 OkHttp 拉取文档,约束条件包括- 超时:连接 10s、读 15s、整体调用 20s(L23-L25);
- 体积上限:HTML 最多 512 KB(
MAX_HTML_SIZE),manifest JSON 最多 256 KB(MAX_JSON_SIZE),通过readLimitedText分块限流读取,避免超大页面撑爆内存; - 请求头:Chrome 131 桌面 UA +
Accept-Language: en-US,...+ 禁用缓存 +Sec-Fetch-*语义头,模拟真实浏览器导航。 若 HTML 为空,直接返回pwaAnalyzeEmptyPage错误提示。
- 定位 manifest(
extractManifestUrl,L272-L299):- 先用两组正则从 HTML 中匹配
<link rel="manifest" href="...">(两种属性顺序都覆盖,大小写不敏感); - 若 HTML 中没有声明,则主动探测三个常见路径:
/manifest.json、/manifest.webmanifest、/site.webmanifest,哪个返回合法 JSON(以{开头)就用哪个; - 相对地址通过
resolveUrl(L134-L149)相对最终 URL(含重定向后的finalUrl)解析成绝对地址。
- 先用两组正则从 HTML 中匹配
- 解析 manifest(
parseManifest,L301-L335):提取name、short_name、start_url、scope、display、theme_color、background_color、icons、orientation、description、lang、dir,字段模型见 PwaModels.kt 中的PwaManifest/PwaIcon。图标选择策略(buildResultFromManifest,L337-L358):优先purpose含maskable的图标,其次按sizes中最大像素值降序,"any"视为无限大。 - meta 标签降级:若 manifest 未找到或下载失败,回退到
extractFromMetaTags(L360-L378),从 HTML 中提取theme-color、og:title、og:image、apple-touch-icon、<title>与 favicon(找不到时兜底为/favicon.ico)。只要抓到其中任一条,即视为弱 PWA 信号(isPwa = true),否则isPwa = false。
分析结果数据模型
结果封装在 PwaAnalysisResult:
| 字段 | 含义 |
|---|---|
isPwa | 是否检测到 PWA/离线线索 |
suggestedName | 建议应用名(short_name优先,其次name/og:title/<title>) |
suggestedIconUrl | 建议图标 URL |
suggestedThemeColor/suggestedBackgroundColor | 建议主题色/背景色,经过normalizeColor(L461-L504)统一为#RRGGBB大写,支持 3/6/8 位 hex、rgb()与常见命名色 |
suggestedDisplay/suggestedOrientation | manifest 中的展示模式与方向 |
startUrl/scope | 应用入口与可用范围 |
source | 数据来源:MANIFEST/META_TAGS/NONE(PwaDataSource枚举) |
errorMessage | 失败时的人类可读原因 |
PwaAnalysisState(Idle/Analyzing/Success/Error)驱动 UI 状态机。用户在结果卡上点「应用」后,MainViewModel.applyPwaResult(result)会把建议值回填到编辑状态(对应 App Name、App Icon 等字段)。
此外suggestDeepLinkHosts(L438-L454)会收集原始 URL、scope、startUrl的域名,并对每个域名生成带/不带www.两种变体,供深度链接域名配置参考。
错误处理细节
PwaAnalyzer把不同失败转成针对性提示(buildHttpErrorMessage/buildExceptionMessage,L235-L270),例如:
- HTTP 401/403 → 站点拒绝分析请求;429 → 站点限流;
- DNS 解析失败、连接/读取超时、TLS 握手失败均有独立文案;
- 对局域网地址的超时会给出专门的本地网络权限提示(借助
LocalNetworkPermission.isPrivateNetworkUrl判断)——源码注释说明 Android 16/17 的本地网络权限被拒时会表现为静默 TCP 超时。
行为验证可参考测试用例 PwaAnalyzerTest.kt 与 PwaModelsTest.kt。
故障转移镜像 URL(Failover)
当目标站点不可达时的自动兜底(failover mirror URLs)不属于本卡片,而是配置在 Advanced Settings 的Failover项:failoverEnabled(开关)、failoverUrls(镜像列表)、failoverTimeoutSeconds(触发超时)。也就是说:Target URL 决定「加载什么」,Failover 决定「加载不了时换什么」。
小结与延伸阅读
| 你想知道的 | 去哪里 |
|---|---|
| Target URL 字段(本文主体) | url-webpage 文档 |
| 编辑器全部卡片总览 | Edit Common Config |
| 非 Web 类型的 target 配置 | Edit Core Config |
| Failover 镜像 URL | Advanced Settings |
| PWA 分析实现 | PwaAnalyzer.kt、PwaModels.kt |
| 分析结果 UI | CreateAppScreen.kt |
| 单元测试 | core/pwa 测试 |
【免费下载链接】web-to-appThe most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone项目地址: https://gitcode.com/GitHub_Trending/web/web-to-app
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考