国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

widuu / 1956人閱讀

摘要:前言升級(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) Http2ApnsConnection

Http2ApnsConnection 類(lèi)負(fù)責(zé) ssl socket 鏈接的建立,心跳包發(fā)送以及通過(guò) http2 multiple stream 在一個(gè) 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 開(kāi)發(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65883.html

相關(guān)文章

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

    摘要:由于蘋(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è)比較...

    The question 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<