系統(tǒng)推送的集成(九) —— 本地和遠程通知編程指南之蘋果推送通知服務(wù)APNs - 創(chuàng)建遠程通知Payload(二)

版本記錄

版本號 時間
V1.0 2018.07.14

前言

我們做APP很多時候都需要推送功能脚牍,以直播為例,如果你關(guān)注的主播開播了巢墅,那么就需要向關(guān)注這個主播的人發(fā)送開播通知诸狭,提醒用戶去看播,這個只是一個小的方面君纫,具體應(yīng)用根據(jù)公司的業(yè)務(wù)邏輯而定驯遇。前面已經(jīng)花了很多篇幅介紹了極光推送,其實極光推送無非就是將我們客戶端和服務(wù)端做的很多東西封裝了一下蓄髓,節(jié)省了我們很多處理邏輯和流程叉庐,這一篇開始,我們就利用系統(tǒng)的原生推送類結(jié)合工程實踐說一下系統(tǒng)推送的集成会喝,希望我的講解能讓大家很清楚的理解它陡叠。感興趣的可以看上面幾篇。
1. 系統(tǒng)推送的集成(一) —— 基本集成流程(一)
2. 系統(tǒng)推送的集成(二) —— 推送遇到的幾個坑之BadDeviceToken問題(一)
3. 系統(tǒng)推送的集成(三) —— 本地和遠程通知編程指南之你的App的通知 - 本地和遠程通知概覽(一)
4. 系統(tǒng)推送的集成(四) —— 本地和遠程通知編程指南之你的App的通知 - 管理您的應(yīng)用程序的通知支持(二)
5. 系統(tǒng)推送的集成(五) —— 本地和遠程通知編程指南之你的App的通知 - 調(diào)度和處理本地通知(三)
6. 系統(tǒng)推送的集成(六) —— 本地和遠程通知編程指南之你的App的通知 - 配置遠程通知支持(四)
7. 系統(tǒng)推送的集成(七) —— 本地和遠程通知編程指南之你的App的通知 - 修改和顯示通知(五)
8. 系統(tǒng)推送的集成(八) —— 本地和遠程通知編程指南之蘋果推送通知服務(wù)APNs - APNs概覽(一)

Creating the Remote Notification Payload - 創(chuàng)建遠程通知有效負載

provider服務(wù)器發(fā)送給Apple推送通知服務(wù)(APNs)的每個通知都包含一個有效負載肢执。 有效內(nèi)容包含您要發(fā)送到應(yīng)用程序的任何自定義數(shù)據(jù)枉阵,并包含有關(guān)系統(tǒng)應(yīng)如何通知用戶的信息。 您將此有效內(nèi)容構(gòu)造為JSON字典预茄,并將其作為HTTP / 2消息的正文內(nèi)容發(fā)送兴溜。 payload的最大大小取決于您發(fā)送的通知:

  • 對于常規(guī)遠程通知,最大大小為4KB(4096字節(jié))
  • 對于互聯(lián)網(wǎng)協(xié)議語音(VoIP)通知反璃,最大大小為5KB(5120字節(jié))

注意:如果您使用舊版APNs二進制接口發(fā)送通知而不是HTTP / 2請求昵慌,則最大有效負載大小為2KB(2048字節(jié))

APNs拒絕其有效負載超過允許的最大大小的通知。

由于無法保證遠程通知的傳遞淮蜈,因此請勿包含可通過有效負載中的其他方式檢索的敏感數(shù)據(jù)或數(shù)據(jù)斋攀。 而是使用通知來提醒用戶新信息,或者作為應(yīng)用程序有數(shù)據(jù)等待它的信號梧田。 例如淳蔼,電子郵件應(yīng)用程序可以使用遠程通知標(biāo)記應(yīng)用程序的圖標(biāo)或提醒用戶新電子郵件在特定帳戶中可用,而不是直接發(fā)送電子郵件的內(nèi)容裁眯。 收到通知后鹉梨,應(yīng)用程序應(yīng)打開與您的電子郵件服務(wù)器的直接連接以檢索電子郵件。


Creating the JSON Dictionary - 創(chuàng)建JSON字典

以下示例說明了JSON字典的結(jié)構(gòu)以及可以包含在通知中的密鑰穿稳。 payload中最重要的部分是aps字典存皂,它包含Apple定義的密鑰,用于確定接收通知的系統(tǒng)應(yīng)如何提醒用戶(如果有的話)。 這些示例還包括名稱包含字符串acme的鍵旦袋,其表示虛構(gòu)應(yīng)用程序包含的自定義數(shù)據(jù)骤菠。 盡管這些示例包括用于可讀性的空格和換行符,但實際上疤孕,您應(yīng)省略空格和換行符以減小有效負載的大小商乎。

