系統(tǒng)推送的集成(十三) —— 本地和遠(yuǎn)程通知編程指南之Legacy信息 - Legacy通知格式(二)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.07.15

前言

我們做APP很多時(shí)候都需要推送功能座每,以直播為例,如果你關(guān)注的主播開播了,那么就需要向關(guān)注這個(gè)主播的人發(fā)送開播通知既棺,提醒用戶去看播讽挟,這個(gè)只是一個(gè)小的方面,具體應(yīng)用根據(jù)公司的業(yè)務(wù)邏輯而定丸冕。前面已經(jīng)花了很多篇幅介紹了極光推送,其實(shí)極光推送無非就是將我們客戶端和服務(wù)端做的很多東西封裝了一下薛窥,節(jié)省了我們很多處理邏輯和流程胖烛,這一篇開始,我們就利用系統(tǒng)的原生推送類結(jié)合工程實(shí)踐說一下系統(tǒng)推送的集成诅迷,希望我的講解能讓大家很清楚的理解它佩番。感興趣的可以看上面幾篇。
1. 系統(tǒng)推送的集成(一) —— 基本集成流程(一)
2. 系統(tǒng)推送的集成(二) —— 推送遇到的幾個(gè)坑之BadDeviceToken問題(一)
3. 系統(tǒng)推送的集成(三) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 本地和遠(yuǎn)程通知概覽(一)
4. 系統(tǒng)推送的集成(四) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 管理您的應(yīng)用程序的通知支持(二)
5. 系統(tǒng)推送的集成(五) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 調(diào)度和處理本地通知(三)
6. 系統(tǒng)推送的集成(六) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 配置遠(yuǎn)程通知支持(四)
7. 系統(tǒng)推送的集成(七) —— 本地和遠(yuǎn)程通知編程指南之你的App的通知 - 修改和顯示通知(五)
8. 系統(tǒng)推送的集成(八) —— 本地和遠(yuǎn)程通知編程指南之蘋果推送通知服務(wù)APNs - APNs概覽(一)
9. 系統(tǒng)推送的集成(九) —— 本地和遠(yuǎn)程通知編程指南之蘋果推送通知服務(wù)APNs - 創(chuàng)建遠(yuǎn)程通知Payload(二)
10. 系統(tǒng)推送的集成(十) —— 本地和遠(yuǎn)程通知編程指南之蘋果推送通知服務(wù)APNs - 與APNs通信(三)
11. 系統(tǒng)推送的集成(十一) —— 本地和遠(yuǎn)程通知編程指南之蘋果推送通知服務(wù)APNs - Payload Key參考(四)
12. 系統(tǒng)推送的集成(十二) —— 本地和遠(yuǎn)程通知編程指南之Legacy信息 - 二進(jìn)制Provider API(一)

Legacy Notification Format - Legacy通知格式

新開發(fā)應(yīng)使用現(xiàn)代格式連接到APNs罢杉,如 Communicating with APNs中所述趟畏。

這些格式不包括優(yōu)先權(quán); 假設(shè)優(yōu)先級(jí)為10。

圖B-1顯示了這種格式滩租。

Figure B-1 Legacy notification format

legacy格式中的第一個(gè)字節(jié)是命令值0(零)赋秀。 其他字段與增強(qiáng)格式相同。 Listing B-1給出了一個(gè)函數(shù)示例律想,該函數(shù)使用legacy通知格式通過二進(jìn)制接口向APNs發(fā)送遠(yuǎn)程通知猎莲。 該示例假設(shè)先前SSL連接到gateway.push.apple.com(或gateway.sandbox.push.apple.com)和對(duì)等交換驗(yàn)證。

// Listing B-1 Sending a notification in the legacy format via the binary interface

