فعال کردن Web Share Target در Trusted Web Activity

قابلیت Web Share Target به PWAها این امکان را می‌دهد که محتوای اشتراک‌گذاری‌شده را از سایر برنامه‌های نصب‌شده روی دستگاه دریافت کنند. این ویژگی می‌تواند توسط برنامه‌هایی مانند ویرایشگرهای تصویر برای دریافت تصویر از برنامه دوربین یا یک شبکه اجتماعی برای دریافت تصویر یا ویدیو برای اشتراک‌گذاری استفاده شود.

با شروع کروم ۸۶، قابلیت Web Share Target اکنون برای برنامه‌هایی که از Trusted Web Activity استفاده می‌کنند نیز در دسترس است. در حالی که این PWA باید به طور خودکار کار کند، چند تغییر در برنامه اندروید مورد نیاز است.

این مقاله فرض می‌کند که توسعه‌دهنده با فعالیت‌های وب قابل اعتماد (Trusted Web Activities) آشنا است. خوانندگانی که با این فناوری تازه‌کار هستند می‌توانند با راهنمای یکپارچه‌سازی (Integration Guide) شروع کنند.

در همین راستا، توضیح کامل پیاده‌سازی Web Share Target در یک PWA خارج از محدوده این مقاله است و توسعه‌دهندگان می‌توانند اطلاعات بیشتری را در این مقاله بیابند.

اپلیکیشن آزمایشی در آدرس https://scrapbook-pwa.web.app/ به عنوان PWA برای این مقاله استفاده خواهد شد و کد منبع آن در GitHub موجود است و اپلیکیشن اندروید بر اساس نسخه آزمایشی اولیه Trusted Web Activity ساخته شده است.

افزودن Web Share Target به اپلیکیشن اندروید

برای تغییر یک برنامه مبتنی بر فعالیت وب قابل اعتماد موجود برای پیاده‌سازی هدف اشتراک‌گذاری وب، تغییرات در سه فایل مختلف مورد نیاز است:

ساخت.gradle

کتابخانه android-browser-helper با پشتیبانی از Web Share Target به‌روزرسانی شده است. به عنوان اولین قدم، برنامه را به‌روزرسانی کنید تا از نسخه‌ای بالاتر یا مساوی ۲.۰.۱ استفاده کند.

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

res/strings.xml

برنامه باید جزئیات اشتراک‌گذاری پشتیبانی‌شده توسط خود را به Trusted Web Activity اطلاع دهد، مانند اینکه کدام URLها را باز کند، از چه روشی استفاده کند و از چه نوع mimeهایی پشتیبانی کند.

این کار از طریق یک JSON انجام می‌شود که با یک منبع رشته‌ای در اختیار Trusted Web Activity قرار می‌گیرد. این فیلدها مشابه فیلد share_target موجود در Web Manifest هستند و می‌توانند تقریباً به همان شکل فعلی به یک رشته درون strings.xml اضافه شوند، البته با دو نکته مهم:

  1. مقدار ویژگی action باید آدرس کامل URL، شامل مبدا، باشد.
  2. نقل قول‌های دوتایی باید escape شوند، بنابراین هر " تبدیل به \" می‌شود.

بخش share_target در https://googlechrome.github.io/samples/scrapbook-pwa/manifest.json به این شکل است:

{
  ...
  "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

چند تغییر در Manifest اندروید مورد نیاز است. ابتدا باید مطمئن شویم که 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 اضافه شوند: - یک تگ meta-data که به JSON تعریف شده در strings.xml اشاره می‌کند. - یک intent-filter که اعلام می‌کند برنامه قادر به مدیریت کدام mime-typeها برای سایر برنامه‌های روی دستگاه است.

<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>

همانطور که در کد بالا مشاهده می‌شود، برای هر mime-type که در share_target JSON اعلام شده است، باید یک عنصر data اضافه شود.

نتیجه‌گیری

ادغام Web Share Target به PWAهای درون یک Trusted Web Activity این امکان را می‌دهد که عمیق‌تر با سایر برنامه‌های نصب شده روی دستگاه اندروید ادغام شوند.

همانطور که در مراحل بالا توضیح داده شد، نشانه‌گذاری اضافی مورد نیاز برای افزودن پشتیبانی از API در یک برنامه اندروید موجود که از Trusted Web Activity استفاده می‌کند، توسط android-browser-helper ساده‌تر شده است.

برای کسب اطلاعات بیشتر در مورد استفاده از API در PWA، مقاله Web Share Target و برای یادگیری نحوه اشتراک‌گذاری محتوا از برنامه وب پیش‌رونده، مقاله Web Share API را بررسی کنید.

عیب‌یابی

وقتی سعی می‌کنم فایلی را از برنامه‌ی دیگری به اشتراک بگذارم، برنامه‌ی من به عنوان یک گزینه نمایش داده نمی‌شود.

وقتی برنامه به عنوان یک گزینه نمایش داده نمی‌شود، این نشان می‌دهد که intent-filter نادرست است. نشانه‌گذاری intent-filter را دوباره بررسی کنید، مطمئن شوید که شامل اقدامات، دسته‌بندی و mime-types صحیحی است که توسط برنامه مدیریت می‌شوند.

برنامه من به عنوان یک گزینه نشان داده می‌شود، PWA شروع شده است، اما داده‌ها به اشتراک گذاشته نمی‌شوند.

چند چیز می‌تواند باعث این شود. در اینجا لیستی از مواردی که باید بررسی شوند، آورده شده است:

  • اطمینان حاصل کنید که اعتبارسنجی پیوندهای دارایی دیجیتال موفقیت‌آمیز است.
  • JSON داخل strings.xml را از نظر صحت بررسی کنید.