Niech Twoja PWA przypomina aplikację

Opublikowano: 15 czerwca 2020 r.

Gdy grasz w bingo z hasłami związanymi z progresywnymi aplikacjami internetowymi, możesz śmiało postawić na „PWA to tylko strony internetowe”. Dokumentacja firmy Microsoft dotycząca aplikacji PWA potwierdza, że tak jest, a także osoby nominujące aplikacje PWA, czyli Frances Berriman i Alex Russell. Tak, aplikacje PWA to tylko witryny, ale są czymś więcej. Jeśli PWA zostanie prawidłowo wdrożona, nie będzie wyglądać jak strona internetowa, ale jak prawdziwa aplikacja.

Co to jednak oznacza?

Weźmy na przykład aplikację Podcasty od Apple. Jest dostępna na komputerach z macOS oraz na urządzeniach mobilnych z iOS (i iPadOS). Podcasty to aplikacja multimedialna, ale podstawowe koncepcje, które ilustruję za jej pomocą, mają zastosowanie również do innych kategorii aplikacji.

iPhone i MacBook obok siebie, na obu urządzeniach uruchomiona aplikacja Podcasty.
Apple Podcasts na iPhonie i w systemie macOS (źródło).

Możliwość działania w trybie offline

Zastanów się, jakie aplikacje na poszczególne platformy masz na telefonie komórkowym lub komputerze. Jedno jest pewne: zawsze możesz z niej korzystać. W aplikacji Podcasty, nawet gdy jestem offline, zawsze jest coś do zrobienia lub zobaczenia. Gdy nie ma połączenia z siecią, aplikacja nadal się otwiera. Sekcja Najpopularniejsze nie wyświetla żadnych treści, ale zamiast tego pojawia się komunikat Nie można teraz nawiązać połączenia wraz z przyciskiem Spróbuj ponownie.

Gdy nie ma połączenia z siecią, w aplikacji Podcasty wyświetla się komunikat „Nie można teraz nawiązać połączenia”.

Zrób to w internecie

Aplikacja Podcasty jest zgodna z tzw. modelem powłoki aplikacji. Wszystkie statyczne treści potrzebne do wyświetlenia głównej aplikacji są buforowane lokalnie, w tym dekoracyjne obrazy, takie jak ikony menu po lewej stronie i ikony interfejsu głównego odtwarzacza. Treści dynamiczne, takie jak dane z najpopularniejszych list, są ładowane tylko na żądanie. W przypadku niepowodzenia ładowania dostępne są lokalnie buforowane treści zastępcze. Przeczytaj artykuł Model powłoki aplikacji, aby dowiedzieć się, jak zastosować ten model architektury w swojej aplikacji internetowej.

Treści offline są dostępne, a multimedia można odtwarzać

Gdy jestem offline, w lewym panelu mogę przejść do sekcji Pobrane i odtwarzać pobrane odcinki podcastów, które są wyświetlane wraz ze wszystkimi metadanymi, w tym grafikami i opisami.

Aplikacja Podcasty z odtwarzanym pobranym odcinkiem podcastu.
Pobrane odcinki podcastów można odtwarzać nawet bez dostępu do sieci.

Zrób to w internecie

Pobrane wcześniej treści multimedialne mogą być wyświetlane z pamięci podręcznej, np. za pomocą przepisu Serve cached audio and video z biblioteki Workbox. Inne treści zawsze mogą być przechowywane w pamięci podręcznej lub w IndexedDB. Więcej informacji o tym, kiedy używać poszczególnych technologii przechowywania danych, znajdziesz w artykule Miejsce na dane w internecie. Jeśli masz dane, które powinny być trwale przechowywane bez ryzyka usunięcia, gdy ilość dostępnej pamięci się zmniejszy, możesz użyć interfejsu Persistent Storage API.

Proaktywne pobieranie w tle

Gdy wrócę do trybu online, mogę oczywiście wyszukać treści za pomocą zapytania, np. http 203. Gdy zdecyduję się zasubskrybować wynik wyszukiwania, czyli podcast HTTP 203, najnowszy odcinek serii zostanie natychmiast pobrany bez żadnych pytań.

