Jak działają powiadomienia push na iOS?

99

W jaki sposób powiadomienia „push” systemu iOS są dostarczane na określone urządzenie bez konieczności odpytywania serwera?

Na przykład, powiedzmy, że otrzymałem nową wiadomość na Facebooku. Facebook powiadamia Apple, że moje urządzenie powinno otrzymać takie powiadomienie. Ale skąd Apple wie, na które urządzenie / adres IP ma przekazać wiadomość?

Andy Hin
źródło
2
@Wain Szukam szczegółowego wyjaśnienia na poziomie technicznym. Ten artykuł jest niezwykle wysoki. Czyli moje urządzenie przez cały czas utrzymuje otwarte połączenie z serwerami push firmy Apple?
Andy Hin
Jestem bardziej zaznajomiony z systemem Android push, ale zwykle podczas instalowania aplikacji rejestruje urządzenie za pomocą unikalnego identyfikatora w Apple. Następnie, gdy Facebook wyśle ​​wiadomość do Apple, Apple przekaże ją na unikalny identyfikator urządzenia.
Panama Jack
6
@Pjack tak, ale skoro moje urządzenie ciągle zmienia różne wieże komórkowe, różne sieci Wi-Fi, skąd Apple zna adres IP mojego unikalnego identyfikatora?
Andy Hin
@whydna Dzięki za zadanie tego pytania. Chciałem zrozumieć dokładnie to samo. Wierzę, że to odpowiada na moje pytanie tutaj: stackoverflow.com/questions/18859732/ ...
MightyMouse
@AndyHin System operacyjny urządzenia (iOS) wie, które serwery APN są prawidłowe. Urządzenie łączy się z tymi serwerami i utrzymuje połączenie otwarte. To połączenie jest prawdopodobnie powiązane z identyfikatorem urządzenia i innymi metadanymi (numerem telefonu). Gdy wiadomość wymaga „wypchnięcia”, punkty APN znajdują właściwe połączenie i wysyłają je do już otwartego połączenia. Dlatego APN nie próbuje nawiązać połączenia z urządzeniem, zawsze to urządzenie otwiera to połączenie. Jedno połączenie na urządzenie.
Todd

Odpowiedzi:

49

To było dla mnie zbyt trudne, żeby tak komentować.

Z dokumentacji.

Usługa Apple Push Notification (APN) propaguje powiadomienia push do urządzeń, na których zarejestrowane są aplikacje, które mają je otrzymywać. Każde urządzenie nawiązuje akredytowane i zaszyfrowane połączenie IP z usługą i otrzymuje powiadomienia za pośrednictwem tego stałego połączenia. Dostawcy łączą się z APN poprzez trwały i bezpieczny kanał, jednocześnie monitorując przychodzące dane przeznaczone dla ich aplikacji klienckich. Gdy nadejdą nowe dane aplikacji, dostawca przygotowuje i wysyła powiadomienie kanałem do APN, które wypycha powiadomienie do urządzenia docelowego.

Proponuję przeczytać dokumentację, aby uzyskać więcej informacji oraz jak używać i konfigurować. To wszystko tam jest.

Powiadomienia push

