iOS远程推送服务
APNs服务,苹果官方网址:https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html
一,Apple Notification Push Server(苹果消息推送服务器)
苹果推送服务有两种,本地推送(local)和远程推送(remote);我们今天讲远程推送。
1,远程推送服务可以转发从提供者(一般是制作应用提供的服务器)一个远程通知(remote notification)到设备。一个通知是一个简短的消息包括两个重要的数据:设备令牌(device token)和有效载荷(payload)。设备令牌(device token)就好像是手机号码,它包含了APNs分配给某个设备中某个本机应用的允许推送的信息。APNs也会使用它来验证一个通知。有效载荷(payload)是一个json格式的列表,描述了通知怎么在设备上显示通知给使用该应用的用户。
2,远程通知数据流是单向的。提供者(provider)组装包含device Token和payload的通知包。提供者(provider)发送该通知给APNs。

3,device token共享

4,然而,上面都不是完整流程的完全体;一般公司实现远程推送的完全体是把上面两幅图片结合起来:

二,iOS获取deviceToken;
如果希望自己的应用支持推送功能,需要在苹果开发者后台配置应用的证书和配置文件,还有推送用的证书。
1)配置项目证书+推送证书,网址:
https://developer.apple.com/membercenter/index.action
-------------------------------
开发一个应用,需要完整的证书有七个(不考虑csr文件)
1-开发者开发用签名证书
2-开发者发布用签名证书
3-某个项目对应的推送开发证书
4-某个项目对应的推送发布证书
5-某个项目对应的开发调试配置文件
6-某个项目对应的发布配置文件
7-某个项目对应的adhoc配置文件
如果账号不是新账号
创建一个应用,颁布证书的时候,应该从创建App Id开始,然后颁布推送/配置文件。
如果是新账号,应该先在某台mac上通过钥匙串工具颁布CSR文件到电脑,CSR文件是可以在苹果开发者后台颁布其他证书的验证文件。为了防止意外情况发生,凡是需要CSR文件验证才能获取的证书,最好在颁布CSR文件的电脑上颁发。
颁发完CSR文件,再登陆苹果开发者后台,颁发开发者开发用签名证书和开发者发布用签名证书。
-------------------------------
2)应用注册推送通知,获取device token
UIApplication的方法:
-(void)registerNotificationPush{
UIApplication * application=[UIApplication sharedApplication];
if ([UIDevice currentDevice].systemVersion.integerValue>=8) {
//1.创建消息上面要添加的动作(按钮的形式显示出来)
UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];
action.identifier = @"action";//按钮的标示
action.title=@"Accept";//按钮的标题
action.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序
// action.authenticationRequired = YES;
// action.destructive = YES;
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
action2.identifier = @"action2";
action2.title=@"Reject";
action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理
action.authenticationRequired = YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;
action.destructive = YES;
//2.创建动作(按钮)的类别集合
UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];
categorys.identifier = @"alert";//这组动作的唯一标示,推送通知的时候也是根据这个来区分
[categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)];
//3.创建UIUserNotificationSettings,并设置消息的显示类类型
UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:[NSSet setWithObjects:categorys, nil]];
[application registerUserNotificationSettings:notiSettings];
}else{
[application registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
}
}
通过AppDelegate代理方法,拿到APNs返回的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
三,极光推送
https://www.jpush.cn/common/
1,极光后台账号的申请
2,极光后台应用的配置,和后台证书的配置
3,极光SDK接入应用
为什么需要把极光应用接入SDK?
获取到deviceToken以后,怎么把deviceToken传给服务器,以便服务器需要发送通知时候,可以拼接deviceToken参数。
a,新建项目
b,按照说明文档接入极光SDK
c,按照说明文档对接接口
四,推送通知
1,在真机中允许程序,直到log日志显示极光推送注册成功
2,在极光推送后台配置好推送消息,点击发送。
推送的消息内容一般不允许超过256字节。
五,应用获取推送消息
推送的消息可以在应用中获取到,AppDelegate一共有三个代理方法可以获取
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
这个方法,一般是用户收到通知以后,点击通知界面打开应用时候接受到。如果直接通过应用图标打开应用,这里接受不到推送消息,哪怕真的有推送通知。
2- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_AVAILABLE_IOS(3_0);
如果推送的时候,应用正在设备上运行,这个地方可以接受到推送的消息。
3- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
iOS7,以后新增的接受推送通知的接口,以后走这个。
极光推送接入常见问题:
1,关于项目,xcode7新建项目后,在info.plist中修改项目总是提示bundle id不匹配。
目前解决方案:直接创建项目时候,就保证bundle id正确。
2,极光SDK接入后,访问网络失败:
解决方案:xcode7默认不支持http,只支持比较安全的https;需要在info.plist文件中进行如下配置“NSAppTransportSecurity”“NSAllowsArbitraryLoads”

3,报错:
解决方案:进行如下设置

4,报错
You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.