细说iOS消息推送_第1页
细说iOS消息推送_第2页
细说iOS消息推送_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、细说 iOS 消息推送转自丰俊文的博客经常有同学问我们, iOS 上推送究竟怎么做啊,为什么我的 设备总收不到推送呢,这里跟大家集中讨论一下 iOS 上推送 的实现细节。APNS 的推送机制与 Android 上我们自己实现的推送服务不一样, Apple 对设 备的控制非常严格,消息推送的流程必须要经过APNs :这里 Provider 是指某个应用的 Developer ,当然如果开发者 使用 AVOS Cloud 的服务,把发送消息的请求委托给我们, 那么这里的 Provider 就是 AVOS Cloud 的推送服务程序了。 上图可以分为三步: 第一步: AVOS Cloud 推送服务程

2、序把要发送的消息、目的 设备的唯一标识打包,发给 APNs 。第二步: APNs 在自身的已注册 Push 服务的应用列表中,查 找有相应标识的设备,并把消息发送到设备。第三步: iOS 系统把发来的消息传递给相应的应用程序,并 且按照设定弹出 Push 通知 为了实现消息推送,有两点非常重要:1, App 的推送证书要能够完整实现一条消息推送,需要我们在 App ID 中打开 Push Notifications ,需要我们准备好 Provisioning Profile 和 SSL 证书, 并且一定要注意 Development 和 Distribution 环境 是需要分开的。 最后,把

3、 SSL 证书导入到 AVOS Cloud 平台, 就可以尝试远程消息推送了。具体的操作流程可以参考我们 的使用指南: iOS 推送证书设置指南。2,设备标识 DeviceToken 知道了谁要推送,或者说要推送给哪个 App 之后, APNs 还 需要知道推到哪台设备上,这就是设备标识的作用。获取设 备标识的流程如下:第一步:App打开推送开关,用户要确认TA希望获得该App 的推送消息第二步: App 获得一个 DeviceToken第三步: App 将 DeviceToken 保存起来,这里就是通过 A VInstallation saveInBackground 将 DeviceTok

4、en 保存到 AVOS Cloud 第四步:当某些特定事件发生,开发者委托 AVOS Cloud 来 发送推送消息,这时候 AVOS Cloud 的推送服务器就会给 APNs 发送一则推送消息, APNs 最后消息送到用户设备 推送相关的几个概念 消息类型一条消息推送过来,可以有如下几种表现形式:1. 显示一个 alert或者banner,展现具体内容2. 在应用 icon 上提示一个新到消息数3. 播放一段声音 开发者可以在每次推送的时候设置,在推送达到用户设备时 开发者也可以选择不同的提示方式。本地消息通知iOS 上有两种消息通知,一种是本地消息( Local Notification )

5、,一种是远程消息 (Push Notification ,也叫 Remote Notification) ,设计这两种通知的目的都是为了提醒用户,现 在有些什么新鲜的事情发生了,吸引用户重新打开应用。 本地消息什么时候有用呢?譬如你正在做一个 To-do 的工具 类应用,对于用户加入的每一个事项,都会有一个完成的时 间点,用户可以要求这个 To-do 应用在事项过期之前的某一 个时间点提醒一下 TA 。为了达到这一目的,App 就可以调度一个本地通知,在时间点到了之后发出一个 Alert 消息或 者其他提示。我们在处理推送消息的时候,也可以综合运用这两种方式。 代码里面如何实现推送 首先,我们

6、要获取 DeviceToken 。App 需要每次启动的时候都去注册远程通知通过调用 UIApplication 的 registerForRemoteNotificationTypes: 方法,传 递给它你希望支持的消息类型参数即可,例如:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions / do some initiale working . application registerForRemoteNotification