Aplikacja Podcasty pobiera najnowszy odcinek podcastu natychmiast po zasubskrybowaniu.
Po zasubskrybowaniu podcastu najnowszy odcinek zostanie od razu pobrany.

Zrób to w internecie

Pobieranie odcinka podcastu może potrwać dłużej. Background Fetch API umożliwia przekazywanie pobierania do przeglądarki, która zajmuje się nim w tle.

W systemie Android przeglądarka może z kolei przekazywać te pobierania do systemu operacyjnego, więc nie musi działać w sposób ciągły. Po zakończeniu pobierania usługa aplikacji worker zostanie wybudzona i możesz zdecydować, co zrobić z odpowiedzią.

Interakcja z innymi aplikacjami i udostępnianie w nich

Aplikacja Podcasty jest naturalnie zintegrowana z innymi aplikacjami. Na przykład, gdy kliknę prawym przyciskiem myszy odcinek, który mi się podoba, mogę udostępnić go w innych aplikacjach na moim urządzeniu, np. w aplikacji Wiadomości. Jest on też naturalnie zintegrowany z systemowym schowkiem. Mogę kliknąć prawym przyciskiem myszy dowolny odcinek i skopiować do niego link.

Menu kontekstowe aplikacji Podcasty wywołane w odcinku podcastu z wybraną opcją „Udostępnij odcinek → Wiadomości”.
Udostępnianie odcinka podcastu w aplikacji Wiadomości.

Zrób to w internecie

Web Share APIWeb Share Target API umożliwiają aplikacji udostępnianie i odbieranie tekstów, plików i linków z innych aplikacji na urządzeniu. Chociaż aplikacja internetowa nie może jeszcze dodawać elementów menu do wbudowanego menu kontekstowego systemu operacyjnego, istnieje wiele innych sposobów łączenia się z innymi aplikacjami na urządzeniu. Interfejs Async Clipboard API umożliwia programowe odczytywanie i zapisywanie danych tekstowych i obrazów (w formacie PNG) w schowku systemowym. Na Androidzie możesz użyć interfejsu Contact Picker API, aby wybrać wpisy z menedżera kontaktów na urządzeniu. Jeśli oferujesz zarówno aplikację na konkretną platformę, jak i PWA, możesz użyć interfejsu Get Installed Related Apps API, aby sprawdzić, czy aplikacja na konkretną platformę jest zainstalowana. W takim przypadku nie musisz zachęcać użytkownika do zainstalowania PWA ani do zaakceptowania powiadomień push w internecie.

Odświeżanie aplikacji w tle

W ustawieniach aplikacji Podcasty mogę skonfigurować automatyczne pobieranie nowych odcinków. Dzięki temu nie muszę o tym myśleć – zaktualizowane treści zawsze będą dostępne. Magia.

Podcasty są skonfigurowane tak, aby odświeżać kanał pod kątem nowych odcinków podcastu co godzinę.

Zrób to w internecie

Interfejs Periodic Background Sync API umożliwia aplikacji regularne odświeżanie treści w tle bez konieczności jej uruchamiania. Oznacza to, że nowe treści są dostępne proaktywnie, więc użytkownicy mogą od razu zacząć je przeglądać, kiedy tylko zechcą.

Stan zsynchronizowany w chmurze

Subskrypcje są synchronizowane na wszystkich moich urządzeniach. W idealnym świecie nie muszę się martwić ręcznym synchronizowaniem subskrypcji podcastów. Nie muszę się też obawiać, że pamięć mojego urządzenia mobilnego zostanie zapełniona odcinkami, których już słuchałem na komputerze. Stan odtwarzania jest synchronizowany, a odsłuchane odcinki są automatycznie usuwane.

Menu ustawień aplikacji Podcasty w sekcji „Zaawansowane”, w której jest włączona opcja „Synchronizuj subskrypcje na różnych urządzeniach”. Stan jest synchronizowany w chmurze.

Zrób to w internecie

Synchronizowanie danych o stanie aplikacji to zadanie, które możesz przekazać do interfejsu Background Sync API. Sama operacja synchronizacji nie musi nastąpić natychmiast, tylko w końcu, a może nawet wtedy, gdy użytkownik zamknie już aplikację.