示例1.以下有效內(nèi)容包含帶有簡單警報消息的aps字典。 acme2鍵包含一組特定于應(yīng)用程序的數(shù)據(jù)祭阀。

{
    "aps" : { "alert" : "Message received from Bob" },
    "acme2" : [ "bang",  "whiz" ]
}

示例2.以下payload要求系統(tǒng)顯示帶有“關(guān)閉”按鈕和單個操作按鈕的警報鹉戚。 titlebody鍵提供警報的內(nèi)容。 PLAY字符串用于從應(yīng)用程序的相應(yīng)Localizable.strings文件中檢索本地化字符串专控。 結(jié)果字符串由警報用作操作按鈕的標(biāo)題抹凳。 此payload還要求系統(tǒng)使用數(shù)字5標(biāo)記應(yīng)用程序的圖標(biāo)。

{
    "aps" : {
        "alert" : {
            "title" : "Game Request",
            "body" : "Bob wants to play poker",
            "action-loc-key" : "PLAY"
        },
        "badge" : 5
    },
    "acme1" : "bar",
    "acme2" : [ "bang",  "whiz" ]
}

示例3.以下payload指定設(shè)備應(yīng)顯示警報消息伦腐,播放聲音并標(biāo)記應(yīng)用程序的圖標(biāo)却桶。

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
    "acme1" : "bar",
    "acme2" : 42
}

示例4.以下payload使用loc-key在應(yīng)用程序的Localizable.strings文件中指定本地化字符串。 該字符串顯示為警報的消息蔗牡。 loc-args包含在顯示之前替換為字符串的值。 payload還指定要與警報一起播放的自定義聲音嗅剖。

{
    "aps" : {
        "alert" : {
            "loc-key" : "GAME_PLAY_REQUEST_FORMAT",
            "loc-args" : [ "Jenna", "Frank"]
        },
        "sound" : "chime.aiff"
    },
    "acme" : "foo"
}

有關(guān)可包含在通知payload中的Apple特定密鑰的完整列表辩越,請參閱 Payload Key Reference


Configuring a Background Update Notification - 配置后臺更新通知

后臺更新通知通過為您提供定期喚醒應(yīng)用程序的方式來改善用戶體驗信粮,以便它可以在后臺刷新其數(shù)據(jù)黔攒。 當(dāng)應(yīng)用程序長時間不運行時,其數(shù)據(jù)可能會過時强缘。 當(dāng)用戶最終再次啟動應(yīng)用程序時督惰,必須替換過時的數(shù)據(jù),這可能會導(dǎo)致使用該應(yīng)用程序的延遲旅掂。 后臺更新通知可以提醒用戶赏胚,也可以靜默發(fā)生。

重要:后臺更新通知并不意味著讓您的應(yīng)用程序在后臺保持清醒狀態(tài)而不是快速刷新操作商虐,也不是用于高優(yōu)先級更新觉阅。 APNs將后臺更新通知視為低優(yōu)先級,如果總數(shù)過多秘车,可能會完全限制其到達典勇。 實際限制是動態(tài)的,可以根據(jù)條件進行更改叮趴,但嘗試不要每小時發(fā)送多個通知割笙。

要支持后臺更新通知,請確保有效內(nèi)容的aps字典包含值為1的內(nèi)容可用密鑰眯亦。如果存在與后臺更新一起提供的用戶可見更新伤溉,則可以設(shè)置aps字典中的alert, sound, 和badge般码。

當(dāng)后臺更新通知發(fā)送到用戶的設(shè)備時,iOS會在后臺喚醒您的應(yīng)用程序并最多運行30秒谈火。 在iOS中侈询,系統(tǒng)通過調(diào)用application:didReceiveRemoteNotification:fetchCompletionHandler:應(yīng)用程序委托的方法應(yīng)用程序提供后臺更新通知。 使用該方法啟動獲取新數(shù)據(jù)所需的任何下載操作糯耍。 在后臺處理遠程通知需要您向應(yīng)用添加適當(dāng)?shù)谋尘澳J健?/p>

To configure your app to process background update notification - 配置應(yīng)用以處理后臺更新通知

  • 1)在Project Navigator中扔字,選擇您的項目。
  • 2)在編輯器中温技,選擇您的iOS應(yīng)用目標(biāo)革为。
  • 3)選擇Capabilities選項卡。
  • 4)啟用后臺模式功能舵鳞。
  • 5)啟用遠程通知后臺模式震檩。

Listing 7-1顯示了后臺更新通知的JSON payload示例。

