摘要:前言升級了后臺推送接口,使用協(xié)議,提高了的最大大小,本文介紹新版實現(xiàn)方法基于框架框架不要使用的類直接發(fā)送請求,因為底層雖然使用了,可以設(shè)置和,但是超過,鏈接還是會斷開,而官方建議保持長鏈接所以最好自建長鏈接,使用底層的類來直接發(fā)送請求,并通
前言
Apple 升級了后臺推送接口,使用 http2 協(xié)議,提高了 payload 的最大大?。?k),本文介紹新版 APNS 實現(xiàn)方法
基于 okhttp 框架 http2 框架不要使用 okhttp3 的 Request 類直接發(fā)送 post 請求,因為 http3 底層雖然使用了 ConnectionPool,可以設(shè)置 keep alive 和 keep alive duration,但是超過 keep alive duration,鏈接還是會斷開,而 Apple 官方建議保持長鏈接!
所以最好自建 socket 長鏈接,使用 okhttp3 底層的 FramedConnection 類來直接發(fā)送 http2
請求,并通過定時 PING 幀來保持鏈接
在實際開發(fā)中,Apple 的 development 環(huán)境也非常不穩(wěn)定,經(jīng)常 鏈接超時 和 ssl 握手超時,大多數(shù)情況下只能建立一個鏈接,第二個連接要么連不上,要么在 ssl 握手?jǐn)嚅_
實現(xiàn) Http2ApnsConnectionHttp2ApnsConnection 類負(fù)責(zé) ssl socket 鏈接的建立,心跳包發(fā)送以及通過 http2 multiple stream 在一個 frame 中發(fā)送多條 push notification
創(chuàng)建 ssl socketprivate Socket createSocket() throws IOException { debug("connect socket"); Socket socket = new Socket(); socket.connect(new InetSocketAddress(host, port)); debug("socket connected"); SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket( socket, host, port, true); sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"}); sslSocket.setKeepAlive(true); debug("start ssl handshake"); sslSocket.startHandshake(); debug("handshake success"); return sslSocket; }創(chuàng)建 frame connection
private void createFramedConnection() throws IOException { debug("createFramedConnection"); Socket socket = createSocket(); framedConnection = new FramedConnection.Builder(true) .socket(socket) .protocol(Protocol.HTTP_2) .listener(this) .build(); framedConnection.sendConnectionPreface(); framedConnectionAlive = true; pingFuture = pingService.scheduleAtFixedRate(new PingTask(), 0, PING_PERIOD, TimeUnit.SECONDS); }發(fā)送 http2 header
private void sendHeader(String token, int contentLength) throws IOException { // 創(chuàng)建 http2 header,參考 apple apns 開發(fā)文檔 List發(fā)送 http2 dataheaders = Arrays.asList(METHOD_POST_HEADER, SCHEME_HEADER, USER_AGENT_HEADER, CONTENT_TYPE_HEADER, new Header(":path", "/3/device/" + token), new Header("authority", host), new Header("content-length", String.valueOf(contentLength))); // 創(chuàng)建 stream framedStream = framedConnection.newStream(headers, true, true); framedStream.readTimeout().timeout(timeOut, TimeUnit.MILLISECONDS); framedStream.writeTimeout().timeout(timeOut, TimeUnit.MILLISECONDS); }
private void sendData(byte[] bytes) throws IOException { Buffer buffer = new Buffer(); buffer.write(bytes); framedStream.getSink().write(buffer, bytes.length); framedStream.getSink().flush(); }Http2ApnsConnectionPool Http2ApnsService 基于 netty 框架
整體代碼結(jié)構(gòu)和 基于 okhttp 框架的差不多,可以參考 https://github.com/black-bamb...
總結(jié)文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65883.html
摘要:由于蘋果原生蛋疼的協(xié)議致使本來很簡單的個推送服務(wù)讓人望而卻步。直到蘋果最近的協(xié)議的出現(xiàn)才有所改善。如果推送失敗后蘋果的推送服務(wù)器會返回個錯誤的信息。結(jié)語雖然通過使用來實現(xiàn)蘋果的推送服務(wù)是個比較簡單的事情甚至?xí)X得比較枯燥無味的事情。 原文地址: http://52sox.com/python-use-h... 說起蘋果的推送,可能很多開發(fā)人員就開始頭疼了,因為實現(xiàn)蘋果推送服務(wù)是1個比較...
閱讀 3627·2021-11-24 09:39
閱讀 2567·2021-11-15 11:37
閱讀 2222·2021-11-11 16:55
閱讀 5245·2021-10-14 09:43
閱讀 3716·2021-10-08 10:05
閱讀 3019·2021-09-13 10:26
閱讀 2337·2021-09-08 09:35
閱讀 3548·2019-08-30 15:55