美文网首页
iOS 浅析消息推送

iOS 浅析消息推送

作者: JzRo | 来源:发表于2017-07-11 12:31 被阅读8次

一直都有用推送,但一直以来都只是知道怎么处理具体的原理、实现流程就不是很清楚,最近有时间,就具体学习了一下,分享给大家,希望看完我的这篇文章,对大家有所帮助。

APNS的推送机制

0.jpg

这里 Provider 是指某个应用的Developer,当然如果开发者使用极光的服务,那么这里的Provider就是极光的推送服务程序了。上图可以分为三步:
第一步:极光推送服务程序把要发送的消息、目的设备的唯一标识打包,发给APNs。
第二步:APNs在自身的已注册Push服务的应用列表中,查找有相应标识的设备,并把消息发送到设备。
第三步:iOS系统把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知

1.jpg

从上图我们可以看到。
1、首先是应用程序注册消息推送。
2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3、应用程序将deviceToken发送给PUSH服务端程序。
4、 服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
代码里面如何实现推送

首先,我们要获取DeviceToken。

App需要每次启动的时候都去注册远程通知——通过调用UIApplication的registerForRemoteNotificationTypes:方法,传递给它你希望支持的消息类型参数即可,例如:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // do some initiale working
    ...
    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
    return YES;
}

如果注册成功,APNs会返回给你设备的token,iOS系统会把它传递给app delegate代理——application:didRegisterForRemoteNotificationsWithDeviceToken:方法,你应该在这个方法里面把token保存到极光后台,例如:

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"Receive DeviceToken: %@", deviceToken);
    [JPUSHService registerDeviceToken:deviceToken];
}

如果注册失败,application:didFailToRegisterForRemoteNotificationsWithError:方法会被调用,通过NSError参数你可以看到具体的出错信息,例如:

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"注册失败,无法获取设备ID, 具体错误: %@", error);
}

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

其次,我们要处理收到消息之后的回调

我们可以设想一下消息通知的几种使用场景:
1,在app没有被启动的时候,接收到了消息通知。这时候操作系统会按照默认的方式来展现一个alert消息,在app icon上标记一个数字,甚至播放一段声音。
2,用户看到消息之后,点击了一下action按钮或者点击了应用图标
如果action按钮被点击了,系统会通过调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,并且会把notification的payload数据传递进去。
如果应用图标被点击了,系统也一样会调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,唯一不同的是这时候启动参数里面不会有任何notification的信息。
3,如果远程消息发送过来的时候,app正在运行,这时候会发生什么呢?
app代理的application:didReceiveRemoteNotification:方法会被调用,同时远程消息中的payload数据会作为参数传递进去。
示例代码如下:

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:
(void (^)(UIBackgroundFetchResult))completionHandler {
MyAlertShow(@"(UIBackgroundFetchResult))completionHandler", @"6666");
    
    NSLog(@"(UIBackgroundFetchResult))completionHandler");
    
     [MyRemoteNoticeMangeZH dealWithRemoteDic:userInfo];
    
}

相关文章

  • iOS 浅析消息推送

    一直都有用推送,但一直以来都只是知道怎么处理具体的原理、实现流程就不是很清楚,最近有时间,就具体学习了一下,分享给...

  • 细说 iOS 消息推送

    细说 iOS 消息推送 细说 iOS 消息推送

  • iOS 远程推送通知

    iOS 远程推送通知 分分钟搞定IOS远程消息推送 iOS推送通知的实现步骤 推送通知iOS客户端编写实现及推送服...

  • iOS 远程消息推送 APNS推送原理和一步一步开发详解篇(新手

    iOS 远程消息推送 APNS推送原理和一步一步开发详解篇(新手推荐) iOS 远程消息推送 APNS推送原理和一...

  • 技术贴合集

    iOS网络图片尺寸适配 iOS 10 消息推送(UserNotifications)秘籍总结 静默推送 iOS 面...

  • iOS开发常用之消息相关

    消息相关 消息推送客户端 SGPushDemo - 消息推送客户端 Orbiter - 消息推送客户端:iOS...

  • iOS消息推送

    一、关于推送 1、本地推送 只要用户允许了推送通知,并且通知提醒类型不为空,就可以进行本地推送。 2、远程推送 首...

  • iOS 消息推送

    [TOC] 一、工作机制: APNS 是 Apple Push Notification Service 的缩写,...

  • iOS消息推送

    推送的注册: 方法回调 iOS10及以上方法回调 iOS10以下: 推送的Extension 分为service和...

  • iOS 推送消息

    http://my.oschina.net/zhxx/blog/711947

网友评论

      本文标题:iOS 浅析消息推送

      本文链接:https://www.haomeiwen.com/subject/ajnphxtx.html