// Listing 7-1Configuring a background update notification

{
    "aps" : {
        "content-available" : 1
    },
    "acme1" : "bar",
    "acme2" : 42
}

有關(guān)如何處理遠程通知的詳細信息蜓堕,請參閱Handling Remote Notifications抛虏。


Assigning Custom Actions to a Remote Notification - 將自定義操作分配給遠程通知

要使用遠程通知顯示自定義操作,請在通知的有效內(nèi)容的aps字典中包含category鍵套才。 在發(fā)布時迂猴,應(yīng)用程序可以注冊包含自定義操作的類別。 當(dāng)通知包含category鍵時背伴,系統(tǒng)會將該類別的操作顯示為橫幅或警報界面中的按鈕沸毁。 當(dāng)用戶選擇按鈕時,系統(tǒng)會通知您的應(yīng)用程序傻寂,以便它可以執(zhí)行任何相關(guān)任務(wù)息尺。 配置了類別的通知也必須配置為顯示警報。

Listing 7-2顯示了通知的示例有效負載疾掰,該通知顯示警報并包含具有自定義操作的category搂誉。 NEW_MESSAGE_CATEGORY字符串對應(yīng)于應(yīng)用已注冊的類別的名稱。 在這種情況下静檬,該類別包括用于響應(yīng)消息的自定義操作勒葱。

// Listing 7-2Including a category in the payload

{
   "aps" : {
      "category" : "NEW_MESSAGE_CATEGORY"
      "alert" : {
         "body" : "Acme message received from Johnny Appleseed",
      },
      "badge" : 3,
      "sound" : “chime.aiff"
   },
   "acme-account" : "jane.appleseed@apple.com",
   "acme-message" : "message123456"
}

有關(guān)如何注冊應(yīng)用程序支持的類別和自定義操作的信息,請參閱Configuring Categories and Actionable Notifications巴柿。 有關(guān)如何處理應(yīng)用程序中自定義操作選擇的信息凛虽,請參閱Responding to the Selection of a Custom Action


Localizing the Content of Your Remote Notifications - 本地化遠程通知的內(nèi)容

有兩種方法可以本地化遠程通知的內(nèi)容:

  • provider服務(wù)器提供本地化內(nèi)容广恢。
  • 在應(yīng)用包中存儲本地化的消息字符串凯旋。

兩種本地化方法都有優(yōu)點和缺點,您應(yīng)該選擇最適合您需求的技術(shù)。 通過服務(wù)器提供本地化內(nèi)容至非,您可以指定所需的任何文本钠署,但還需要發(fā)現(xiàn)并跟蹤用戶當(dāng)前的語言首選項,并可能動態(tài)地翻譯內(nèi)容荒椭。 在應(yīng)用程序包中存儲本地化字符串比較簡單谐鼎,但要求您事先定義所有通知消息并將其包含在應(yīng)用程序的Localizable.strings資源文件中。

1. Supplying the User’s Language Preference to Your Server - 向服務(wù)器提供用戶的語言首選項

如果您的provider服務(wù)器處理通知消息的本地化趣惠,您的應(yīng)用程序應(yīng)該將用戶的語言首選項傳達給該服務(wù)器狸棍。 用戶在設(shè)備上本地設(shè)置語言首選項,應(yīng)用程序可以使用NSLocalepreferredLanguages屬性檢索這些首選項味悄。

Listing 7-3說明了獲取當(dāng)前所選語言并將其傳遞給provider服務(wù)器的技術(shù)草戈。 該示例獲取用戶的第一個首選語言并將其編碼為UTF8字符串。 然后侍瑟,它使用自定義方法將該字符串發(fā)送到其provider唐片。 如果用戶的第一語言不是您支持的語言,您也可以考慮從preferredLanguages屬性發(fā)送前幾種語言涨颜。 如果您不支持任何用戶首選語言费韭,請考慮使用廣泛使用的語言(如英語或西班牙語)作為后備。

// Listing 7-3Getting the current supported language and sending it to the provider

NSString *preferredLang = [[NSLocale preferredLanguages] objectAtIndex:0];
const char *langStr = [preferredLang UTF8String];
[self sendProviderCurrentLanguage:langStr]; // custom method
}

由于用戶可以更改其首選語言設(shè)置庭瑰,因此應(yīng)用程序應(yīng)遵守NSCurrentLocaleDidChangeNotification通知揽思。 使用該通知將任何與語言相關(guān)的更改發(fā)送到您的服務(wù)器。

2. Storing Localized Content in Your App Bundle - 在您的應(yīng)用程序包中存儲本地化內(nèi)容

