网络共享目标使 PWA 能够接收来自设备上安装的其他应用的共享内容。例如,图片编辑器等应用可以使用此功能从相机应用接收图片,或者社交网络可用于接收图片或视频以进行分享。
从 Chrome 86 开始,使用 Trusted Web Activity 的应用现在也可以使用网络共享目标。虽然 PWA 应该可以直接使用,但仍需对 Android 应用进行一些更改。
本文假设开发者熟悉 Trusted Web Activity。刚接触该技术的读者可以开始参阅集成指南。
同样,我们对于在 PWA 中实现网络共享目标的完整说明超出了范围,开发者可以在这篇文章中找到更多信息。
本文中的演示应用(网址为 https://scrapbook-pwa.web.app/)将用作本文的 PWA,其源代码可在 GitHub 上找到,Android 应用则基于基本 Trusted Web Activity 演示。
将 Web Share Target 添加到 Android 应用
若要修改基于 Trusted Web Activity 的现有应用来实现网络共享目标,需要修改以下三个不同文件:
build.gradle
android-browser-helper 库进行了更新,现在支持网络共享目标。首先,请更新应用以使用不低于 2.0.1 的版本。
dependencies {
...
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0'
}
res/strings.xml
应用需要告知 Trusted Web Activity 其支持接收的共享的详细信息,例如要打开哪些网址、要使用的方法以及支持的 MIME 类型。
这是通过 JSON 完成的,该 JSON 可通过字符串资源提供给 Trusted Web Activity。这些字段与网络清单中提供的 share_target
字段相同,可以几乎按原样添加到 strings.xml
内的字符串中,但有两点重要注意事项:
- action 属性的值必须是包含源的完整网址。
- 双引号必须转义,因此每个
"
都会变为\"
。
https://scrapbook-pwa.web.app/manifest.json 的 share_target
部分将如下所示:
{
...
"share_target": {
"action": "/_share-target",
"enctype": "multipart/form-data",
"method": "POST",
"params": {
"files": [{
"name": "media",
"accept": [
"audio/*",
"image/*",
"video/*"
]
}]
}
},
...
}
并且新的字符串元素将如下所示:
<string name="share_target">
{
\"action\": \"https://twa-web-scrapbook.web.app/_share-target\",
\"method\": \"POST\",
\"enctype\": \"multipart/form-data\",
\"params\": {
\"files\": [{
\"name\": \"media\",
\"accept\": [\"image/*\", \"audio/*\", \"video/*\"]
}]
}
}
</string>
AndroidManifest.xml
需要对 Android 清单进行几项更改。首先,我们需要确保已声明、导出并启用 DelegationService
。
根据基本演示构建应用的开发者已经包含该服务,并且标记应该位于 application 标记内,如下所示:
<service
android:name="com.google.androidbrowserhelper.trusted.DelegationService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
最后,需要向 LauncherActivity activity 标记添加两个新项:
- 引用 strings.xml 中定义的 JSON 的 meta-data
标记。
- 一个 intent-filter
,用于声明应用能够为设备上的其他应用处理哪些 MIME 类型。
<meta-data
android:name="android.support.customtabs.trusted.METADATA_SHARE_TARGET"
android:resource="@string/share_target"/>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="audio/*" />
<data android:mimeType="image/*" />
<data android:mimeType="video/*" />
</intent-filter>
如以上标记所示,应为 share_target
JSON 中声明的每个 mime-type
添加一个 data
元素。
总结
借助 Web Share Target 集成,Trusted Web Activity 中的 PWA 可以与 Android 设备上安装的其他应用进行更深入的集成。
如上述步骤中所述,android-browser-helper 可简化在使用 Trusted Web Activity 的现有 Android 应用中添加对 API 的支持所需的其他标记。
请参阅“网络共享目标”一文,详细了解如何在 PWA 中使用该 API;以及如何在 Web Share API 中共享渐进式 Web 应用中的内容。
问题排查
当我尝试通过其他应用共享文件时,我的应用未显示为选项。
如果应用没有作为选项显示,则表示 intent-filter
不正确。仔细检查 intent-filter
标记,确保其包含应用处理的正确操作、类别和 mime-types
。
我的应用显示为选项,表示 PWA 已启动,但数据未共享。
导致这种情况的原因可能有多种。以下是需要注意的事项的核对清单:
- 确保 Digital Asset Links 验证成功。
- 检查 strings.xml 内的 JSON 是否正确无误。