Sterowanie sprzętowymi klawiszami multimedialnymi

Gdy korzystam z innej aplikacji, np. czytam stronę z wiadomościami w przeglądarce, nadal mogę sterować aplikacją Podcasty za pomocą klawiszy multimedialnych na laptopie. Nie musisz przełączać się na aplikację, aby przewinąć do przodu lub do tyłu.

Klawiatura Magic Keyboard do MacBooka Pro z oznaczonymi klawiszami multimedialnymi.
Klawisze multimedialne umożliwiają sterowanie aplikacją Podcasty.

Zrób to w internecie

Klawisze multimedialne są obsługiwane przez interfejs Media Session API. Dzięki temu użytkownicy mogą korzystać z klawiszy multimedialnych na klawiaturach, słuchawkach, a nawet sterować aplikacją internetową za pomocą klawiszy multimedialnych na zegarkach. Możesz też użyć wzorca wibracji, gdy użytkownik przewija znaczną część treści, np. gdy mija napisy początkowe lub granicę rozdziału.

Wielozadaniowość i skrót do aplikacji

Oczywiście w każdej chwili mogę wrócić do aplikacji Podcasty. Aplikacja ma wyraźnie odróżniającą się ikonę, którą mogę umieścić na pulpicie lub w docku aplikacji, aby móc natychmiast uruchomić Podcasty, gdy tylko będę mieć na to ochotę.

Przełącznik zadań w systemie macOS z licznymi ikonami aplikacji do wyboru, w tym ikoną aplikacji Podcasty.
Wróć do aplikacji Podcasty.

Zrób to w internecie

Progresywne aplikacje internetowe na komputerach i urządzeniach mobilnych można zainstalować na ekranie głównym, w menu Start lub w Docku. Instalacja może się odbywać na podstawie proaktywnego prompta lub być w pełni kontrolowana przez dewelopera aplikacji. Wszystkie potrzebne informacje znajdziesz w artykule Co trzeba zrobić, aby aplikacja była instalowalna?. Podczas wielozadaniowości aplikacje PWA są wyświetlane niezależnie od przeglądarki.

Szybkie działania w menu kontekstowym

Najczęstsze działania w aplikacji, takie jak wyszukiwanie nowych treści i sprawdzanie, czy są nowe odcinki, są dostępne bezpośrednio w menu kontekstowym aplikacji w Docku. W menu Opcje mogę też zdecydować, czy aplikacja ma się otwierać w momencie logowania.

Menu kontekstowe ikony aplikacji Podcasty z opcjami „Szukaj” i „Sprawdź, czy są nowe odcinki”.
Szybkie działania są dostępne od razu po kliknięciu ikony aplikacji.

Zrób to w internecie

Określając skróty do ikon aplikacji w pliku manifestu aplikacji internetowej PWA, możesz zarejestrować szybkie ścieżki do typowych zadań, do których użytkownicy mogą uzyskać dostęp bezpośrednio z ikony aplikacji. W systemach operacyjnych takich jak macOS użytkownicy mogą też kliknąć prawym przyciskiem myszy ikonę aplikacji i ustawić jej uruchamianie podczas logowania. Trwają prace nad propozycją dotyczącą uruchamiania po zalogowaniu.

Działanie jako aplikacja domyślna

Inne aplikacje na iOS, a nawet witryny lub e-maile mogą być zintegrowane z aplikacją Podcasty za pomocą podcasts:// schematu adresu URL. Jeśli w przeglądarce kliknę link, np. podcasts://podcasts.apple.com/podcast/the-css-podcast/id1042283903, zostanę przekierowany(-a) do aplikacji Podcasty, gdzie mogę zasubskrybować podcast lub go posłuchać.

Przeglądarka Chrome wyświetlająca okno z prośbą o potwierdzenie, czy użytkownik chce otworzyć aplikację Podcasty.
Aplikację Podcasty można otworzyć bezpośrednio w przeglądarce.

Zrób to w internecie

Obsługa w pełni niestandardowych schematów URL nie jest jeszcze możliwa, ale istnieje propozycja dotycząca obsługi protokołów URL w przypadku PWA. registerProtocolHandler() z prefiksem schematu web+ to najlepsza alternatywa.

