系统推送的集成(九) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 创建远程通知Payload(二)

版本记录

版本号 时间
V1.0 2018.07.14

前言

我们做APP很多时候都需要推送功能,以直播为例,如果你关注的主播开播了,那么就需要向关注这个主播的人发送开播通知,提醒用户去看播,这个只是一个小的方面,具体应用根据公司的业务逻辑而定。前面已经花了很多篇幅介绍了极光推送,其实极光推送无非就是将我们客户端和服务端做的很多东西封装了一下,节省了我们很多处理逻辑和流程,这一篇开始,我们就利用系统的原生推送类结合工程实践说一下系统推送的集成,希望我的讲解能让大家很清楚的理解它。感兴趣的可以看上面几篇。
1. 系统推送的集成(一) —— 基本集成流程(一)
2. 系统推送的集成(二) —— 推送遇到的几个坑之BadDeviceToken问题(一)
3. 系统推送的集成(三) —— 本地和远程通知编程指南之你的App的通知 - 本地和远程通知概览(一)
4. 系统推送的集成(四) —— 本地和远程通知编程指南之你的App的通知 - 管理您的应用程序的通知支持(二)
5. 系统推送的集成(五) —— 本地和远程通知编程指南之你的App的通知 - 调度和处理本地通知(三)
6. 系统推送的集成(六) —— 本地和远程通知编程指南之你的App的通知 - 配置远程通知支持(四)
7. 系统推送的集成(七) —— 本地和远程通知编程指南之你的App的通知 - 修改和显示通知(五)
8. 系统推送的集成(八) —— 本地和远程通知编程指南之苹果推送通知服务APNs - APNs概览(一)

Creating the Remote Notification Payload - 创建远程通知有效负载

provider服务器发送给Apple推送通知服务(APNs)的每个通知都包含一个有效负载。 有效内容包含您要发送到应用程序的任何自定义数据,并包含有关系统应如何通知用户的信息。 您将此有效内容构造为JSON字典,并将其作为HTTP / 2消息的正文内容发送。 payload的最大大小取决于您发送的通知:

  • 对于常规远程通知,最大大小为4KB(4096字节)
  • 对于互联网协议语音(VoIP)通知,最大大小为5KB(5120字节)

注意:如果您使用旧版APNs二进制接口发送通知而不是HTTP / 2请求,则最大有效负载大小为2KB(2048字节)

APNs拒绝其有效负载超过允许的最大大小的通知。

由于无法保证远程通知的传递,因此请勿包含可通过有效负载中的其他方式检索的敏感数据或数据。 而是使用通知来提醒用户新信息,或者作为应用程序有数据等待它的信号。 例如,电子邮件应用程序可以使用远程通知标记应用程序的图标或提醒用户新电子邮件在特定帐户中可用,而不是直接发送电子邮件的内容。 收到通知后,应用程序应打开与您的电子邮件服务器的直接连接以检索电子邮件。


Creating the JSON Dictionary - 创建JSON字典

以下示例说明了JSON字典的结构以及可以包含在通知中的密钥。 payload中最重要的部分是aps字典,它包含Apple定义的密钥,用于确定接收通知的系统应如何提醒用户(如果有的话)。 这些示例还包括名称包含字符串acme的键,其表示虚构应用程序包含的自定义数据。 尽管这些示例包括用于可读性的空格和换行符,但实际上,您应省略空格和换行符以减小有效负载的大小。

示例1.以下有效内容包含带有简单警报消息的aps字典。 acme2键包含一组特定于应用程序的数据。

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

示例2.以下payload要求系统显示带有“关闭”按钮和单个操作按钮的警报。 titlebody键提供警报的内容。 PLAY字符串用于从应用程序的相应Localizable.strings文件中检索本地化字符串。 结果字符串由警报用作操作按钮的标题。 此payload还要求系统使用数字5标记应用程序的图标。

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

示例3.以下payload指定设备应显示警报消息,播放声音并标记应用程序的图标。

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

示例4.以下payload使用loc-key在应用程序的Localizable.strings文件中指定本地化字符串。 该字符串显示为警报的消息。 loc-args包含在显示之前替换为字符串的值。 payload还指定要与警报一起播放的自定义声音。

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

有关可包含在通知payload中的Apple特定密钥的完整列表,请参阅 Payload Key Reference。


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

后台更新通知通过为您提供定期唤醒应用程序的方式来改善用户体验,以便它可以在后台刷新其数据。 当应用程序长时间不运行时,其数据可能会过时。 当用户最终再次启动应用程序时,必须替换过时的数据,这可能会导致使用该应用程序的延迟。 后台更新通知可以提醒用户,也可以静默发生。

重要:后台更新通知并不意味着让您的应用程序在后台保持清醒状态而不是快速刷新操作,也不是用于高优先级更新。 APNs将后台更新通知视为低优先级,如果总数过多,可能会完全限制其到达。 实际限制是动态的,可以根据条件进行更改,但尝试不要每小时发送多个通知。

要支持后台更新通知,请确保有效内容的aps字典包含值为1的内容可用密钥。如果存在与后台更新一起提供的用户可见更新,则可以设置aps字典中的alert, sound, 和badge

当后台更新通知发送到用户的设备时,iOS会在后台唤醒您的应用程序并最多运行30秒。 在iOS中,系统通过调用application:didReceiveRemoteNotification:fetchCompletionHandler:应用程序委托的方法应用程序提供后台更新通知。 使用该方法启动获取新数据所需的任何下载操作。 在后台处理远程通知需要您向应用添加适当的背景模式。

