Progresywne aplikacje internetowe a dostępność:
stan wiedzy w 2026
Sześć lat po tym, jak Apple w końcu dostarczył działającą ścieżkę instalacji w iOS 16.4, progresywna aplikacja internetowa przestała być ciekawostką i zaczęła być pytaniem przetargowym. Ten primer jest przeznaczony dla zespołów inżynieryjnych, które muszą wiedzieć, w 2026 roku, co PWA rzeczywiście zawdzięcza swoim użytkownikom korzystającym z technologii wspomagających — i gdzie platforma nadal nie dorównuje prawdziwej aplikacji natywnej.
1. Co oznacza „dostępność PWA“ w 2026
Progresywna aplikacja internetowa to, w czasie działania, trzy rzeczy nałożone na normalną stronę internetową: Web App Manifest, service worker i chrome trybu zainstalowanego, który zastępuje ramkę przeglądarki własnym wpisem przełącznika zadań systemu operacyjnego. Każda z tych trzech warstw wprowadza własne obowiązki dostępności — i każda zawodzi użytkowników technologii wspomagających w inny, osobno debugowalny sposób.
W 2020 roku całą rozmowę sprowadzano do stwierdzenia „WCAG obowiązuje w PWA“, co było technicznie poprawne i operacyjnie bezużyteczne. W 2026 roku rozmowa jest podzielona na cztery powierzchnie, które naprawdę mają znaczenie: UX monitu instalacji, właściwości manifestu sterujące funkcjami na poziomie systemu operacyjnego, przekazanie między drzewem dostępności przeglądarki a drzewem dostępności systemu operacyjnego po uruchomieniu PWA w trybie samodzielnym oraz zachowanie technologii wspomagającej podczas offline’owego fallbacku service workera. WCAG 2.2 reguluje dokument; warstwa integracji z platformą jest regulowana przez znacznie bardziej nierówną mieszaninę szkiców W3C, zachowań specyficznych dla dostawców i konwencji ARIA odziedziczonych z sieci.
Ten primer obejmuje powierzchnię integracji z platformą PWA — monity instalacji, właściwości manifestu, zachowanie technologii wspomagającej w trybie samodzielnym, fallback offline. Zakłada, że bazowy dokument spełnia już WCAG 2.2 AA. Opakowanie PWA nałożone na niedostępną stronę to nadal niedostępna strona.
2. Monit instalacji
Monit instalacji to najbardziej widoczna dla użytkownika powierzchnia PWA i, w 2026 roku, nadal najgorzej zaprojektowana. W Chromium monit jest sterowany przez beforeinstallprompt, który uruchamia się dopiero po heurystycznym progu zaangażowania i który serwisy zazwyczaj podłączają do niestandardowego przycisku „Zainstaluj aplikację“. To właśnie ten niestandardowy przycisk jest miejscem, gdzie dostępność zawodzi: mniej więcej jeden na trzy PWA oceniane przez Lighthouse renderuje funkcję instalacji jako <div> lub stylowany <span> bez roli, bez dostępnej nazwy i bez obsługi klawiatury — niewidoczny dla czytnika ekranu, nieosiągalny za pomocą Tab i nieodróżnialny od dekoracyjnego chrome’u.
Naprawa jest niepozorna i obowiązkowa: renderuj funkcję instalacji jako prawdziwy <button>, ustaw dostępną nazwę zawierającą czasownik („Zainstaluj Disability World na tym urządzeniu“), udostępnij ten sam przycisk wszystkim modalności wejściowym i ogłaszaj sukces lub niepowodzenie za pomocą regionu live po tym, jak użytkownik odrzuci systemowy arkusz potwierdzenia. To samo dotyczy stanów związanych z aplikacjami i odrzuconym beforeinstallprompt — oba muszą powodować zmianę stanu percepcji przez technologię wspomagającą.
<div onclick="install()">Install</div>— niefokusowalny, bez roli, czytnik ekranu widzi tylko słowo „Install“ bez możliwości działania.- Przycisk ukryty do momentu uruchomienia
beforeinstallprompt— użytkownicy klawiatury trafiają na przestarzały link „Zainstaluj“, który nic nie robi po wywołaniu zdarzenia. - Brak ogłoszenia statusu po odrzuceniu — użytkownik technologii wspomagającej nie ma możliwości sprawdzenia, czy instalacja się powiodła.
<button type="button" aria-label="Zainstaluj Disability World">...</button>z jawnymaria-disabledgdy instalacja nie jest jeszcze dostępna.- Obsługa
beforeinstallpromptprzechowuje zdarzenie; przycisk odzwierciedla wynikający z tego stan za pomocąaria-disabledprzełączanego po nadejściu zdarzenia. - Grzecznościowy region live ogłasza „Zainstalowano“ lub „Instalacja odrzucona“ po rozwiązaniu
userChoice, aby użytkownik technologii wspomagającej miał dostrzegalne potwierdzenie.
3. Właściwości manifestu
Web App Manifest rozrastał się dyskretnie między 2022 a 2026 rokiem, a wiele jego nowszych właściwości ma bezpośrednie konsekwencje dla dostępności. Poniższa macierz mapuje jedenaście właściwości manifestu wchodzących w interakcję z technologią wspomagającą na to, co każda przeglądarka rzeczywiście z nimi robi dzisiaj — w Chrome na Androidzie, Safari na iOS, Edge na Windows i Firefox na komputerze stacjonarnym. Właściwości takie jak file_handlers, share_target i window_controls_overlay nie istniały w żadnej znaczącej formie w 2021 roku; w 2026 roku decydują o tym, czy PWA pojawia się w arkuszu udostępniania systemu operacyjnego, otwiera pliki z menedżera plików systemowych i renderuje własny pasek tytułu — a wszystko to użytkownik czytnika ekranu musi być w stanie postrzegać i obsługiwać.
| Chrome (Android) | Safari (iOS 16.4+) | Edge (Windows) | Firefox (komputer) | |
|---|---|---|---|---|
name udostępniana launcherowi systemu operacyjnego | Tak | Tak | Tak | N/D |
short_name wyświetlana pod ikoną ekranu głównego | Tak | Tak | Tak | N/D |
description odczytywana przez technologię wspomagającą w oknie dialogowym informacji o aplikacji | Tak | Częściowo | Tak | N/D |
Adaptacyjne ikony maskable (purpose: "maskable") | Tak | Nie | Tak | N/D |
lang + dir propagowane do technologii wspomagającej | Tak | Częściowo | Tak | N/D |
file_handlers — otwieranie z menedżera plików systemowych | Tak | Nie | Tak | N/D |
share_target — pojawia się w arkuszu udostępniania systemu operacyjnego | Tak | Nie | Tak | N/D |
window_controls_overlay — przejęcie paska tytułu | N/D | N/D | Tak | N/D |
shortcuts — menu długiego naciśnięcia launchera | Tak | Nie | Tak | N/D |
display_override (minimal-ui, window-controls-overlay) | Tak | Nie | Tak | N/D |
launch_handler (focus-existing) | Tak | Nie | Tak | N/D |
window_controls_overlayGdy PWA decyduje się na window_controls_overlay, przejmuje pasek tytułu systemu operacyjnego — w tym region, w którym w aplikacji natywnej czytnik ekranu automatycznie ogłaszałby tytuł okna. Aplikacje, które przyjmują tę właściwość, muszą jawnie renderować własny, fokusowalny, oznakowany dla technologii wspomagającej element sterujący paska tytułu wewnątrz wcięcia bezpiecznego obszaru, w przeciwnym razie użytkownicy czytnika ekranu tracą jedyną kotwicę na ekranie dla pytania „gdzie jestem w tej aplikacji“.
4. Przekazanie obsługi czytnika ekranu sieć ↔ tryb natywny
Najtrudniejszym problemem debugowania w dostępności PWA w 2026 roku jest to, co dzieje się, gdy użytkownik przekracza granicę między chrome PWA w trybie samodzielnym a samym systemem operacyjnym. Na Androidzie TalkBack odczytuje name z manifestu, gdy użytkownik skupia ikonę na ekranie głównym, a następnie przechodzi do odczytu drzewa dostępności wewnątrz aplikacji po uruchomieniu PWA; na iOS 16.4+ VoiceOver robi to samo dla zainstalowanej PWA, ale z jedną istotną osobliwością — pierwszy fokusowalny element po uruchomieniu jest ogłaszany bez kontekstu na poziomie aplikacji, który natywna aplikacja iOS dostarczyłaby poprzez tytuł UIWindow.
Autor PWA ma jedno narzędzie do wypełnienia tej luki: przy zimnym uruchomieniu należy skupić nagłówek lub punkt orientacyjny głównego regionu, który zawiera nazwę aplikacji w swojej dostępnej etykiecie, i ustawić <title> dokumentu na ciąg znaków, który przełącznik zadań systemu operacyjnego odczyta, gdy użytkownik przesuwa się między aplikacjami. Bez tego użytkownik czytnika ekranu traci wskazówkę kontekstową, że przełączył aplikacje — błąd „gdzie jestem“, który nie istnieje w aplikacjach natywnych.
„W 2024 roku użytkownik VoiceOver z klawiaturą Bluetooth powiedział nam, w przypadku PWA, którą certyfikowaliśmy na WCAG 2.2 AA, że nie miał pojęcia, że wyszedł z Safari i wszedł do naszej aplikacji. Dokument był dostępny. Przekazanie nie było.“
5. Zachowanie offline i technologii wspomagającej
Gdy service worker serwuje stronę fallback offline, pojawiają się dwa tryby błędów specyficzne dla technologii wspomagającej: fokus, który był wewnątrz właśnie wyładowanej strony, jest po cichu przenoszony na treść dokumentu, a sama strona offline rzadko używa regionu live, aby powiedzieć użytkownikowi czytnika ekranu, co właśnie się stało. Rezultatem jest użytkownik, który słyszy jedno ogłoszenie tytułu strony offline (jeśli ma szczęście) i w inny sposób doświadcza całkowitej utraty kontekstu.
Naprawa polega na potraktowaniu przejścia offline jako zmiany stanu, ogłoszeniu jej przez grzecznościowy region aria-live, przeniesieniu fokusa do znane go punktu orientacyjnego na stronie offline i udostępnieniu elementu sterującego „Spróbuj ponownie“ jako prawdziwego przycisku, a nie linku „Przeładuj“, który większość standardowych szablonów service workera dostarcza. To samo dotyczy ścieżki odzyskiwania foreground-sync: gdy łączność wraca i service worker opróżnia kolejkę, to też jest zmiana stanu, o której użytkownik technologii wspomagającej musi zostać poinformowany.
Grzecznościowy region live ogłasza „Jesteś offline“ przy przejściu. Fokus jest przenoszony do głównego nagłówka strony offline. Wyraźnie oznakowany <button>Spróbuj ponownie</button> jest pierwszym interaktywnym elementem. Po przywróceniu połączenia drugie grzecznościowe ogłoszenie mówi „Połączenie przywrócone“ i fokus wraca do tego, z czym użytkownik ostatnio wchodził w interakcję.
6. iOS Safari vs Android vs tryb natywny
Pytanie „czy wdrożyć PWA, czy aplikację natywną“ ma teraz wymiar dostępności oprócz wymiaru kompletności funkcji. Poniżej porównujemy tę samą hipotetyczną aplikację do czytania wiadomości dostarczoną na cztery sposoby — jako PWA na Androidzie, jako PWA na iOS 16.4+, jako natywną aplikację iOS i jako natywną aplikację Android — w pięciu powierzchniach, których użytkownik czytnika ekranu dotyka jako pierwszy.
| PWA · Android | PWA · iOS 16.4+ | Natywna · iOS | Natywna · Android | |
|---|---|---|---|---|
| Funkcja instalacji wykrywalna przez technologię wspomagającą | Jeśli deweloper to zrobił poprawnie | Menu Dodaj do ekranu głównego — wykrywalne | App Store — w pełni dostępny | Play Store — w pełni dostępny |
| Nazwa aplikacji + opis na ikonie launchera | Tak | Tak (name + apple-mobile-web-app-title) | Tak (UIKit Info.plist) | Tak (manifest Android) |
| Ikony adaptacyjne (motyw / monochromatyczne) | Tak (maskable) | Nie | Tak | Tak |
| Kontekst przełącznika aplikacji ogłaszany | Tak | Częściowo | Tak (tytuł UIWindow) | Tak |
| Wpis w arkuszu udostępniania systemu operacyjnego | Tak (share_target) | Nie | Tak (UIActivity) | Tak (filtr Intent) |
| Skróty po długim naciśnięciu | Tak (shortcuts) | Nie | Tak (UIApplicationShortcutItem) | Tak |
| Dostępna treść powiadomień push | Tak | Tak (od iOS 16.4) | Tak | Tak |
| Niestandardowy rotor / szybka nawigacja | N/D | N/D | Tak | Tak |
iOS 16.4 odblokował ścieżkę instalacji, powiadomienia push i API oznakowania dla PWA, a iOS 17 jeszcze bardziej zmniejszył lukę na podstawowej powierzchni uruchamiania. Jednak file_handlers, share_target, shortcuts i window_controls_overlay pozostają nieobsługiwane. Dla użytkownika technologii wspomagającej, który polega na arkuszu udostępniania systemu operacyjnego do przenoszenia treści między aplikacjami, PWA na iOS to nadal znacząco mniejsza powierzchnia niż PWA na Androidzie lub natywna aplikacja iOS.
Podsumowanie: schemat postępowania na 2026
Dostarczaj funkcję instalacji jako prawdziwy <button> z dostępną nazwą. Podłącz grzecznościowy region live do wyniku userChoice. Wypełnij name, short_name, description, lang i dir w manifeście i dostarcz ikony maskable dla Androida. Jeśli decydujesz się na window_controls_overlay, renderuj i oznakuj własny pasek tytułu; jeśli decydujesz się na file_handlers lub share_target, traktuj wynikowe uruchomienie jako zmianę stanu i ogłaszaj ją przy wejściu.
Przenoś fokus do oznakowanego punktu orientacyjnego za każdym razem, gdy użytkownik czytnika ekranu przekracza granicę — pierwsze uruchomienie, powrót z przełącznika aplikacji, przejście offline, uruchomienie share_target, ponowne połączenie. Traktuj każde przekroczenie jako oddzielne zdarzenie, które jest winne użytkownikowi dostrzegalne ogłoszenie i znane zakotwiczenie fokusa. Nic z tego nie jest trudne; prawie nic z tego nie jest konsekwentnie wdrażane.
PWA w 2026 roku może być prawie nieodróżnialna od natywnej aplikacji dla użytkownika technologii wspomagającej — na Androidzie. Na iOS jest bliżej niż była, a realna luka nadal istnieje. Luka zamyka się w tempie mniej więcej jednej właściwości manifestu rocznie. Dla zespołów przetargowych wybierających między PWA a aplikacją natywną pytanie dotyczące dostępności nie brzmi już „czy PWA może być dostępna?“ — może. Pytanie brzmi, czy zespół ją budujący przeczytał jedenaście wierszy manifestu powyżej i zaakceptował, że każdy z nich stanowi część ich produktu dostarczanego na każdej platformie, na którą wysyłają.
„Opakowanie PWA nie zwalnia zespołu z pracy integracji z platformą. Dodaje jedenaście nowych powierzchni dostępności i prosi zespół o obsługę każdej z nich na każdej platformie, na którą wysyła.“