Integracja z lokalnym systemem plików

Może nie od razu przyjdzie Ci to do głowy, ale aplikacja Podcasty jest naturalnie zintegrowana z lokalnym systemem plików. Gdy pobieram odcinek podcastu na laptopa, jest on przechowywany w folderze ~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Library/Cache. W przeciwieństwie do np. ~/Documents ten katalog nie jest przeznaczony do bezpośredniego dostępu przez zwykłych użytkowników.

W sekcji treści offline znajdują się odwołania do innych mechanizmów przechowywania niż pliki.

Finder w systemie macOS otworzył katalog systemowy aplikacji Podcasty.
Odcinki podcastów są przechowywane w specjalnym folderze aplikacji systemowej.

Zrób to w internecie

Interfejs File System Access API umożliwia programistom uzyskanie dostępu do lokalnego systemu plików urządzenia. Możesz go używać bezpośrednio lub za pomocą biblioteki pomocy browser-fs-access, która w sposób przejrzysty zapewnia alternatywne rozwiązanie w przypadku przeglądarek, które nie obsługują tego interfejsu API. Ze względów bezpieczeństwa katalogi systemowe nie są dostępne w internecie.

Wygląd i styl platformy

Jest też bardziej subtelna funkcja, która jest oczywista w przypadku aplikacji na iOS, np. Podcasty. Żadna z etykiet tekstowych nie jest wybieralna, a cały tekst zlewa się z czcionką systemową urządzenia. Ponadto uwzględniany jest mój wybór motywu kolorystycznego systemu (np. tryb ciemny).

Aplikacja Podcasty w trybie ciemnym.
Aplikacja Podcasty obsługuje tryb jasny i ciemny.
Aplikacja Podcasty w trybie jasnym.
Aplikacja używa domyślnej czcionki systemowej.

Zrób to w internecie

Korzystając z właściwości CSS user-select o wartości none, możesz chronić elementy interfejsu przed przypadkowym wybraniem. Nie nadużywaj jednak tej właściwości, aby uniemożliwiać wybieranie zawartości aplikacji. Powinna być używana tylko w przypadku elementów interfejsu, takich jak teksty przycisków itp. Wartość system-ui właściwości CSS font-family umożliwia określenie domyślnej czcionki interfejsu systemu, która ma być używana w aplikacji. Na koniec aplikacja może uwzględniać preferencje użytkownika dotyczące schematu kolorów, respektując jego wybór prefers-color-scheme, z opcjonalnym przełącznikiem trybu ciemnego, który pozwala go zastąpić. Kolejną kwestią do rozstrzygnięcia może być to, co przeglądarka powinna zrobić po osiągnięciu granicy obszaru przewijania, na przykład w celu wdrożenia niestandardowej funkcji przeciągnij, aby odświeżyć. Jest to możliwe dzięki właściwości CSS overscroll-behavior.

Dostosowany pasek tytułu

Gdy otworzysz okno aplikacji Podcasty, zauważysz, że nie ma ona klasycznego zintegrowanego paska tytułu i paska narzędzi, jak np. okno przeglądarki Safari, ale dostosowany interfejs, który wygląda jak pasek boczny zadokowany w głównym oknie odtwarzacza.

Zintegrowany pasek kart i pasek narzędzi przeglądarki Safari.
Dostosowane paski tytułu w Safari i Podcastach.

Zrób to w internecie

Dostosowywanie paska tytułu jest dostępne w ograniczonym zakresie. Możesz (i powinieneś) określić właściwości displaytheme-color pliku manifestu aplikacji internetowej. Określa to wygląd okna aplikacji i decyduje, które domyślne elementy sterujące przeglądarki mają być wyświetlane – potencjalnie żadne.

Szybkie animacje

Animacje w aplikacji Podcasty są szybkie i płynne. Na przykład gdy otwieram szufladę Notatki do odcinka po prawej stronie, płynnie się ona wysuwa. Gdy usunę jeden odcinek z pobranych, pozostałe odcinki przesuwają się w górę i zajmują miejsce na ekranie, które zwolnił usunięty odcinek.

