前言
说一下我了解的推送
正文
APNs--------Apple Push Notification service
1 远程推送的大概流程及其原理
我们的设备联网时(无论是蜂窝联网还是Wi-Fi联网)都会与苹果的APNs服务器建立一个长连接(persistent IP connection),当Provider推送一条通知的时候,这条通知并不是直接推送给了我们的设备,而是先推送到苹果的APNs服务器上面,而苹果的APNs服务器再通过与设备建立的长连接进而把通知推送到我们的设备上。而当设备处于非联网状态的时候,APNs服务器会保留Provider所推送的最后一条通知,当设备转换为连网状态时,APNs则把其保留的最后一条通知推送给我们的设备;如果设备长时间处于非联网状态下,那么APNs服务器为其保存的最后一条通知也会丢失。Remote Notification必须要求设备连网状态下才能收到,并且太频繁的接收远程推送通知对设备的电池寿命是有一定的影响的。
Provider(server)----> 苹果的APNs服务器上---->Client App (这个过程必须是有网络的状态)
如果没有网络APNs服务器将保留最后的一条推送,有网络的时候,再推送给设备的App上,如果太长时间没有网络,最后一条通知也会消失
2.deviceToken的生产
当一个App注册接收远程通知时,系统会发送请求到APNs服务器,APNs服务器收到此请求会根据请求所带的key值生成一个独一无二的value值也就是所谓的deviceToken,而后APNs服务器会把此deviceToken包装成一个NSData对象发送到对应请求的App上。然后App把此deviceToken发送给我们自己的服务器,就是所谓的Provider。Provider收到deviceToken以后进行储存等相关处理,以后Provider给我们的设备推送通知的时候,必须包含此deviceToken。
1)deviceToken是什么?是包含设备的UDID和App的Bundle ID 而APNs生产的一个编码
2)deviceToken的作用:deviceToken是唯一的,根据UDID和Bundle ID可以找到唯一的设备和设备上唯一的应用
3.开始写代码啦
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//极光推送 // Required
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
//可以添加自定义categories
// 注册APNS类型 [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
} else {
//categories 必须为nil
[APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
} // Required
//初始化
[APService setupWithOption:launchOptions]; return YES;
} //极光推送
//注册成功后回调方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // Required
//向服务器上报Device Token
[APService registerDeviceToken:deviceToken];
}
//如果App处于Background状态时,只用用户点击了通知消息时才会调用该方法;如果App处于Foreground状态,会直接调用该方法。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // Required
// 处理收到的APNS消息,向服务器上报收到APNS消息
[APService handleRemoteNotification:userInfo];
}
//此方法不论App处于Foreground状态还是处于Background状态,收到远程推送消息的时候都会立即调用此方法。此方法需要配置后台模式并且在推送负载中必须有content-available此key值,对应的value值为1
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { /*
UIBackgroundFetchResultNewData, // 成功接收到数据
UIBackgroundFetchResultNoData, // 没有接收到数据
UIBackgroundFetchResultFailed // 接受失败 */
// userInfo为收到远程通知的内容 // IOS 7 Support Required
// 处理收到的APNS消息,向服务器上报收到APNS消息
[APService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
4 远程推送负载
1)大小:当负载超过规定时,APNs会拒绝发送此消息
2)格式:基本是JSON字典对象
5.指定用户推送
用userToken(一般是根据自己公司的自定的规则生产的,一般是用户号加对应的密码生成的)+deviceToken发送给Provider就可以达到指定用户推送
参考文献:
http://www.jianshu.com/p/4b947569a548
miaomiaoccat小语
有不对的地方欢迎指教.请留言.