static bool sendPayload(SSL *sslPtr, char *deviceTokenBinary, char *payloadBuff, size_t payloadLength)
{
    bool rtn = false;
    if (sslPtr && deviceTokenBinary && payloadBuff && payloadLength)
    {
        uint8_t command = 0; /* command number */
        char binaryMessageBuff[sizeof(uint8_t) + sizeof(uint16_t) +
            DEVICE_BINARY_SIZE + sizeof(uint16_t) + MAXPAYLOAD_SIZE];
        /* message format is, |COMMAND|TOKENLEN|TOKEN|PAYLOADLEN|PAYLOAD| */
        char *binaryMessagePt = binaryMessageBuff;
        uint16_t networkOrderTokenLength = htons(DEVICE_BINARY_SIZE);
        uint16_t networkOrderPayloadLength = htons(payloadLength);
        /* command */
        *binaryMessagePt++ = command;
 
       /* token length network order */
        memcpy(binaryMessagePt, &networkOrderTokenLength, sizeof(uint16_t));
        binaryMessagePt += sizeof(uint16_t);
 
        /* device token */
        memcpy(binaryMessagePt, deviceTokenBinary, DEVICE_BINARY_SIZE);
        binaryMessagePt += DEVICE_BINARY_SIZE;
 
        /* payload length network order */
        memcpy(binaryMessagePt, &networkOrderPayloadLength, sizeof(uint16_t));
        binaryMessagePt += sizeof(uint16_t);
        /* payload */
        memcpy(binaryMessagePt, payloadBuff, payloadLength);
        binaryMessagePt += payloadLength;
        if (SSL_write(sslPtr, binaryMessageBuff, (binaryMessagePt - binaryMessageBuff)) > 0)
        rtn = true;
        }
    return rtn;
}

Enhanced Notification Format - 增強(qiáng)的通知格式

增強(qiáng)格式與legacy格式相比有幾處改進(jìn):

  • Error response - 錯(cuò)誤響應(yīng)技即。使用legacy格式著洼,如果您發(fā)送以某種方式格式錯(cuò)誤的通知數(shù)據(jù)包 - 例如,有效負(fù)載超出規(guī)定的限制 - APNs通過切斷連接進(jìn)行響應(yīng)而叼。它沒有說明它拒絕通知的原因身笤。增強(qiáng)格式允許提供者使用任意標(biāo)識(shí)符標(biāo)記通知。如果存在錯(cuò)誤葵陵,APNs將返回將錯(cuò)誤代碼與標(biāo)識(shí)符相關(guān)聯(lián)的數(shù)據(jù)包液荸。此響應(yīng)使provider能夠定位并更正格式錯(cuò)誤的通知。

  • Notification expiration - 通知到期埃难。 APNs具有存儲(chǔ)轉(zhuǎn)發(fā)功能莹弊,可將最新通知發(fā)送到設(shè)備上的應(yīng)用程序。如果設(shè)備在交付時(shí)處于脫機(jī)狀態(tài)涡尘,則APNs會(huì)在設(shè)備下次聯(lián)機(jī)時(shí)發(fā)送通知忍弛。使用legacy格式,無論通知的相關(guān)性如何考抄,都會(huì)發(fā)送通知细疚。換句話說,通知隨著時(shí)間的推移會(huì)變得“陳舊”川梅。增強(qiáng)格式包括指示通知有效期的到期值疯兼。當(dāng)此期限到期時(shí)然遏,APNs會(huì)在存儲(chǔ)轉(zhuǎn)發(fā)中丟棄通知。

圖B-2描述了通知數(shù)據(jù)包的格式吧彪。

Figure B-2 Enhanced notification format

通知格式中的第一個(gè)字節(jié)是命令值1待侵,其余字段如下:

  • Identifier - 標(biāo)識(shí)符 - 標(biāo)識(shí)此通知的任意值。 如果APNs無法解釋通知姨裸,則在錯(cuò)誤響應(yīng)數(shù)據(jù)包中返回相同的標(biāo)識(shí)符秧倾。

  • Expiry - 到期 - 以秒(UTC)表示的固定UNIX紀(jì)元日期,用于標(biāo)識(shí)通知何時(shí)不再有效且可以丟棄傀缩。 到期值使用網(wǎng)絡(luò)字節(jié)順序(大端)那先。 如果到期值非零,則APNs嘗試至少傳遞一次通知赡艰。 指定零以請(qǐng)求APNs根本不存儲(chǔ)通知售淡。

  • Token length - 令牌長度 - 設(shè)備令牌網(wǎng)絡(luò)順序的長度(即大端)

  • Device token - 設(shè)備令牌 - 二進(jìn)制形式的設(shè)備令牌。

  • Payload length - 有效負(fù)載長度 - 網(wǎng)絡(luò)順序中有效負(fù)載的長度(即大端)慷垮。 有效負(fù)載不得超過256個(gè)字節(jié)揖闸,且不得以空值終止。

  • Payload - 有效負(fù)載 - 通知負(fù)載换帜。

