Web Share Target umożliwia aplikacjom PWA odbieranie udostępnionych treści z innych aplikacji zainstalowanych na urządzeniu. Ta funkcja może być używana np. przez aplikacje takie jak edytory obrazów, które mogą odbierać obrazy z aplikacji aparatu, lub przez sieci społecznościowe, które mogą odbierać obrazy lub filmy do udostępniania.
Od Chrome 86 funkcja Web Share Target jest dostępna również w aplikacjach korzystających z zaufanej aktywności internetowej. Aplikacja PWA powinna działać od razu, ale w aplikacji na Androida trzeba wprowadzić kilka zmian.
W tym artykule zakładamy, że deweloper zna zaufaną aktywność internetową. Osoby, które dopiero zaczynają korzystać z tej technologii, mogą zapoznać się z przewodnikiem po integracji.
Podobnie pełne wyjaśnienie implementacji Web Share Target w aplikacji PWA wykracza poza zakres tego artykułu, ale deweloperzy mogą znaleźć więcej informacji w tym artykule.
W tym artykule jako aplikację PWA będziemy używać aplikacji demonstracyjnej dostępnej pod adresem https://scrapbook-pwa.web.app/, a jej kod źródłowy jest dostępny na GitHub. Aplikacja na Androida jest oparta na podstawowej wersji demonstracyjnej zaufanej aktywności internetowej.
Dodawanie Web Share Target do aplikacji na Androida
Aby zmodyfikować istniejącą aplikację opartą na zaufanej aktywności internetowej i zaimplementować Web Share Target, trzeba wprowadzić zmiany w 3 różnych plikach:
build.gradle
Biblioteka android-browser-helper została zaktualizowana o obsługę Web Share Target. W pierwszym kroku zaktualizuj aplikację, aby używała wersji 2.0.1 lub nowszej.
dependencies {
...
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0'
}
res/strings.xml
Aplikacja musi przekazać zaufanej aktywności internetowej szczegóły dotyczące udostępniania, które obsługuje, np. adresy URL do otwierania, metodę, która ma być używana, oraz obsługiwane typy MIME.
Odbywa się to za pomocą pliku JSON, który jest udostępniany zaufanej aktywności internetowej za pomocą zasobu ciągu znaków. Pola są takie same jak pole share_target dostępne w manifeście aplikacji internetowej i można je dodać do ciągu znaków w pliku strings.xml niemal w niezmienionej postaci, z 2 ważnymi uwagami:
- Wartość atrybutu action musi być pełnym adresem URL, w tym pochodzeniem.
- Cudzysłowy muszą być poprzedzone znakiem ucieczki, więc każdy znak
"musi zostać zastąpiony znakiem\".
Tak wygląda sekcja share_target w pliku 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/*"
]
}]
}
},
...
}
Nowy element ciągu znaków będzie wyglądać tak:
<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
W manifeście Androida trzeba wprowadzić kilka zmian. Najpierw musimy się upewnić, że element DelegationService jest zadeklarowany, wyeksportowany i włączony.
Deweloperzy, którzy utworzyli aplikację na podstawie podstawowej wersji demonstracyjnej, będą już mieli ten element włączony, a kod powinien znajdować się w tagu aplikacji i wyglądać tak:
<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>
Na koniec do tagu aktywności LauncherActivity trzeba dodać 2 nowe elementy:
- tag meta-data, który odwołuje się do pliku JSON zdefiniowanego w pliku strings.xml.
- intent-filter, który deklaruje, jakie typy MIME aplikacja może obsługiwać w innych aplikacjach na urządzeniu.
<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>
Jak widać w powyższym kodzie, dla każdego elementu mime-type zadeklarowanego
w pliku JSON share_target należy dodać element data.
Podsumowanie
Integracja Web Share Target umożliwia głębszą integrację aplikacji PWA w zaufanej aktywności internetowej z innymi aplikacjami zainstalowanymi na urządzeniu z Androidem.
Jak opisano w powyższych krokach, dodatkowy kod potrzebny do dodania obsługi interfejsu API w istniejącej aplikacji na Androida, która korzysta z zaufanej aktywności internetowej, jest upraszczany przez bibliotekę android-browser-helper.
Więcej informacji o korzystaniu z interfejsu API w aplikacji PWA znajdziesz w artykule Web Share Target, a o udostępnianiu treści z progresywnej aplikacji internetowej – w artykule Web Share API.
Rozwiązywanie problemów
Gdy próbuję udostępnić plik z innej aplikacji, moja aplikacja nie jest wyświetlana jako opcja.
Jeśli aplikacja nie jest wyświetlana jako opcja, oznacza to, że element intent-filter jest nieprawidłowy. Sprawdź kod intent-filter i upewnij się, że zawiera on prawidłowe działania,
kategorię i mime-types obsługiwane przez aplikację.
Moja aplikacja jest wyświetlana jako opcja, aplikacja PWA jest uruchamiana, ale dane nie są udostępniane.
Może to być spowodowane kilkoma przyczynami. Oto lista rzeczy, które warto sprawdzić:
- Upewnij się, że weryfikacja Digital Asset Links zakończyła się pomyślnie.
- Sprawdź, czy plik JSON w pliku strings.xml jest prawidłowy.