摘要:前言升級(jí)了后臺(tái)推送接口,使用協(xié)議,提高了的最大大小,本文介紹新版實(shí)現(xiàn)方法基于框架框架不要使用的類(lèi)直接發(fā)送請(qǐng)求,因?yàn)榈讓与m然使用了,可以設(shè)置和,但是超過(guò),鏈接還是會(huì)斷開(kāi),而官方建議保持長(zhǎng)鏈接所以最好自建長(zhǎng)鏈接,使用底層的類(lèi)來(lái)直接發(fā)送請(qǐng)求,并通
前言
Apple 升級(jí)了后臺(tái)推送接口,使用 http2 協(xié)議,提高了 payload 的最大大?。?k),本文介紹新版 APNS 實(shí)現(xiàn)方法
基于 okhttp 框架 http2 框架不要使用 okhttp3 的 Request 類(lèi)直接發(fā)送 post 請(qǐng)求,因?yàn)?http3 底層雖然使用了 ConnectionPool,可以設(shè)置 keep alive 和 keep alive duration,但是超過(guò) keep alive duration,鏈接還是會(huì)斷開(kāi),而 Apple 官方建議保持長(zhǎng)鏈接!
所以最好自建 socket 長(zhǎng)鏈接,使用 okhttp3 底層的 FramedConnection 類(lèi)來(lái)直接發(fā)送 http2
請(qǐng)求,并通過(guò)定時(shí) PING 幀來(lái)保持鏈接
在實(shí)際開(kāi)發(fā)中,Apple 的 development 環(huán)境也非常不穩(wěn)定,經(jīng)常 鏈接超時(shí) 和 ssl 握手超時(shí),大多數(shù)情況下只能建立一個(gè)鏈接,第二個(gè)連接要么連不上,要么在 ssl 握手?jǐn)嚅_(kāi)
實(shí)現(xiàn) Http2ApnsConnectionHttp2ApnsConnection 類(lèi)負(fù)責(zé) ssl socket 鏈接的建立,心跳包發(fā)送以及通過(guò) http2 multiple stream 在一個(gè) 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 開(kāi)發(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65883.html
摘要:由于蘋(píng)果原生蛋疼的協(xié)議致使本來(lái)很簡(jiǎn)單的個(gè)推送服務(wù)讓人望而卻步。直到蘋(píng)果最近的協(xié)議的出現(xiàn)才有所改善。如果推送失敗后蘋(píng)果的推送服務(wù)器會(huì)返回個(gè)錯(cuò)誤的信息。結(jié)語(yǔ)雖然通過(guò)使用來(lái)實(shí)現(xiàn)蘋(píng)果的推送服務(wù)是個(gè)比較簡(jiǎn)單的事情甚至?xí)X(jué)得比較枯燥無(wú)味的事情。 原文地址: http://52sox.com/python-use-h... 說(shuō)起蘋(píng)果的推送,可能很多開(kāi)發(fā)人員就開(kāi)始頭疼了,因?yàn)閷?shí)現(xiàn)蘋(píng)果推送服務(wù)是1個(gè)比較...
閱讀 3629·2021-11-24 09:39
閱讀 2569·2021-11-15 11:37
閱讀 2224·2021-11-11 16:55
閱讀 5260·2021-10-14 09:43
閱讀 3717·2021-10-08 10:05
閱讀 3020·2021-09-13 10:26
閱讀 2339·2021-09-08 09:35
閱讀 3549·2019-08-30 15:55