版本記錄
版本號 | 時間 |
---|---|
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)閉”按鈕和單個操作按鈕的警報鹉戚。 title
和body
鍵提供警報的內(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)用程序可以使用NSLocale
的preferredLanguages屬性檢索這些首選項味悄。
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-key
和loc-args
鍵指定要顯示的消息羹令。 loc-key
和loc-args
鍵定義通知的消息內(nèi)容鲤屡。如果存在,本地系統(tǒng)將在應(yīng)用程序的Localizable.strings
文件中搜索與loc-key
中的值匹配的鍵字符串福侈。然后酒来,它使用strings文件中的相應(yīng)值作為消息文本的基礎(chǔ),將任何占位符值替換為loc-args
鍵指定的字符串肪凛。 (您還可以使用title-loc-key
和title-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-key
和loc-args
鍵來構(gòu)建payload
就乓。 它將loc-key
的值設(shè)置為字符串GAME_PLAY_REQUEST_FORMAT
,并將loc-args
的值設(shè)置為發(fā)起游戲請求的參與者的名稱。 例如生蚁,如果名為Jenna
和Frank
的兩個用戶發(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)注~~~~