如果為通知使用一組一致的消息见擦,則可以在應(yīng)用程序包中存儲消息文本的本地化版本,并使用有效內(nèi)容中的loc-keyloc-args鍵指定要顯示的消息羹令。 loc-keyloc-args鍵定義通知的消息內(nèi)容鲤屡。如果存在,本地系統(tǒng)將在應(yīng)用程序的Localizable.strings文件中搜索與loc-key中的值匹配的鍵字符串福侈。然后酒来,它使用strings文件中的相應(yīng)值作為消息文本的基礎(chǔ),將任何占位符值替換為loc-args鍵指定的字符串肪凛。 (您還可以使用title-loc-keytitle-loc-args鍵為通知指定標(biāo)題字符串堰汉。)

為了說明如何使用這些keys,請考慮一個游戲應(yīng)用程序的示例伟墙,其provider服務(wù)器在邀請用戶玩游戲時發(fā)送通知翘鸭。由于邀請文本永遠不會更改,因此該文本使用以下條目包含在應(yīng)用程序的Localizable.strings文件中:

"GAME_PLAY_REQUEST_FORMAT" = "%@ and %@ have invited you to play Monopoly";

當(dāng)provider服務(wù)器想要發(fā)送有關(guān)游戲請求的通知時戳葵,它使用loc-keyloc-args鍵來構(gòu)建payload就乓。 它將loc-key的值設(shè)置為字符串GAME_PLAY_REQUEST_FORMAT,并將loc-args的值設(shè)置為發(fā)起游戲請求的參與者的名稱。 例如生蚁,如果名為JennaFrank的兩個用戶發(fā)起了請求噩翠,則provider服務(wù)器將發(fā)送包含以下內(nèi)容的有效內(nèi)容:

{
    "aps" : {
        "alert" : {
            "loc-key" : "GAME_PLAY_REQUEST_FORMAT",
            "loc-args" : [ "Jenna", "Frank"]
        }
    }
}

在接收到具有前一個有效負載的遠程通知后,設(shè)備從應(yīng)用程序的相應(yīng)Localizable.strings文件中提取GAME_PLAY_REQUEST_FORMAT字符串邦投,并合并提供的玩家名稱伤锚。對于首選語言為英語的用戶,生成的消息字符串將變?yōu)?code>Jenna and Frank have invited you to play Monopoly志衣,對于其他語言屯援,字符串將是包含所提供名稱的消息的正確翻譯版本。

Localizable.strings文件制作消息字符串時蠢涝,可以使用與任何本地化內(nèi)容相同的格式說明符玄呛。例如,您可以使用%n $ @形式的位置說明符來允許重新排列參數(shù)和二,您可以使用%%說明符來創(chuàng)建百分號字符徘铝。

有關(guān)可以包含在通知的有效負載中的密鑰的其他信息,請參閱 Payload Key Reference惯吕。有關(guān)國際化和為應(yīng)用程序提供本地化內(nèi)容的詳細信息惕它,請參閱Internationalization and Localization Guide

后記

本篇主要講述了創(chuàng)建遠程通知Payload废登,感興趣的給個贊或者關(guān)注~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淹魄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堡距,更是在濱河造成了極大的恐慌甲锡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羽戒,死亡現(xiàn)場離奇詭異缤沦,居然都是意外死亡,警方通過查閱死者的電腦和手機易稠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門缸废,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驶社,你說我怎么就攤上這事企量。” “怎么了亡电?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵届巩,是天一觀的道長。 經(jīng)常有香客問我份乒,道長零酪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任拇勃,我火速辦了婚禮方咆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妓肢。我一直安慰自己,他們只是感情好卷拘,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布喊废。 她就那樣靜靜地躺著,像睡著了一般栗弟。 火紅的嫁衣襯著肌膚如雪污筷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天乍赫,我揣著相機與錄音瓣蛀,去河邊找鬼。 笑死雷厂,一個胖子當(dāng)著我的面吹牛惋增,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罗侯,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溪猿!你這毒婦竟也來了钩杰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤诊县,失蹤者是張志新(化名)和其女友劉穎讲弄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體依痊,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡避除,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年怎披,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶摆。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡凉逛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出群井,到底是詐尸還是另有隱情状飞,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布书斜,位于F島的核電站诬辈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荐吉。R本人自食惡果不足惜焙糟,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望样屠。 院中可真熱鬧穿撮,春花似錦、人聲如沸瞧哟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤揩。三九已至咧党,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陨亡,已是汗流浹背傍衡。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留负蠕,地道東北人蛙埂。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像遮糖,于是被迫代替她去往敵國和親绣的。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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