7、Types:UIRemoteNotificationTyp eBadge | UIRemoteNotificationTypeAlert |UIRemoteNotificationTypeSound; return YES; 如果注册成功, APNs 会返回给你设备的 token, iOS 系统会 把它传递给 app delegate 代理 application:didRegisterForRemoteNotificationsWithDeviceToke n:方法,你应该在这个方法里面把token保存到AVOS Cloud后台,例如:- (void)application:(UIAppli

8、cation *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NSLog("Receive DeviceToken: %", deviceToken); AVInstallation *currentInstallation = AVInstallation currentInstallation;currentInstallationsetDeviceTokenFromData:deviceToken;currentInstallation saveInBackgro

9、und; 如果注册失败, application:didFailToRegisterForRemoteNotificationsWithError: 方法会被调用,通过 NSError 参数你可以看到具体的出错信 息,例如:- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NSLog(" 注册失败,无法获取设备 ID, 具体 错误 : %", error); 请注意:注册流程需要在 app 每次启

10、动时调用,这并不不会 带来额外的负担,因为 iOS 操作系统在第一次获得了有效的 device token 之后,会本地缓存起来,以后 app 再调用 registerForRemoteNotificationTypes: 的时候会立刻返回,并不 会再进行网络请求。另外,app层面不应该对device token进行缓存,因为 device token 也有可能变化如果用户重装 了操作系统,那么 APNs 再次给出的 device token 就会和之 前的不一样,又或者是,用户 restore 了原来的 backup 到新 的设备上,那么原来的 device token 也会失效。 其次,我

11、们要处理收到消息之后的回调 我们可以设想一下消息通知的几种使用场景:1,在 app 没有被启动的时候, 接收到了消息通知。 这时候操 作系统会按照默认的方式来展现一个 alert 消息,在 app icon 上标记一个数字,甚至播放一段声音。2,用户看到消息之后, 点击了一下 action 按钮或者点击了应 用图标。如果 action 按钮被点击了,系统会通过调用application:didFinishLaunchingWithOptions: 这个代理方法来 启动应用,并且会把 notification 的 payload 数据传递进去。 如果应用图标被点击了,系统也一样会调用 appli

12、cation:didFinishLaunchingWithOptions: 这个代理方法来 启动应用,唯一不同的是这时候启动参数里面不会有任何 notification 的信息。示例代码如下:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions / do initializing works.if (launchOptions) / do something else AVAnalytics trackAppOpenedWithLa

13、unchOptions:launchOptions; application registerForRemoteNotificationTypes:UIRemoteNotificationTyp eBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;return YES; 3,如果远程消息发送过来的时候, app 正在运行,这时候会 发生什么呢?app 代理的 application:didReceiveRemoteNotification: 方法会 被调用,同时远程消息中的 payload 数据会作为参数

14、传递进 去。示例代码如下:- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo if (application.applicationState =UIApplicationStateActive) / 转换成一个本地通知,显示到通知栏,你也可以直接显示出一个 alertView ,只 是那样稍显 aggressive:)UILocalNotification*localNotification = UILocalNotification al

15、loc init; localNotification.userInfo = userInfo;localNotification.soundName = UILocalNotificationDefaultSoundName; localNotification.alertBody = userInfo objectForKey:"aps" objectForKey:"alert" localNotification.fireDate = NSDate date;UIApplication sharedApplicationscheduleLocalN

16、otification:localNotification; else AVAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo; 常见问题 FAQ1. 我能推送长消息吗? 不能, APNs 限制了每个 notification 的 payload 最大长度是 256 字节,超长的消息是不能发送的。2. 推送怎么加声音提醒? 消息推送是可以指定声音的。譬如你可以对正面的反馈使用 欢快的声音,对负面的反馈使用低沉一点的声音,都可以达 到别出心裁让人眼前一亮的目的。你需要先放一些 aiff 、wav 或者 caf 音频文件到

17、app 的资源文 件中,然后在推送的时候指定不同的音频文件名就可以了。3. 推送的 Badge 是怎么回事? 推送并不一定会导致应用图标上红色数字增加,是否显示这 一数字,显示成多少,都取决于开发者自己。 在发送推送消息的时候,我们可以选择是否递增这一数字; 如果不选择这一项,那么消息推送并不会导致应用图标上红 色数字的出现。好,现在问题来了,这个数字如果搞出来了,怎么让它消失 掉呢?其实我们只需要在任何时候设置UIApplication.applicationIconBadgeNumber 属性为 0,就可以 让这个数字消失掉。一般我们会选择在应用启动的时候( application:did

18、FinishLaunchingWithOptions: 方法中),或者 干脆一点,在应用每次被切换到前台的时候applicationWillEnterForeground: 方法中),调用这一行代码, 即可立刻清除掉 Badge 数字了。4. AVOS Cloud 平台发出去的通知格式究竟是什么样子的对于每一条推送消息,都包含一个payload,通常是组成了一个 JSON 的 Dictionary ,这其中必不可少的是 aps 属性, 它对 应的 value 也是一个 Dictionary ,包含下面一些内容:1)alert 消息(文本或 Dictionary )2)应用图标上的红色数字3)播

19、放的声音文件名 在由推送激活的 app 打开事件中, application:didFinishLaunchingWithOptions: 的 options 参数就 是这个大的 Dictionary 对象。 aps =alert = "hello, everyone"badge = 2;sound = default; ; 这里要注意的时 alert 部分,它的值可以是一个 String (文本 消息),也可以是一个 JSON 的 Dictionary 。当它是文本消息 的时候, 系统就会把这些文字显示到一个 alertview 中;如果 它也是由一个 JSON Dict

20、ionary 组成的话,其格式如下:* body* action-loc-key* loc-key* loc-args* launch-imagebody 部分就是 alertView 中将要展现出来的文本消息, loc- 属性主要是用来实现本地化消息, launch-image 只是 app 主 bundle 里的一个图片文件的名称,一般来说我们不指定这一 属性。5. 如何显示本地化的消息 有两种办法可以实现推送消息的本地化:1)在推送的 payload 中使用 loc-key 和 loc-args 来指定进行本 地化,这样 Provider 方只需要按照统一的格式来发送即可, 消息的解析和组装则由客户端来完成。2)如果推送的 payload 里面不包含 loc-key/loc-args 信息,那 么 Provider 方就需要自己做本地化处理, 然后给不同的 device 发送不同的消息, 为了做到这一点, 还需要 app 在上传 device token 的时候也把用户的语言设置信息传回来。目前,因为 AVOS Cloud 主要就是瞄准中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论