在受信任網路活動中啟用網路分享目標

安德烈西普里亞尼班達拉
André Cipriani Bandarra

「網路分享目標」可讓 PWA 接收裝置上安裝的其他應用程式共用內容。例如圖片編輯器等應用程式可接收相機應用程式的圖片,或是社交網路用於接收要分享的圖片或影片。

從 Chrome 86 版開始,採用受信任網路活動的應用程式也能使用網路分享目標。雖然 PWA 應該立即可用,但 Android 應用程式需要進行一些變更。

本文假設開發人員熟悉 Trusted Web Activities。剛接觸技術的讀者請參閱「整合指南」。

上述程式碼也將完整說明 PWA 中的網路分享目標實作方式,但是開發人員可參閱這篇文章瞭解詳情。

系統會將 https://scrapbook-pwa.web.app/ 的試用版應用程式用做本文的 PWA,而其原始碼可於 GitHub 取得,Android 應用程式則以基本信任網路活動示範為基礎。

在 Android 應用程式中新增網頁分享目標

如要修改以「Trusted Web Activity」為基礎的現有應用程式並實作網路分享目標,您必須修改三個不同檔案:

build.gradle

android-browser-helper 程式庫經過更新,可支援網路共用目標。第一步是更新應用程式,改用大於或等於 2.0.1 的版本。

dependencies {
    ...
    implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0'
}

res/strings.xml

應用程式必須向受信任的網路活動告知其支援共用機制的詳細資料,例如要開啟的網址、使用的方法和支援的 MIME 類型。

這是透過 JSON 完成,並提供字串資源給「Trusted Web Activity」使用。這些欄位與網路資訊清單中提供的 share_target 欄位相同,且可照原樣加進 strings.xml 內的字串,但有兩則重要注意事項:

  1. 動作屬性的值必須為完整網址,包括來源。
  2. 必須逸出雙引號,因此每個 " 都會變為 \"

https://scrapbook-pwa.web.app/manifest.jsonshare_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 已宣告、匯出及啟用。

根據基本示範內容建構應用程式的開發人員已隨附這項服務,標記應位於應用程式標記中,如下所示:

<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 活動標記中加入兩個新項目: - 參照 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 元素。

結語

「網路分享目標」整合功能可讓信任網路活動中的 PWA,與 Android 裝置上安裝的其他應用程式進一步整合。

如上述步驟所述,在使用「Trusted Web Activity」的既有 Android 應用程式中,新增 API 支援功能所需的額外標記,由 android-browser-helper 簡化。

請參閱網頁分享目標一文,進一步瞭解如何在 PWA 上使用 API 和 Web Share API,瞭解如何透過漸進式網頁應用程式共用內容。

疑難排解

當我嘗試透過其他應用程式分享檔案時,應用程式並未顯示這個選項。

如果應用程式未顯示為選項,表示 intent-filter 不正確。仔細檢查 intent-filter 標記,確認其中包含應用程式處理的正確動作、類別和 mime-types

我的應用程式顯示為選項,PWA 已啟動,但資料不會分享。

造成這種情況的原因如下:請參考以下檢查清單:

  • 確認 Digital Asset Links 驗證成功。
  • 請檢查 string.xml 中的 JSON 是否正確無誤。