Panama Jack
źródło
Dziękuję za Twoją odpowiedź.
MightyMouse
7
Więc Apple utrzymuje statyczny adres IP twojego urządzenia?
CMCDragonkai
Zdziwiłem się, kiedy zrozumiałem, że mój serwer musi wysłać powiadomienie do APNS DLA KAŻDEGO URZĄDZENIA DOCELOWEGO! :(
Vladimir,
4
@CMCDragonkai Urządzenie nawiązuje połączenie, a nie serwer.
Hitechcomputergeek
7
więc urządzenia utrzymują długie połączenie typu polling / gniazdo zawsze z usługą APN? Jeśli tak jest, to w jaki sposób usługa APN obsługuje tak wiele połączeń - jeśli serwer może obsługiwać 50 tys. Połączeń i zawsze jest 500 milionów użytkowników, usługa potrzebuje co najmniej 10000 serwerów. Czy to praktyczny scenariusz?
AV94,
87

Każde urządzenie można aktualizować danymi przy użyciu własnych unikalnych tokenów urządzenia. To zdjęcie wyjaśnia wszystko. .

wprowadź opis obrazu tutaj

Karan Alangat
źródło
Masz pomysł, do czego służy token urządzenia? Czy jest używany do szyfrowania komunikacji między serwerem APNS a aplikacją lub w innym miejscu?
Mugen
1
@Mugen: token urządzenia jest używany przez APNS do identyfikacji urządzenia, które ma przekazywać ładunek wysłany przez dostawcę!
D4ttatraya
@Karan - Czy istnieje różnica między powiadomieniami, które są dla użytkownika (np. „Hej, użytkowniku, masz wiadomość!”) A tymi, które mają na celu obudzenie aplikacji i po cichu nakazanie jej przetwarzania w tle?
Howiecamp
@Howiecamp Jeśli korzystasz z powiadomień push, otrzymasz powiadomienie o każdym otrzymaniu powiadomienia, jeśli aplikacja jest uruchomiona. Również aktywne szczegóły powiadomień są dostępne, gdy użytkownik dotknie powiadomienia z centrum powiadomień i uruchomi aplikację. W tym czasie możesz wykonywać czynności, które chcesz wykonać.
Karan Alangat
@KaranAlangat, Jak tutaj obliczono liczbę odznak? Skąd serwer o tym wie?
GvSharma
22

Stworzyłem infografikę, aby wyjaśnić przepływ powiadomień push. Mam nadzieję, że to jest pomocne.

wprowadź opis obrazu tutaj

Udit Agarwal
źródło
22

Omówienie APN

Usługa Apple Push Notification (APN) to centralny element funkcji zdalnych powiadomień. Jest to solidna, bezpieczna i wysoce wydajna usługa dla twórców aplikacji służąca do rozpowszechniania informacji do urządzeń z systemem iOS (i pośrednio do systemu watchOS), tvOS i macOS.

Przy pierwszym uruchomieniu aplikacji na urządzeniu użytkownika system automatycznie ustanawia akredytowane, zaszyfrowane i trwałe połączenie IP między aplikacją a APN. To połączenie umożliwia aplikacji konfigurację, która umożliwia otrzymywanie powiadomień, zgodnie z opisem w sekcji Konfigurowanie obsługi zdalnego powiadamiania.

Druga połowa połączenia do wysyłania powiadomień - trwały, bezpieczny kanał między serwerem dostawcy a APN - wymaga konfiguracji na koncie programisty online i korzystania z certyfikatów kryptograficznych dostarczonych przez firmę Apple. Dostawca to serwer wdrażany i zarządzany, konfigurowany do pracy z APN. Rysunek 1-1 przedstawia ścieżkę dostarczania dla zdalnego powiadomienia.

Rysunek 1-1 Dostarczanie zdalnego powiadomienia od dostawcy do aplikacji

image: ../Art/remote_notif_simple.jpg

Po zakończeniu konfiguracji powiadomień push u dostawców i w aplikacji dostawcy mogą następnie wysyłać żądania powiadomień do APN. APN przekazuje odpowiednie ładunki powiadomień do każdego docelowego urządzenia. Po otrzymaniu powiadomienia system dostarcza ładunek do odpowiedniej aplikacji na urządzeniu i zarządza interakcjami z użytkownikiem.

Jeśli powiadomienie dotyczące Twojej aplikacji nadejdzie, gdy urządzenie jest włączone, ale aplikacja nie jest uruchomiona, system może nadal wyświetlać powiadomienie. Jeśli urządzenie jest wyłączone, gdy APN wysyła powiadomienie, APN zatrzymuje powiadomienie i próbuje ponownie później (aby uzyskać szczegółowe informacje, zobacz Quality of Service, Store-and-Forward i Joint Notifications).

Obowiązki dostawcy

Twoje serwery dostawcy mają następujące obowiązki związane z uczestnictwem w APN:

  • Otrzymywanie, za pośrednictwem APN, unikalnych w skali światowej, tokenów urządzeń specyficznych dla aplikacji i innych istotnych danych z wystąpień aplikacji na urządzeniach użytkowników. Dzięki temu dostawca wie o każdym uruchomionym wystąpieniu aplikacji.
  • Określenie, zgodnie z projektem Twojego systemu powiadomień, kiedy zdalne powiadomienia muszą być wysyłane do każdego urządzenia.
  • Tworzenie i wysyłanie żądań powiadomień do APN, każde żądanie zawierające ładunek powiadomienia i informacje o dostarczeniu; Następnie APN dostarcza odpowiednie powiadomienia do odpowiednich urządzeń w Twoim imieniu.

W przypadku każdego żądania zdalnego powiadomienia, które wysyła dostawca, musi:

  • Skonstruuj słownik JSON zawierający ładunek powiadomienia, zgodnie z opisem w temacie Tworzenie ładunku zdalnego powiadomienia.
  • Dodaj ładunek, globalnie unikalny token urządzenia i inne informacje o dostarczaniu do żądania HTTP / 2. Aby uzyskać informacje na temat tokenów urządzeń, zobacz Zaufanie do połączeń APN-to-urządzenie i Tokeny urządzeń. Aby uzyskać informacje o formacie żądań HTTP / 2 oraz możliwych odpowiedziach i błędach z APN, zobacz Komunikacja z APN.
  • Wyślij żądanie HTTP / 2 do APN, w tym poświadczenia kryptograficzne w postaci tokena lub certyfikatu, przez trwały, bezpieczny kanał.
  • Ustanowienie tego bezpiecznego kanału opisano w sekcji Architektura zabezpieczeń.

Korzystanie z wielu dostawców

Rysunek 1-2 przedstawia rodzaj sieci wirtualnej, którą APN umożliwia urządzeniom z uruchomionymi aplikacjami. Aby obsłużyć ładowanie powiadomień, zazwyczaj wdraża się wielu dostawców, z których każdy ma własne trwałe i bezpieczne połączenie z APN. Każdy dostawca może następnie wysyłać żądania powiadomień skierowane do dowolnego urządzenia, dla którego dostawca ma prawidłowy token urządzenia.

Rysunek 1-2 Przesyłanie zdalnych powiadomień od wielu dostawców do wielu urządzeń

image: ../Art/remote_notif_multiple.jpg

Powiadomienia o jakości usług, „Store and Forward” i połączone

Usługa Apple Push Notification obejmuje składnik Quality of Service (QoS), który pełni funkcję „zapisz i przekaż dalej”. Jeśli APN próbuje dostarczyć powiadomienie, a urządzenie docelowe jest w trybie offline, APN przechowuje powiadomienie przez ograniczony czas i dostarcza je, gdy urządzenie stanie się ponownie dostępne. Ten składnik przechowuje tylko najnowsze powiadomienia na urządzenie i aplikację. Jeśli urządzenie jest w trybie offline, wysłanie żądania powiadomienia skierowanego do tego urządzenia powoduje odrzucenie poprzedniego żądania. Jeśli urządzenie pozostaje w trybie offline przez długi czas, wszystkie jego powiadomienia zapisane w APN są odrzucane.

Aby umożliwić łączenie podobnych powiadomień, w żądaniu powiadomienia można dołączyć identyfikator zwinięcia. Zwykle, gdy urządzenie jest w trybie online, każde żądanie powiadomienia wysyłane do APN skutkuje powiadomieniem dostarczonym do urządzenia. Jednak gdy klucz apns-collapse-id jest obecny w nagłówku żądania HTTP / 2, APN łączy żądania, których wartość dla tego klucza jest taka sama. Na przykład serwis informacyjny, który dwukrotnie wysyła ten sam nagłówek, może używać tej samej wartości identyfikatora zwijania dla obu żądań. Punkty APN połączyłyby następnie dwa żądania w jedno powiadomienie o dostarczeniu do urządzenia. Aby uzyskać szczegółowe informacje na temat klucza apns-collapse-id.

Architektura bezpieczeństwa

APN wymusza kompleksową weryfikację kryptograficzną i uwierzytelnianie przy użyciu dwóch poziomów zaufania: zaufania połączenia i zaufania tokenu urządzenia.

Zaufanie połączenia działa między dostawcami a APN oraz między APN a urządzeniami.

Zaufanie tokenu urządzenia działa kompleksowo w przypadku każdego zdalnego powiadomienia. Zapewnia, że ​​powiadomienia są kierowane tylko między prawidłowymi punktami początkowymi (dostawcy) i końcowymi (urządzenia).

Token urządzenia to nieprzezroczysta instancja NSData, która zawiera unikalny identyfikator przypisany przez firmę Apple do określonej aplikacji na określonym urządzeniu. Tylko APN mogą dekodować i odczytywać zawartość tokenu urządzenia. Każde wystąpienie aplikacji otrzymuje swój unikatowy token urządzenia, gdy rejestruje się w APN, a następnie musi przekazać token do swojego dostawcy, zgodnie z opisem w sekcji Konfigurowanie obsługi zdalnego powiadamiania. Dostawca musi dołączyć token urządzenia do każdego żądania powiadomienia wypychanego, które jest przeznaczone dla skojarzonego urządzenia; Punkty APN używają tokena urządzenia, aby zapewnić, że powiadomienie zostanie dostarczone tylko do unikatowej kombinacji aplikacja-urządzenie, dla której jest przeznaczone.

APN może wystawiać nowy token urządzenia z różnych powodów:

  • Użytkownik instaluje Twoją aplikację na nowym urządzeniu
  • Użytkownik przywraca urządzenie z kopii zapasowej
  • Użytkownik ponownie instaluje system operacyjny
  • Inne zdarzenia zdefiniowane przez system

W rezultacie aplikacje muszą żądać tokenu urządzenia w czasie uruchamiania, zgodnie z opisem w Zaufanie połączenia APN-to-urządzenie i Tokeny urządzeń. Aby zapoznać się z przykładami kodu, zobacz Rejestrowanie się w celu otrzymywania zdalnych powiadomień.

Aby ustanowić sesje TLS oparte na protokole HTTP / 2 z APN, musisz upewnić się, że certyfikat główny GeoTrust Global CA jest zainstalowany na każdym z dostawców. Jeśli dostawca korzysta z systemu macOS, ten certyfikat główny znajduje się domyślnie w pęku kluczy. W innych systemach ten certyfikat może wymagać jawnej instalacji. Możesz pobrać ten certyfikat ze strony GeoTrust Root Certificates. Oto bezpośredni link do certyfikatu.

Rysunek 1-3 ilustruje użycie interfejsu API dostawcy APN opartego na protokole HTTP / 2 do ustanowienia zaufania oraz użycie tokenów uwierzytelniania dostawcy JWT do wysyłania powiadomień.

Rysunek 1-3 Ustanawianie i używanie zaufania połączenia dostawcy opartego na tokenach

obraz: ../Art/service_provider_ct.jpg

Jak pokazano na rysunku 1-3, zaufanie dostawcy opartego na tokenach działa w następujący sposób:

Twój dostawca prosi o bezpieczne połączenie z APN przy użyciu zabezpieczeń warstwy transportowej (TLS), co na rysunku przedstawia strzałka oznaczona „Inicjacja TLS”.

Następnie APNs przekazuje twojemu dostawcy certyfikat APN, reprezentowany przez następną strzałkę na rysunku (oznaczony jako „certyfikat APNs”), który następnie weryfikuje twój dostawca.

W tym momencie zostaje ustanowione zaufanie połączenia, a serwer dostawcy może wysyłać żądania zdalnego powiadomienia wypychanego oparte na tokenach do APN. Każdemu żądaniu powiadomienia, które wysyła Twój dostawca, musi towarzyszyć token uwierzytelniania JWT przedstawiony na rysunku jako strzałka oznaczona „Powiadomienie push”.

APN odpowiada na każde wypchnięcie, przedstawione na rysunku jako strzałka z etykietą „Odpowiedź HTTP / 2”.

Aby uzyskać szczegółowe informacje na temat odpowiedzi, które dostawca może otrzymać w tym kroku, zobacz odpowiedź HTTP / 2 z APN.

Rysunek 1-4 ilustruje użycie certyfikatu SSL wydanego przez Apple do ustanowienia zaufania między dostawcą a APN. W przeciwieństwie do rysunku 1-3, rysunek ten nie przedstawia samego powiadomienia push, ale zatrzymuje się w momencie ustanowienia połączenia Transport Layer Security (TLS). W schemacie zaufania opartym na certyfikatach żądania powiadomień wypychanych nie są uwierzytelniane, ale są weryfikowane przy użyciu towarzyszącego tokenu urządzenia.

Rysunek 1-4 Ustanawianie opartego na certyfikacie zaufania połączenia dostawcy

obraz: ../Art/service_provider_ct_certificate_2x.png

Jak pokazano na rysunku 1-4, zaufanie oparte na certyfikatach między dostawcami a APN działa w następujący sposób:

Twój dostawca prosi o bezpieczne połączenie z APN przy użyciu zabezpieczeń warstwy transportowej (TLS), co na rysunku przedstawia strzałka oznaczona „Inicjacja TLS”.

Następnie APNs przekazuje twojemu dostawcy certyfikat APN, reprezentowany przez następną strzałkę na rysunku (oznaczony jako „certyfikat APNs”), który następnie weryfikuje twój dostawca.

Twój dostawca musi następnie wysłać swój certyfikat dostawcy obsługiwany przez Apple (który wcześniej uzyskałeś z konta programisty online, jak wyjaśniono w sekcji „Generowanie uniwersalnego certyfikatu SSL klienta APNs” w Pomocy Xcode) z powrotem do APN, oznaczonego strzałką oznaczoną „Dostawca certyfikat."

Następnie APN weryfikuje certyfikat dostawcy, potwierdzając w ten sposób, że żądanie połączenia pochodzi od legalnego dostawcy i ustanawia połączenie TLS.

W tym momencie zostaje ustanowione zaufanie połączenia, a serwer dostawcy może wysyłać oparte na certyfikatach żądania zdalnych powiadomień push do APN.

Zaufanie do połączeń APN-to-urządzenie i tokeny urządzeń

Zaufanie między APN a każdym urządzeniem jest ustanawiane automatycznie, bez udziału Twojej aplikacji, zgodnie z opisem w tej sekcji.

Każde urządzenie posiada certyfikat kryptograficzny oraz prywatny klucz kryptograficzny, dostarczany przez system operacyjny przy początkowej aktywacji urządzenia i przechowywany w pęku kluczy urządzenia. Podczas aktywacji APN uwierzytelnia i weryfikuje połączenie z urządzeniem na podstawie certyfikatu i klucza, jak pokazano na rysunku 6-5.

Rysunek 1-5 Ustanawianie zaufania połączenia między urządzeniem a APN

obraz: ../Art/service_device_ct.jpg

Jak pokazano na rysunku 1-5, zaufanie APN-do-urządzenia działa w następujący sposób:

  • Negocjacja zaufania rozpoczyna się, gdy urządzenie zainicjuje połączenie TLS z APN, jak pokazano na górnej strzałce na rysunku.
  • APNs zwraca certyfikat APNs do urządzenia.
  • System operacyjny sprawdza poprawność tego certyfikatu, a następnie, zgodnie ze strzałką „Certyfikat urządzenia”, wysyła certyfikat urządzenia do APN.
  • Wreszcie, jak wskazuje dolna strzałka na rysunku, punkty APN sprawdzają certyfikat urządzenia, ustanawiając zaufanie.
  • Po nawiązaniu połączenia TLS między APN a urządzeniem aplikacje na urządzeniu mogą zarejestrować się w APN, aby otrzymywać tokeny urządzenia specyficzne dla aplikacji na potrzeby zdalnych powiadomień. Aby uzyskać szczegółowe informacje i przykłady kodu, zobacz Rejestracja w celu otrzymywania zdalnych powiadomień w sekcji Konfigurowanie obsługi zdalnych powiadomień.

Po otrzymaniu tokenu urządzenia aplikacja musi połączyć się ze skojarzonym dostawcą aplikacji i przekazać mu token. Ten krok jest konieczny, ponieważ dostawca musi dołączyć token urządzenia później, gdy wysyła żądanie powiadomienia do APN, kierując je na urządzenie. Kod, który napiszesz w celu przekazania tokenu, jest również wyświetlany w sekcji Rejestracja w celu otrzymywania zdalnych powiadomień.

Niezależnie od tego, czy użytkownik aktywuje urządzenie po raz pierwszy, czy też APN wystawił nowy token urządzenia, proces jest podobny i pokazano na rysunku 6-6.

Rysunek 1-6 Zarządzanie tokenem urządzenia

image: ../Art/token_generation.jpg

Uzyskiwanie i obsługa tokenu urządzenia specyficznego dla aplikacji działa w następujący sposób:

Twoja aplikacja rejestruje się w APN dla zdalnych powiadomień, jak pokazano na górnej strzałce. Jeśli aplikacja jest już zarejestrowana, a token urządzenia specyficzny dla aplikacji nie zmienił się, system szybko zwraca istniejący token do aplikacji, a ten proces przechodzi do kroku 4.

Gdy potrzebny jest nowy token urządzenia, APN generuje go na podstawie informacji zawartych w certyfikacie urządzenia. Szyfruje token za pomocą klucza tokena i zwraca go do urządzenia, jak pokazano na środkowej, skierowanej w prawo strzałce.

System dostarcza token urządzenia z powrotem do Twojej aplikacji, wywołując aplikację: didRegisterForRemoteNotificationsWithDeviceToken: delegate.

Po otrzymaniu tokenu Twoja aplikacja (w ramach metody delegata) musi przekazać go do dostawcy w formacie binarnym lub szesnastkowym. Twój dostawca nie może wysyłać powiadomień do urządzenia bez tego tokena. Aby uzyskać szczegółowe informacje, zobacz Rejestracja w celu otrzymywania zdalnych powiadomień w sekcji Konfigurowanie obsługi zdalnych powiadomień.

WAŻNY

Tokeny urządzeń APN mają zmienną długość. Nie koduj ich rozmiaru na stałe.

Gdy Twój dostawca wysyła żądanie powiadomienia wypychanego do APN, zawiera token urządzenia, który identyfikuje unikalną kombinację aplikacji i urządzenia. Ten krok jest pokazany na strzałce „Token, ładunek” między dostawcą a APN na rysunku 6-7. APN odszyfrowuje token, aby zapewnić ważność żądania i określić urządzenie docelowe. Jeśli APN stwierdzi, że nadawca i odbiorca są wiarygodni, wysyła powiadomienie do zidentyfikowanego urządzenia.

Rysunek 1-7 Ścieżka zdalnego powiadomienia od dostawcy do urządzenia

obraz: ../Art/token_trust.jpg

Gdy urządzenie otrzyma powiadomienie (i po ostatnim kroku pokazanym na rysunku 1-7), system przekaże zdalne powiadomienie do Twojej aplikacji.

Ref: Usługa powiadomień push firmy Apple

Teraz spójrz tutaj, aby zrozumieć przepływ techniczny: Jak wdrożyć usługę Apple Push Notification Service w aplikacji iOS?

Krunal
źródło
7
Haha, dosłownie właśnie wkleiłeś cały wpis Apple Docs do SO!
Matt Mc
@MattMc - Tak, byłem nowicjuszem w SO, kiedy opublikowałem tę odpowiedź iw tym czasie zamieściłem link do APNS, ale link nie jest uważany za odpowiedź na SO, więc zrobiłem to .... :)
Krunal
1
To prawda, o wiele lepsze niż odpowiedź typu „tylko link”;)
Matt Mc
14

Urządzenie nie odpytuje serwera w celu uzyskania powiadomień push.

Aby to uprościć, rozważ, że iPhone jest podłączony do Internetu. Podczas łączenia się z Internetem iPhone ustanawia połączenie z serwerem Apple Push Notifications, to połączenie jest połączeniem otwartym, co oznacza, że ​​dane mogą być przesyłane do iPhone'a z serwera w momencie, gdy dane dotrą do serwera.

Apple nie używa protokołu HTTP do powiadomień push, ale jeśli rozumiesz protokół HTTP, jest to prawie podobna metodologia.

http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push

user4248688
źródło
Czego używają, jeśli nie http?
Howiecamp
2

W tym artykule jest naprawdę fajne wyjaśnienie powiadomień push .

W systemie iOS aplikacje nie mogą wiele robić w tle. Aplikacje mogą wykonywać tylko ograniczoną liczbę czynności, aby oszczędzać baterię.

Ale co się stanie, jeśli wydarzy się coś interesującego i chcesz poinformować o tym użytkownika, nawet jeśli obecnie nie korzysta z Twojej aplikacji?

Tarek
źródło