To configure your app to process background update notification - 配置应用以处理后台更新通知

  • 1)在Project Navigator中,选择您的项目。
  • 2)在编辑器中,选择您的iOS应用目标。
  • 3)选择Capabilities选项卡。
  • 4)启用后台模式功能。
  • 5)启用远程通知后台模式。
系统推送的集成(九) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 创建远程通知Payload(二)_第1张图片

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

// Listing 7-1Configuring a background update notification

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

有关如何处理远程通知的详细信息,请参阅Handling Remote Notifications。


Assigning Custom Actions to a Remote Notification - 将自定义操作分配给远程通知

要使用远程通知显示自定义操作,请在通知的有效内容的aps字典中包含category键。 在发布时,应用程序可以注册包含自定义操作的类别。 当通知包含category键时,系统会将该类别的操作显示为横幅或警报界面中的按钮。 当用户选择按钮时,系统会通知您的应用程序,以便它可以执行任何相关任务。 配置了类别的通知也必须配置为显示警报。

Listing 7-2显示了通知的示例有效负载,该通知显示警报并包含具有自定义操作的categoryNEW_MESSAGE_CATEGORY字符串对应于应用已注册的类别的名称。 在这种情况下,该类别包括用于响应消息的自定义操作。

// 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" : "[email protected]",
   "acme-message" : "message123456"
}

有关如何注册应用程序支持的类别和自定义操作的信息,请参阅Configuring Categories and Actionable Notifications。 有关如何处理应用程序中自定义操作选择的信息,请参阅Responding to the Selection of a Custom Action。


Localizing the Content of Your Remote Notifications - 本地化远程通知的内容

有两种方法可以本地化远程通知的内容:

  • provider服务器提供本地化内容。
  • 在应用包中存储本地化的消息字符串。

两种本地化方法都有优点和缺点,您应该选择最适合您需求的技术。 通过服务器提供本地化内容,您可以指定所需的任何文本,但还需要发现并跟踪用户当前的语言首选项,并可能动态地翻译内容。 在应用程序包中存储本地化字符串比较简单,但要求您事先定义所有通知消息并将其包含在应用程序的Localizable.strings资源文件中。

1. Supplying the User’s Language Preference to Your Server - 向服务器提供用户的语言首选项

如果您的provider服务器处理通知消息的本地化,您的应用程序应该将用户的语言首选项传达给该服务器。 用户在设备上本地设置语言首选项,应用程序可以使用NSLocale的preferredLanguages属性检索这些首选项。

Listing 7-3说明了获取当前所选语言并将其传递给provider服务器的技术。 该示例获取用户的第一个首选语言并将其编码为UTF8字符串。 然后,它使用自定义方法将该字符串发送到其provider。 如果用户的第一语言不是您支持的语言,您也可以考虑从preferredLanguages属性发送前几种语言。 如果您不支持任何用户首选语言,请考虑使用广泛使用的语言(如英语或西班牙语)作为后备。

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

由于用户可以更改其首选语言设置,因此应用程序应遵守NSCurrentLocaleDidChangeNotification通知。 使用该通知将任何与语言相关的更改发送到您的服务器。

2. Storing Localized Content in Your App Bundle - 在您的应用程序包中存储本地化内容

如果为通知使用一组一致的消息,则可以在应用程序包中存储消息文本的本地化版本,并使用有效内容中的loc-keyloc-args键指定要显示的消息。 loc-keyloc-args键定义通知的消息内容。如果存在,本地系统将在应用程序的Localizable.strings文件中搜索与loc-key中的值匹配的键字符串。然后,它使用strings文件中的相应值作为消息文本的基础,将任何占位符值替换为loc-args键指定的字符串。 (您还可以使用title-loc-keytitle-loc-args键为通知指定标题字符串。)

为了说明如何使用这些keys,请考虑一个游戏应用程序的示例,其provider服务器在邀请用户玩游戏时发送通知。由于邀请文本永远不会更改,因此该文本使用以下条目包含在应用程序的Localizable.strings文件中:

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

provider服务器想要发送有关游戏请求的通知时,它使用loc-keyloc-args键来构建payload。 它将loc-key的值设置为字符串GAME_PLAY_REQUEST_FORMAT,并将loc-args的值设置为发起游戏请求的参与者的名称。 例如,如果名为JennaFrank的两个用户发起了请求,则provider服务器将发送包含以下内容的有效内容:

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

在接收到具有前一个有效负载的远程通知后,设备从应用程序的相应Localizable.strings文件中提取GAME_PLAY_REQUEST_FORMAT字符串,并合并提供的玩家名称。对于首选语言为英语的用户,生成的消息字符串将变为Jenna and Frank have invited you to play Monopoly,对于其他语言,字符串将是包含所提供名称的消息的正确翻译版本。

Localizable.strings文件制作消息字符串时,可以使用与任何本地化内容相同的格式说明符。例如,您可以使用%n $ @形式的位置说明符来允许重新排列参数,您可以使用%%说明符来创建百分号字符。

有关可以包含在通知的有效负载中的密钥的其他信息,请参阅 Payload Key Reference。有关国际化和为应用程序提供本地化内容的详细信息,请参阅Internationalization and Localization Guide

后记

本篇主要讲述了创建远程通知Payload,感兴趣的给个赞或者关注~~~~

系统推送的集成(九) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 创建远程通知Payload(二)_第2张图片

你可能感兴趣的:(系统推送的集成(九) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 创建远程通知Payload(二))