Ho un compito apparentemente normale di inviare notifiche push ai dispositivi Apple da un server scritto in Java. Non l'ho mai fatto in passato, quindi sono andato ai tutorial e alla documentazione Apple.
1) La API del provider APN afferma che il protocollo per inviare notifiche push dal server è HTTP / 2. Non sono riuscito a trovare alcun tutorial che descrivesse come farlo (volevo quelli per lo più come un segno che non sono il primo a farlo e forse per i riferimenti agli strumenti / librerie più popolari). Ho trovato diversi tutorial ( tutorial di Ray Wenderlich probabilmente tra i più citati) che insegnano come inviare notifiche push usando il protocollo binario. La maggior parte dei progetti GitHub lo utilizza (ad esempio un "notifica push kit di simulazione da un tutorial di Ray Wenderlich", un popolare " pushmeup " rubino gemma, molto popolare notnoop / java-apns libreria e così via). Ora i documenti Apple hanno una sezione per API di provider binari che afferma che
The legacy binary interface required your provider server to employ the binary API described in this appendix. All developers should migrate their remote notification provider servers to the more capable and more efficient HTTP/2-based API described in APNs Provider API.
Questo sicuramente suona come non dovrei usare l'API binaria per il nuovo sviluppo ... Ancora di più dal momento che l'API binaria richiede l'utilizzo (polling periodico) di un servizio di feedback separato per i token dispositivo "morto" (oppure tu potrebbero essere bloccati, dicono), mentre la nuova API HTTP / 2 fornisce queste informazioni come risposta a ogni singola richiesta, che sembra meno parti mobili.
Come per HTTP / 2, c'è una libreria Java CleverTap / apns-http2 che è anche relativamente popolare, ma usa il client Jetty HTTP / 2, e affinché funzioni un deve iniziare JVM con un jar ALPN sul percorso di classe di avvio e quel jar corrisponde approssimativamente 1-to -1 con le versioni JDK (il che significa che se lo sviluppo utilizza 1.8.0u92 e la produzione utilizza 1.8.0u91, allora dovrebbero essere messi diversi jar). Mi sembra una configurazione molto fragile per me in generale e difficile da applicare nel mio caso (ogni sviluppatore ha il proprio VM + common dev VM + test server + prod) - Non penso valga la pena di bloccare una versione su tutte le macchine e che queste non divergeranno col tempo; tutto quello che so è che tutti usano JDK 8, ma le versioni minori sono fuori dal mio controllo. Questa necessità per il barattolo ALPN sarà il caso fino a quando JDK 9 sarà fuori (e adottato ampiamente), il che significa più di 1 anno, ed è il caso per Jetty e Netty e okhttp3 e credo che qualsiasi libreria Java.
2) Come se non bastasse, ci sono anche due schemi di autenticazione descritti dai documenti Apple: usando un certificato ("vecchio stile") vs usando JWT . L'approccio del certificato è provato e vero, ma dai documenti sembra che il certificato debba essere rigenerato ogni anno mentre i JWT non lo fanno (o per essere più precisi i JWT vengono rigenerati ogni ora automaticamente e così saranno inseriti nell'applicazione e, si spera, non richiederà alcuna azione amministrativa manuale che possa essere dimenticata, ecc.). L'unico problema con JWT per me è che
After you create the token, you must sign it with a private key as described in Creating a Universal Provider Token Signing Key in App Distribution Guide.
Il problema è che non c'è una tale sezione o titolo o qualcosa in quella guida. Forse questo passaggio è molto semplice, ma non avendo alcuna esperienza pratica con la sicurezza iOS in particolare e poca esperienza con la crittografia in generale temo che mi manchi qualcosa qui. Posso chiedere aiuto ai nostri sviluppatori iOS ma non sono nemmeno sicuro che questo approccio sia abbastanza maturo se riesco a trovare zero tutorial di lavoro.
Quindi, le mie domande sono infine (selezionale):
- Mi manca qualcosa e c'è un modo per seguire le linee guida di Apple e la soluzione è ragionevolmente semplice?
- Quanto è probabile che il protocollo binario venga terminato "presto"?
- Dovrei scegliere il protocollo binario o HTTP / 2?
- Se è quest'ultimo, dovrei continuare a utilizzare JWT o utilizzare un certificato più pratico?
- Forse la situazione (principalmente con HTTP / 2) è molto migliore in alcune altre lingue / piattaforme server? Potrei anche pensare di avere un servizio separato solo per l'invio di spinte iOS fatte in questo se ciò significa saltare attraverso meno cerchi.
Grazie, mi dispiace per il lungo testo.