Listing B-2在將其發(fā)送到APNs之前以增強(qiáng)格式組成遠(yuǎn)程通知楔壤。 它假設(shè)優(yōu)先SSL連接到gateway.push.apple.com(或gateway.sandbox.push.apple.com)和對(duì)等交換驗(yàn)證。

// Listing B-2 Sending a notification in the enhanced format via the binary interface

static bool sendPayload(SSL *sslPtr, char *deviceTokenBinary, char *payloadBuff, size_t payloadLength)
{
  bool rtn = false;
  if (sslPtr && deviceTokenBinary && payloadBuff && payloadLength)
  {
      uint8_t command = 1; /* command number */
      char binaryMessageBuff[sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint16_t) +
          DEVICE_BINARY_SIZE + sizeof(uint16_t) + MAXPAYLOAD_SIZE];
      /* message format is, |COMMAND|ID|EXPIRY|TOKENLEN|TOKEN|PAYLOADLEN|PAYLOAD| */
      char *binaryMessagePt = binaryMessageBuff;
      uint32_t whicheverOrderIWantToGetBackInAErrorResponse_ID = 1234;
      uint32_t networkOrderExpiryEpochUTC = htonl(time(NULL)+86400); // expire message if not delivered in 1 day
      uint16_t networkOrderTokenLength = htons(DEVICE_BINARY_SIZE);
      uint16_t networkOrderPayloadLength = htons(payloadLength);
 
      /* command */
      *binaryMessagePt++ = command;
 
     /* provider preference ordered ID */
     memcpy(binaryMessagePt, &whicheverOrderIWantToGetBackInAErrorResponse_ID, sizeof(uint32_t));
     binaryMessagePt += sizeof(uint32_t);
    /* expiry date network order */
     memcpy(binaryMessagePt, &networkOrderExpiryEpochUTC, sizeof(uint32_t));
     binaryMessagePt += sizeof(uint32_t);
 
     /* token length network order */
      memcpy(binaryMessagePt, &networkOrderTokenLength, sizeof(uint16_t));
      binaryMessagePt += sizeof(uint16_t);
 
      /* device token */
      memcpy(binaryMessagePt, deviceTokenBinary, DEVICE_BINARY_SIZE);
      binaryMessagePt += DEVICE_BINARY_SIZE;
      /* payload length network order */
      memcpy(binaryMessagePt, &networkOrderPayloadLength, sizeof(uint16_t));
      binaryMessagePt += sizeof(uint16_t);
 
      /* payload */
      memcpy(binaryMessagePt, payloadBuff, payloadLength);
      binaryMessagePt += payloadLength;
      if (SSL_write(sslPtr, binaryMessageBuff, (binaryMessagePt - binaryMessageBuff)) > 0)
          rtn = true;
  }
  return rtn;
}

后記

本篇主要講述了Legacy通知格式惯驼,感興趣的給個(gè)贊或者關(guān)注~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹲嚣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子祟牲,更是在濱河造成了極大的恐慌隙畜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件说贝,死亡現(xiàn)場離奇詭異议惰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乡恕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門言询,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傲宜,你說我怎么就攤上這事运杭。” “怎么了函卒?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵辆憔,是天一觀的道長。 經(jīng)常有香客問我,道長虱咧,這世上最難降的妖魔是什么熊榛? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮腕巡,結(jié)果婚禮上玄坦,老公的妹妹穿的比我還像新娘。我一直安慰自己绘沉,他們只是感情好营搅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梆砸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪园欣。 梳的紋絲不亂的頭發(fā)上帖世,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音沸枯,去河邊找鬼日矫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绑榴,可吹牛的內(nèi)容都是我干的哪轿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼翔怎,長吁一口氣:“原來是場噩夢啊……” “哼窃诉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赤套,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤飘痛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后容握,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣脉,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年剔氏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塑猖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谈跛,死狀恐怖羊苟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情币旧,我是刑警寧澤践险,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響巍虫,放射性物質(zhì)發(fā)生泄漏彭则。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一占遥、第九天 我趴在偏房一處隱蔽的房頂上張望俯抖。 院中可真熱鬧,春花似錦瓦胎、人聲如沸芬萍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柬祠。三九已至,卻和暖如春负芋,著一層夾襖步出監(jiān)牢的瞬間漫蛔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工旧蛾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莽龟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓锨天,卻偏偏與公主長得像毯盈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子病袄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容