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

版本記錄

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

前言

我們做APP很多時(shí)候都需要推送功能,以直播為例,如果你關(guān)注的主播開(kāi)播了,那么就需要向關(guān)注這個(gè)主播的人發(fā)送開(kāi)播通知,提醒用戶去看播,這個(gè)只是一個(gè)小的方面,具體應(yīng)用根據(jù)公司的業(yè)務(wù)邏輯而定。前面已經(jīng)花了很多篇幅介紹了極光推送,其實(shí)極光推送無(wú)非就是將我們客戶端和服務(wù)端做的很多東西封裝了一下,節(jié)省了我們很多處理邏輯和流程,這一篇開(kāi)始,我們就利用系統(tǒng)的原生推送類結(jié)合工程實(shí)踐說(shuō)一下系統(tǒng)推送的集成,希望我的講解能讓大家很清楚的理解它。感興趣的可以看上面幾篇。
1. 系統(tǒng)推送的集成(一) —— 基本集成流程(一)
2. 系統(tǒng)推送的集成(二) —— 推送遇到的幾個(gè)坑之BadDeviceToken問(wèn)題(一)
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)程通知編程指南之蘋(píng)果推送通知服務(wù)APNs - APNs概覽(一)

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

provider服務(wù)器發(fā)送給Apple推送通知服務(wù)(APNs)的每個(gè)通知都包含一個(gè)有效負(fù)載。 有效內(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ā)送的通知:

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

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

APNs拒絕其有效負(fù)載超過(guò)允許的最大大小的通知。

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


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

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

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

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

示例2.以下payload要求系統(tǒng)顯示帶有“關(guān)閉”按鈕和單個(gè)操作按鈕的警報(bào)。 titlebody鍵提供警報(bào)的內(nèi)容。 PLAY字符串用于從應(yīng)用程序的相應(yīng)Localizable.strings文件中檢索本地化字符串。 結(jié)果字符串由警報(bào)用作操作按鈕的標(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)顯示警報(bào)消息,播放聲音并標(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文件中指定本地化字符串。 該字符串顯示為警報(bào)的消息。 loc-args包含在顯示之前替換為字符串的值。 payload還指定要與警報(bào)一起播放的自定義聲音。

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

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


Configuring a Background Update Notification - 配置后臺(tái)更新通知

后臺(tái)更新通知通過(guò)為您提供定期喚醒應(yīng)用程序的方式來(lái)改善用戶體驗(yàn),以便它可以在后臺(tái)刷新其數(shù)據(jù)。 當(dāng)應(yīng)用程序長(zhǎng)時(shí)間不運(yùn)行時(shí),其數(shù)據(jù)可能會(huì)過(guò)時(shí)。 當(dāng)用戶最終再次啟動(dòng)應(yīng)用程序時(shí),必須替換過(guò)時(shí)的數(shù)據(jù),這可能會(huì)導(dǎo)致使用該應(yīng)用程序的延遲。 后臺(tái)更新通知可以提醒用戶,也可以靜默發(fā)生。

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

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

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

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

  • 1)在Project Navigator中,選擇您的項(xiàng)目。
  • 2)在編輯器中,選擇您的iOS應(yīng)用目標(biāo)。
  • 3)選擇Capabilities選項(xiàng)卡。
  • 4)啟用后臺(tái)模式功能。
  • 5)啟用遠(yuǎn)程通知后臺(tái)模式。

Listing 7-1顯示了后臺(tái)更新通知的JSON payload示例。

// Listing 7-1Configuring a background update notification

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

有關(guān)如何處理遠(yuǎn)程通知的詳細(xì)信息,請(qǐng)參閱Handling Remote Notifications。


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

要使用遠(yuǎn)程通知顯示自定義操作,請(qǐng)?jiān)谕ㄖ挠行?nèi)容的aps字典中包含category鍵。 在發(fā)布時(shí),應(yīng)用程序可以注冊(cè)包含自定義操作的類別。 當(dāng)通知包含category鍵時(shí),系統(tǒng)會(huì)將該類別的操作顯示為橫幅或警報(bào)界面中的按鈕。 當(dāng)用戶選擇按鈕時(shí),系統(tǒng)會(huì)通知您的應(yīng)用程序,以便它可以執(zhí)行任何相關(guān)任務(wù)。 配置了類別的通知也必須配置為顯示警報(bào)。

Listing 7-2顯示了通知的示例有效負(fù)載,該通知顯示警報(bào)并包含具有自定義操作的categoryNEW_MESSAGE_CATEGORY字符串對(duì)應(yīng)于應(yīng)用已注冊(cè)的類別的名稱。 在這種情況下,該類別包括用于響應(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)如何注冊(cè)應(yīng)用程序支持的類別和自定義操作的信息,請(qǐng)參閱Configuring Categories and Actionable Notifications。 有關(guān)如何處理應(yīng)用程序中自定義操作選擇的信息,請(qǐng)參閱Responding to the Selection of a Custom Action。


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

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

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

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

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

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

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

// 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
}

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

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

如果為通知使用一組一致的消息,則可以在應(yīng)用程序包中存儲(chǔ)消息文本的本地化版本,并使用有效內(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)題字符串。)

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

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

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

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

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

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

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

后記

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容