@evolxb
2016-08-29T05:51:44.000000Z
字数 4614
阅读 3746
iOS,push notification
每个远程通知都包含一个payload。payload包含系统要显示给用户的信息也包括你自定义的数据。payload的最大长度取决以什么API来发送它。如果使用HTTP/2的API,那么payload的最大长度是4096字节,如果使用传统的二进制方式,那么最大长度是2048字节。APNs会拒绝超过最大长度的任何通知。
每个通知都是一个JSON字典对象。这个字典必须包括一个以aps为键的字典。aps字典必须包括下面一个或多个指定通知类型的属性:
alert消息icon上显示的数字当远程通知被传递到设备时,相应的应用程序并没有在前台运行,那么系统会以alert message,badge icon,播放声音来提醒用户。而如果相应的应用程序正在前台运行,那么系统会把通知封装成NSDictionary传递给应用的delegate。
Provider可以在payload中指定自定义的数据。但是自定义的数据必须使用JSON结构而且只能是原始类型:dictionary,array,string,number,Boolean。你不能在payload中包含任何用户信息和敏感数据。通知应该仅仅只是用来设置一些上下文信息或者内部标示。例如:在一个即时通信应用中,payload中可以包含自定义的用户对话标识符或者Provider发送通知时的时间戳。任何和警告消息对应的动作不应该是破坏性的--比如删除设备上的数据。
重要:通知发送给设备是
尽最大努力,但是并不是保证一定送达。通知并不是要发送数据给你的应用,它只是通知你的用户应用里有新的数据。
下面的表格展示了aps中可用的键和它们期望的值。
| key | value type | comment |
|---|---|---|
alert |
字符串或字典 | 如果aps字典中包括这个属性,系统会根据用户的设置显示一个标准的alert或者是banner。你可用给这个属性设置为字符串或者是字典:
|
badge |
数字 | 显示在应用icon上的数字。如果没有这个属性,应用icon上的数字不会改变。设置这个属性为0来移除icon上的badge。 |
sound |
字符串 | 在应用的bundle中或者Library/Sounds目录中以这个作为文件名的声音会作为警告声音播放。如果声音文件不存在或者值是default,那么默认的声音会播放。 |
content-available |
数字 | aps字典中包括这个键并且值是1,表示有新的内容。而且如果应用在后台被启动或恢复,那么application:didReceiveRemoteNotification:fetchCompletionHandler:方法会调用。 |
category |
字符串 | 这个键值对表示你创建的自定义的动作的UIMutableUserNotificationCategory的标识符(identifier) |
alert字典的键和期望的值
| key | value type | comment |
|---|---|---|
title |
string |
一个简短的字符串来说明通知的目的。 |
body |
string |
警告的消息 |
title-loc-key |
string或者null |
title的本地化字符串,可用使用%@,%n$@来从title-loc-args中添加格式化字符串. |
title-loc-args |
array of strings or null |
出现在title-loc-key中的格式化字符串 |
action-loc-key |
string or null |
替换标准Close和View的警告框的View为本地化字符串。 |
loc-key |
string |
alert-message 的本地化字符串,可以使用%@,%n$@从loc-args中格式化字符串 |
loc-args |
array of strings |
loc-key中的格式化字符串 |
launch-image |
string |
用户点击动作按钮或者滑动通知启动应用时,使用这个文件的启动图片。如果没有指定这个属性,系统会使用上次的应用快照或者Info.plist中UILaunchImageFile的图片或Default.png作为启动图片。 |
如果你要设备一个警告消息并且有关闭和查看按钮的警告框,那么直接设置
alert为字符串。不要设置alert为一个只包含body属性的字典。
aps也可以包括content-available属性。content-available的值为1,那么这个远程通知是一个静默的通知。当一个静默的通知被传递到设备,iOS在后台唤醒你的应用,这样你的应用就可以从你的服务器获取新的数据或者在后台处理信息。用户不会从静默通知中知道有新的数据或者已经改变的信息,但是当他们下次打开应用时他们才会知道这些新的数据或者已经改变的信息。
对于静默的通知,要确保aps字典中没有alert,sound或者badge属性。如果不这样做,错误配置的通知可能不会被传递到后台的应用,而是直接以警告框的形式显示给用户。
你可以通过两种方式显示本地化的警告信息:
aps字典中的loc-key和loc-args来根据当前设备语言本地化警告信息。然后显示给用户。下面是第二种方式的详细解释:(第一种前面几篇文章已经讨论过)
应用程序可以为它所支持的语言国际化所有的资源包括图片,声音,文字,然后把这些资源都放在应用程序的bundle的一个以语言代码和.lproj后缀结尾的子目录中(比如fr.lproj)。本地化的字符串是保存在Localizable.strings文件中。这个文件中的实体都是键值对,值也可以使用字符串参数格式化。当应用程序需要特定的资源时,例如一个本地化的字符串,它从用户的当前语言对应的目录中查找。例如,如果用户的当前语言是法语,那么对应的警告信息的本地化字符串就会从fr.lproj目录中的Localizable.strings文件中查找。(通过NSLocalizedString这个宏来请求本地化的字符串)
注意,这也是
action-loc-key属性所执行的步骤。它也会在LocalizedString.strings文件中查找对应的本地化字符串。iOS使用这个字符串来显示警告框右边的按钮的标题。(action按钮)
为了清楚的说明这个步骤,让我们看看下面的例子。Provider提供了下面的字典作为alert的值:
"alert": {"loc-key": "GAME_PLAY_REQUEST_FORMAT","loc-args": ["Jena", "Frank"]}
当用户收到这个通知后,它使用GAME_PLAY_REQUEST_FORMAT这个键从相应.lproj目录中的Localizable.strings文件中查找对应的字符串值。假设当前的Localizable.strings文件中有一个这样的实体:
"GAME_PLAY_REQUEST_FORMAT"="%@ and %@ have invited you to play Monopoly";
设备显示Jenna and Frank have invited you to play Monopoly这个警告消息。
除了%@,你也可以使用%n$%@来用指定位置的字符串来替换格式符。n表示使用loc-args中第n个元素来替换(索引从1开始)。因此如果Localizable.strings文件中的实体是:
"GAME_PLAY_REQUEST_FORMAT" = "%2$@ and %1$@ have invited you to play Monopoly";
设备会显示Frank and Jenna have invited you to play Monopoly警告消息。
注意:只有当你必须使用
alert字典时才这样做。这些属性的值,特别是当它们是很长的字符串时,相比于性能会占用更多的带宽。很多的应用都不需要这些属性,应为消息最初都来自用户。
下面例子的通知中的payload都是为了说明上面表格中各种属性的使用。acme属性是自定义的数据。
注意: 下面例子都是使用空格和换行符来增加可读性。但是在实践应用中要避免空格和换行,这会减小
payload的大小,增加网络的性能。
Example 1。下面的aps字典中有一个简单的警报字符串和两个默认的按钮(Close和View)。这个payload也包含自定义的数组属性.
{"aps": { "alert": "Message received from Bob" },"acme2": [ "bang", "whiz" ]}
Example 2。在这个例子中使用aps字典显示了一个警告消息并且左边是Close按钮,右边是本地化的action按钮。在这个例子中PLAY是本地化字符串的键用来从Localizable.strings文件中获取对应的本地化字符串值。aps字典也包括应用的icon的badge数字。
{"aps": {"alert": {"title": "Game Request","body": "Bob wants to play poker","action-loc-key": "PLAY"},"badge": 5},"acme1": "bar","acme2": ["bang", "whiz"]}
Example 3。这个例子指定设备要显示一个带两个按钮的警告框(Close和View)。它也会在应用程序的icon上显示数字9,而且会播放声音当警告框出现时。
{"aps": {"alert": "You got your emails","badge": 9,"sound": "bingbong.aiff"},"acme1": "bar","acme2": 42}
Example 4。这个例子使用loc-key和loc-args来显示一个本地化的警告消息。它也包括自定义的警报声音和自定义的数据。
{"aps": {"alert": {"loc-key": "GAME_PLAY_REQUEST_FORMAT","loc-args": [ "Jenna", "Frank" ]},"sound": "chime.aiff"},"acme": "foo"}
Example 5。这个例子使用category键来指定一组通知动作.
{"aps": {"category": "NEW_MESSAGE_CATEGORY","alert": {"body": "Acme message received from Johnny Appleseed","action-loc-key": "VIEW"},"badge": 3,"sound": "chime.aiff"},"acme-account": "jane.applesee@apple.com","acme-message": "message123456"}