Aplikacja Podcasty z rozwiniętym panelem „Notatki do odcinka”.
Animacje w aplikacji, np. podczas otwierania szuflady, są szybkie.

Zrób to w internecie

Wydajne animacje w internecie są z pewnością możliwe, jeśli weźmiesz pod uwagę szereg sprawdzonych metod opisanych w artykule Animacje i wydajność. Animacje przewijania, które często można zobaczyć w treściach podzielonych na strony lub w karuzelach multimedialnych, można znacznie ulepszyć za pomocą funkcji CSS Scroll Snap. Aby mieć pełną kontrolę, możesz użyć interfejsu Web Animations API.

Treści wyświetlane poza aplikacją

Aplikacja Podcasty na iOS może wyświetlać treści w innych miejscach niż sama aplikacja, np. w widoku widżetów systemu lub jako sugestia Siri.

Proaktywne wezwania do działania oparte na użytkowaniu, które wymagają tylko kliknięcia, aby wejść w interakcję, mogą znacznie zwiększyć współczynnik ponownego zaangażowania w aplikację, taką jak Podcasty.

Widok widżetu w iOS przedstawia aplikację Podcasty sugerującą nowy odcinek.

Zrób to w internecie

Użyj w aplikacji Content Index API, aby poinformować przeglądarkę, które treści PWA są dostępne offline. Dzięki temu przeglądarka może udostępniać te treści poza główną aplikacją. Oznaczając ciekawe treści w aplikacji jako odpowiednie do odtwarzania dźwięku speakable i używając strukturalnych znaczników, możesz pomóc wyszukiwarkom i wirtualnym asystentom, takim jak Asystent Google, w prezentowaniu Twoich ofert w najlepszym świetle.

Widżet sterowania multimediami na ekranie blokady

Podczas odtwarzania odcinka podcastu aplikacja Podcasty wyświetla na ekranie blokady atrakcyjny widżet sterowania z metadanymi, takimi jak okładka odcinka, tytuł odcinka i nazwa podcastu.

Widżet odtwarzania multimediów na ekranie blokady w iOS przedstawiający odcinek podcastu z bogatymi metadanymi.
Odtwarzaniem multimediów w aplikacji można sterować z ekranu blokady.

Zrób to w internecie

Interfejs Media Session API umożliwia określanie metadanych, takich jak grafika, tytuły utworów itp., które są następnie wyświetlane na ekranie blokady, zegarkach i innych widżetach multimedialnych w przeglądarce.

Powiadomienia push

Powiadomienia push w internecie stały się nieco uciążliwe (chociaż prośby o ich włączenie są teraz znacznie mniej natarczywe). Jeśli jednak są używane prawidłowo, mogą przynieść wiele korzyści. Na przykład aplikacja Podcasty na iOS może opcjonalnie powiadamiać mnie o nowych odcinkach podcastów, które subskrybuję, lub polecać nowe podcasty, a także informować o nowych funkcjach aplikacji.

Aplikacja Podcasty na iOS na ekranie ustawień „Powiadomienia” z włączonym przełącznikiem powiadomień „Nowe odcinki”.
Aplikacje mogą wysyłać powiadomienia push, aby informować użytkownika o nowych treściach.

Zrób to w internecie

Push API umożliwia aplikacji odbieranie powiadomień push, dzięki czemu możesz informować użytkowników o ważnych wydarzeniach związanych z Twoją progresywną aplikacją internetową. W przypadku powiadomień, które mają być wyświetlane w znanym czasie w przyszłości i nie wymagają połączenia sieciowego, możesz użyć interfejsu Notification Triggers API.

Plakietki ikony aplikacji

Gdy pojawią się nowe odcinki jednego z subskrybowanych podcastów, na ikonie aplikacji na ekranie głównym Podcastów pojawi się plakietka, która zachęci mnie do ponownego korzystania z aplikacji w nieinwazyjny sposób.

Ekran ustawień iOS z włączonym przełącznikiem „Odznaki”.
Odznaki to subtelny sposób na informowanie użytkowników o nowych treściach w aplikacjach.

Zrób to w internecie

