#推送通知
IOS推送通知有两种: 1、本地推送通知(Local Notification) 2、远程推送通知(Remote Notification)推送消息传输路径: Provider-APNs-Client App
推送通知的呈现效果:
1.在屏幕顶部显示的一条横幅 2.在屏幕中间弹出一个UIAlertView 3.在锁屏界面显示一块横幅 4.跟新app图标的数字 5.播放音效##本地推送
本地推送是由iOS下的NotificationManage进行统一管理的,将封装好的本地Notification对象加入到系统的Notification管理中,不需要服务器支持(无需联网)就能发出的推送通知。创建本地推送并设置相关属性
UILocalNotification *localNote = [[UILocalNotification alloc]init]; //设置通知发出的时间 localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:2.0]; //设置通知的内容 localNote.alertBody = @"你好!"; //设置锁屏界面的文字 localNote.alertAction = @"您有一条新消息,请查收"; //设置锁屏界面alertAction是否有效 localNote.hasAction = YES; //设置通过点击通知打开APP的时候的启动图片 localNote.alertLaunchImage = @"1"; //设置应用程序图标右上角的数字 localNote.applicationIconBadgeNumber = 1; //设置通知之后的属性 localNote.userInfo = @{@"name" : @"张三", @"toName" : @"李四"};
当用户点击本地推送通知的时候,会自动打开app,有两种情况:
1、app没有关闭,只是一直隐藏在后台// 如果是应用程序在前台,依然会收到通知,但是收到通知之后不应该跳转 if (application.applicationState == UIApplicationStateActive) return; if (application.applicationState == UIApplicationStateInactive) { // 当应用在后台收到本地通知时执行的跳转代码 [self jumpToSession]; }
2、app已经关闭
//ios8.0以后要使用本地通知,需要得到用户的许可. [application setApplicationIconBadgeNumber:0]; if (IS_iOS8) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:settings]; } // 如果是正常启动应用程序,那么launchOptions参数是null if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) { // 当app关闭状态收到本地通知时执行的跳转代码 // [self jumpToSession]; UILabel *View = [[UILabel alloc] init]; View.backgroundColor = [UIColor redColor]; View.frame = CGRectMake(0, 100, 300, 400); View.numberOfLines = 0; View.text = [NSString stringWithFormat:@"%@", launchOptions]; [self.window.rootViewController.view addSubview:View]; }
//取消本地通知 [[UIApplication sharedApplication] cancelLocalNotification:notification]; notification.applicationIconBadgeNumber = 0;
//取消通知后将程序图标右上角的数字清除[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
##远程推送
远程推送也就是APNs(Apple Push Notification Services),需要服务器的支持并且处于长连接的状态,是从远程服务器推送给客户端的通知(需要联网)。远程推送有一下几个重要步骤:
###1、创建推送证书 ####创建APP ID (1)登录,注册登录 (2)如图点击右上角的+号 (3)自定义name,选择通配符APP ID,填写后缀,BundleID填写好后一定要记牢,后面会用到 注意:必须创建完整的appID,不能带有* ####请求文件 (1)打开钥匙串 (2) (3)输入邮箱及常用名后点击存储到磁盘 (4)点击继续 ,请求文件创建完成 ####创建开发证书(用于真机调试)、发布证书开发证书 (1)选择Development,选择右上角的+号 (2)选择IOS APP Development(用于真机调试使用)点击continue (3)选择刚刚创建的APP ID (4) 点击Choose File ,选择刚刚生成的请求文件 (5) 创建完成,点击done (6)再在development中添加,选择 Apple Push Notification service SSL(在开发环境测试时使用) (7)其余步骤和上面相同,创建成功后选择Down,下载开发证书 **生产证书 ** (1)选择Production,点击右上角+号 (2)App Store and Ad Hoc是将生产证书上传到App Store中,点击continue (3)选择请求文件 (4)创建成功 (5)生产环境下发送推送 (6)其余步骤同上,创建成功后,下载发布证书 **导出证书 ** (1)在钥匙串中找到Apple Development证书,右击 (2)选择导出 (3) (4)设置密码为空 (5)点击允许,成功生成.p12文件 (6)导出Apple Push Service证书步骤同上 ####生成配置文件 (1)在苹果开发者平台中选择Provisioning Profiles中的all,点击右上角+号 (2)创建Development证书的配置文件 (3)选择最开始创建的APP ID (4)创建Distribution的配置文件(测试打包生产环境下) (5)其他步骤同上 ####安装证书 (1)注册登录 (2)点击创建应用 (3)将导出的开发证书和生产证书上传 (4)上传成功后如图 ###使用CocoaPods导入第三方库 (JPUSHService) ###3、获取deviceToken (用户标识) App 必须要向 APNs 请求注册以实现推送功能,在请求成功后,APNs 会返回一个设备的标识符即 DeviceToken 给 App,服务器在推送通知的时候需要指定推送通知目的设备的 DeviceToken。在 iOS 8 以及之后,注册推送服务主要分为四个步骤:- 使用 registerUserNotificationSettings:注册应用程序想要支持的推送类型
- 通过调用 registerForRemoteNotifications方法向 APNs 注册推送功能
- 请求成功时,系统会在应用程序委托方法中返回 DeviceToken,请求失败时,也会在对应的委托方法中给出请求失败的原因。
- 将 DeviceToken 上传到服务器,服务器在推送时使用。
在AppDelegate.m文件中写以下代码,注册推送通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //注册推送 if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { //可以添加自定义categories [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil]; } //Required // init Push(2.1.5版本的SDK新增的注册方法,改成可上报IDFA,如果没有使用IDFA直接传nil ) // 如需继续使用pushConfig.plist文件声明appKey等配置内容,请依旧使用[JPUSHService setupWithOption:launchOptions]方式初始化。 [JPUSHService setupWithOption:launchOptions appKey:AppKey channel:nil apsForProduction:NO]; //清除图标右上角的数字 [UIApplication sharedApplication].applicationIconBadgeNumber = 0; return YES;}
注意:appKey一定要和极光创建的应用appKey一致
利用回调的方式获取deviceToken。
- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { //把deviceToken上报到极光服务器 [JPUSHService registerDeviceToken:deviceToken];}
接收苹果服务器传回的设备唯一标识deviceToken,苹果服务器响应之后, 就会调用这个方法, 把deviceToken 传给我们 ###4、配置X-Code
(1)这里的Bundle Identifier 与先前证书中的BundleID要一致 (2)打开消息推送 (3)在info.plist文件中添加App Transport Security Settings,并将Allow Arbitrary Loads的value该为YES