成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Apple APNS http2 Provider 開發(fā) 使用 okHttp

widuu / 1955人閱讀

摘要:前言升級了后臺推送接口,使用協(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) Http2ApnsConnection

Http2ApnsConnection 類負(fù)責(zé) ssl socket 鏈接的建立,心跳包發(fā)送以及通過 http2 multiple stream 在一個 frame 中發(fā)送多條 push notification

創(chuàng)建 ssl socket
private 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
headers = 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); }
發(fā)送 http2 data
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

相關(guān)文章

  • Python使用HTTP2實現(xiàn)蘋果原生推送

    摘要:由于蘋果原生蛋疼的協(xié)議致使本來很簡單的個推送服務(wù)讓人望而卻步。直到蘋果最近的協(xié)議的出現(xiàn)才有所改善。如果推送失敗后蘋果的推送服務(wù)器會返回個錯誤的信息。結(jié)語雖然通過使用來實現(xiàn)蘋果的推送服務(wù)是個比較簡單的事情甚至?xí)X得比較枯燥無味的事情。 原文地址: http://52sox.com/python-use-h... 說起蘋果的推送,可能很多開發(fā)人員就開始頭疼了,因為實現(xiàn)蘋果推送服務(wù)是1個比較...

    The question 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<