博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推送通知(本地推送+远程推送)详解
阅读量:6263 次
发布时间:2019-06-22

本文共 5267 字,大约阅读时间需要 17 分钟。

  hot3.png

#推送通知

IOS推送通知有两种:
1、本地推送通知(Local Notification)
2、远程推送通知(Remote Notification)

推送消息传输路径: Provider-APNs-Client App

GD

推送通知的呈现效果:

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 上传到服务器,服务器在推送时使用。

GD

(1)客户端向苹果服务APNS,发送设备的UDID和Bundle Identifier.
(2)经苹果服务器加密生成一个deviceToken
(3)将当前用户的deviceToken,发送给自己应用的服务器
(4)自己的服务器,将得到的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
输入图片说明

转载于:https://my.oschina.net/hgvbhb/blog/750568

你可能感兴趣的文章
redis第二步(事务和锁)
查看>>
磁盘空间满引起的mysql启动失败:ERROR! MySQL server PID file could not be found!
查看>>
Net Standard扩展支持实例分享
查看>>
RHEL,centOS下vncserver,service命令关联的rpm包
查看>>
QTP关键字视图下显示项的相关设置
查看>>
linux cpu内存利用率获取
查看>>
Binder.js的重写过程记录
查看>>
汗,铁道部的12306js脚本竟然用的这么杂乱
查看>>
点播转码相关常见问题及排查方式
查看>>
[arm驱动]linux设备地址映射到用户空间
查看>>
在线转码
查看>>
博客园美化-coffee
查看>>
How to create own operator with python in mxnet?
查看>>
开放源代码的设计层面框架Spring——day02
查看>>
[SP694][SP705]DISUBSTR - Distinct Substrings/SUBST1 - New Distinct Substrings[SA]
查看>>
Jquery 选择器大全 【转载】
查看>>
066、Weave如何与外网通信?(2019-04-09 周二)
查看>>
shell脚本入门
查看>>
【转】oracle in与exists语句的区别
查看>>
python之正则表达式模块
查看>>