@evolxb
2016-08-29T13:51:44.000000Z
字数 4614
阅读 3384
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"
}