Plakietki ikony aplikacji możesz ustawić za pomocą interfejsu Badging API. Jest to szczególnie przydatne, gdy PWA ma pojęcie „nieprzeczytanych” elementów lub gdy potrzebujesz sposobu na dyskretne zwrócenie uwagi użytkownika na aplikację.

Odtwarzanie multimediów ma pierwszeństwo przed ustawieniami oszczędzania energii

Podczas odtwarzania podcastu ekran może się wyłączyć, ale system nie przechodzi w tryb gotowości. Aplikacje mogą też opcjonalnie utrzymywać ekran w stanie aktywności, np. aby wyświetlać teksty piosenek lub napisy.

Preferencje macOS w sekcji „Oszczędzanie energii”.
Aplikacje mogą utrzymywać ekran włączony.

Zrób to w internecie

Użyj interfejsu Screen Wake Lock API, aby zapobiec wyłączaniu się ekranu. Odtwarzanie multimediów w internecie automatycznie uniemożliwia przejście systemu w tryb gotowości.

Odkrywanie aplikacji w sklepie z aplikacjami

Aplikacja Podcasty jest częścią systemu macOS na komputery, ale na urządzeniach z iOS trzeba ją zainstalować ze sklepu App Store. Szybkie wyszukiwanie podcast, podcasts lub apple podcasts natychmiast wyświetla aplikację w App Store.

Wyszukiwanie „podcastów” w App Store na iOS powoduje wyświetlenie aplikacji Podcasty.
Użytkownicy nauczyli się odkrywać aplikacje w sklepach z aplikacjami.

Zrób to w internecie

Apple nie zezwala na umieszczanie aplikacji PWA w App Store, ale w przypadku Androida możesz przesłać aplikację PWA opakowaną w zaufaną aktywność w internecie. Skrypt bubblewrap ułatwia to zadanie. Ten skrypt jest też wewnętrznie używany przez funkcję eksportowania aplikacji na Androida w PWABuilder, z której możesz korzystać bez używania wiersza poleceń.

Podsumowanie funkcji

Ta tabela zawiera zwięzłe podsumowanie wszystkich funkcji i listę przydatnych zasobów, które pomogą Ci wdrożyć je w internecie.

Funkcja Przydatne zasoby, które pomogą Ci to zrobić w internecie
Możliwość działania w trybie offline
Treści offline są dostępne i można je odtwarzać
Proaktywne pobieranie w tle
Udostępnianie treści innym aplikacjom i interakcje z nimi
Odświeżanie aplikacji w tle
Stan synchronizowany w chmurze
Sterowanie multimediami za pomocą klawiszy sprzętowych
Wielozadaniowość i skrót do aplikacji
Szybkie działania w menu kontekstowym
Działa jako domyślna aplikacja
Integracja z lokalnym systemem plików
Wygląd i styl platformy
Spersonalizowany pasek tytułu
Szybkie animacje
Treści wyświetlane poza aplikacją
Widżet sterowania multimediami na ekranie blokady
Powiadomienia push
Oznaczanie ikon aplikacji
Odtwarzanie multimediów ma wyższy priorytet niż ustawienia oszczędzania energii
Odkrywanie aplikacji w sklepie z aplikacjami

Podsumowanie

Od czasu wprowadzenia w 2015 roku progresywne aplikacje internetowe bardzo się zmieniły. W ramach Project Fugu 🐡 zespół Chromium z różnych firm pracuje nad wyeliminowaniem ostatnich braków. Nawet jeśli zastosujesz tylko niektóre z naszych wskazówek, możesz zbliżyć się do tego, aby Twoja witryna działała jak aplikacja, i sprawić, że użytkownicy zapomną, że mają do czynienia „tylko z witryną”. Większość użytkowników nie dba o to, jak została zbudowana Twoja aplikacja (i dlaczego mieliby się tym przejmować?), o ile tylko sprawia wrażenie prawdziwej aplikacji.

Podziękowania

Ten dokument został sprawdzony przez Kayce Basques, Joe Medleya, Joshuę Bella, Diona Almaera, Ade Oshineye, Pete’a LePage’a, Sama Thorogooda, Reilly’ego GrantaJeffreya Yasskina.