推送通知
时间:2022-04-29 08:20
一、推送通知
1、iOS中提供了2种推送通知 本地推送通知(Local Notification) 远程推送通知(Remote Notification) 2、推送通知的作用 可以让不在前台运行的app,告知用户app内部发生了什么事情 3、推送通知有5种不同的呈现效果 在屏幕顶部显示一块横幅(显示具体内容) 在屏幕中间弹出一个UIAlertView(显示具体内容) 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容) 更新app图标的数字(说明新内容的数量) 播放音效(提醒作用) 4、推送通知的呈现效果设置 (1)显示横幅还是UIAlertView,取决于用户的设置 (2)用户也可以决定是否要开启以下4个功能: (3)发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来(4)点击推送通知后,默认会自动打开发出推送通知的app
(5)不管app打开还是关闭,推送通知都能如期发出
二、本地推送通知
1、什么是本地推送通知 顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持) 2、本地推送通知的使用场景 常用来定时提醒用户完成一些任务,比如 清理垃圾、记账、买衣服、看电影、玩游戏 3、如何发出本地推送通知 (1)创建本地推送通知对象UILocalNotification *ln = [[UILocalNotification alloc] init];
(2)设置本地推送通知属性
推送通知的触发时间(何时发出推送通知)property(nonatomic,copy) NSDate *fireDate;推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction;音效文件名
@property(nonatomic,copy) NSString *soundName;app图标数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
获得被调度(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification; - (void)cancelAllLocalNotifications;
立即发出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
(3) 本地推送通知的其他属性
每隔多久重复发一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;
点击推送通知打开app时显示的启动图片
@property(nonatomic,copy) NSString *alertLaunchImage;
附加的额外信息
@property(nonatomic,copy) NSDictionary *userInfo;
时区
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)
(4)点击本地推送通知
当用户点击本地推送通知,会自动打开app,这里有2种情况 app并没有关闭,一直隐藏在后台 让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;app已经被关闭(进程已死) 启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
(5)iOS 8.0的变化
在iOS 8.0中,如果要使用本地通知,需要得到用户的许可 在didFinishLaunchingWithOptions方法中添加如下代码:UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [application registerUserNotificationSettings:settings];
代码:
// 在iOS8之后,Apple对用户隐私要求更加严格,所有很多东西都需要请求用户权限 if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) { /* UIUserNotificationTypeNone = 0, // 不展示通知 UIUserNotificationTypeBadge = 1 << 0, // 应用图标右上角的红色数字权限 UIUserNotificationTypeSound = 1 << 1, // 提示音的权限 UIUserNotificationTypeAlert = 1 << 2, // 弹窗或横幅的权限 */ // 权限类型 UIUserNotificationType types = UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert; // 用户通知设置 UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:types categories:nil]; // 注册用户设置,用户的请求窗口会弹出一次 [[UIApplication sharedApplication] registerUserNotificationSettings:setting]; }
发送本地通知
// 1.创建本地通知对象 UILocalNotification *ln = [[UILocalNotification alloc] init]; // 2.设置本地通知属性 //************************************************************/ // 什么时候发送这个本地通知 ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; // 设置通知的内容 ln.alertBody = alertBody; // 设置提示音,如果用户是静音,它自动会转为震动 ln.soundName = UILocalNotificationDefaultSoundName; // 应用图标 ln.applicationIconBadgeNumber = 10; // 当用用户点击通知时候,进入应用程序,要不要显示启动图标 ln.alertLaunchImage = @"UILaunchImageFile"; // 用户信息(比如界面跳转的信息) ln.userInfo = userInfo; //************************************************************/ // 调度本地通知 [[UIApplication sharedApplication] scheduleLocalNotification:ln];
界面跳转
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // 如果应用程序被杀死了,我们需要在这里处理界面跳转 // 1.从应用程序的加载项取出本地通知对象 UILocalNotification *ln = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; // 2.如果存在这个对象,表示用户是点击本地通知进入到应用的 if (ln) { // 跳转界面 [self jumpToPageWithLocalNotification:ln]; } return YES; } /** 1.当收到本地通知就会调用该代理方法 调用场景 1.如果应用程序在后台,当点击通知的时候 2.如果应用程序在前台,一旦收到本地通知,就会调用该方法 3.如果应用程序被杀死了,那么这个方法就不再执行了 */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { /* UIApplicationStateActive, 活动 UIApplicationStateInactive, 活动与后台切换的一种状态 UIApplicationStateBackground 后台 */ // 如果应用在前台,就不要跳转界面了 if (application.applicationState == UIApplicationStateActive) { return; } // 跳转界面 [self jumpToPageWithLocalNotification:notification]; } ///跳转界面 - (void) jumpToPageWithLocalNotification:(UILocalNotification *) notification { // NSLog(@"%s",__func__); // 取出用户信息 NSDictionary *userInfo = notification.userInfo; // 拿到跳转到索引 NSInteger index = [userInfo[@"index"] integerValue]; // 获取根控制 UITabBarController *tabVc = (UITabBarController *)self.window.rootViewController; // 跳转界面 tabVc.selectedIndex = index; }
总结:
1.在发送本地通知的时候,通过userInfo属性来指示跳转到那个界面
2.监听本地通知的接收
1.当收到本地通知就会调用该代理方法
调用场景
1.如果应用程序在后台,当点击通知的时候
2.如果应用程序在前台,一旦收到本地通知,就会调用该方法
所以:判断如果应用程序在前台时候,不要执行界面跳转,来提高用户体验
3.如果应用程序被杀死了,那么这个方法就不再执行了
//- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
3.在 didFinishLaunchingWithOptions:方法中,完成界面跳转
判断用户是点击本地通知进入到应用的
1.从应用程序的加载项取出本地通知对象
UILocalNotification *ln = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
2.如果 ln 有值表示是用户点击本地通知进入的,这个时候,才需要进行界面跳转.
三、远程推送通知
1、远程推送通知 (1)什么是远程推送通知 顾名思义,就是从远程服务器推送给客户端的通知(需要联网) 远程推送服务,又称为APNs(Apple Push Notification Services)(2)为什么需要远程推送通知?
传统获取数据的局限性 只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容(3)远程推送通知可以解决以上问题
不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知2、远程推送通知使用须知
所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接 (1)什么是长连接、短连接 长连接:只要联网了,就一直建立连接 短连接:每一次都要想服务器发送请求,服务器返回数据之后,就断开的连接(2)长连接的作用
时间校准 系统升级 查找我的iPhone .. ...(3)长连接的好处
数据传输速度快 数据保持最新状态 3、开发远程推送的条件(1)开发iOS程序的推送功能, iOS端需要做的事
1.请求苹果获得deviceToken
2.得到苹果返回的deviceToken
3.发送deviceToken给公司的服务器
4.监听用户对通知的点击
(2)调试iOS的远程推送功能, 必备条件:
1.真机
2.调试推送需要的证书文件
1> aps_development.cer : 某台电脑就能调试某个app的推送服务
2> ios_development.cer : 让电脑具备真机调试的能力(调试设备)
3> iphone5_qq.mobileprovision : 某台电脑就能利用某台设备调试某个程序
(3)发布具有推送服务的app
1> aps_production.cer : 如果发布的程序中包含了推送服务,就必须安装这个证书
2> ios_distribution.cer : 让电脑具备发布程序的能力
3> qq.mobileprovision : 某台电脑就能发布某个程序
4、注册远程推送通知
客户端如果想接收APNs的远程推送通知,必须先注册(得到用户的授权) 一般在App启动完毕后就马上注册- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 注册远程通知 UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound; [application registerForRemoteNotificationTypes:type]; return YES; }
如果是第一次注册,会弹出右边的对话框
注册成功后会调用AppDelegate的下面方法,得到设备的deviceToken- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"%@", deviceToken); }
5、点击远程推送通知
当用户点击远程推送通知,会自动打开app,这里有2种情况 app并没有关闭,一直隐藏在后台 让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
app已经被关闭(进程已死)
启动app,启动完毕会调用AppDelegate的下面方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey取出服务器返回的字典内容
6、PushMeBaby
1、PushMeBaby是一款用来测试ANPs的开源Mac项目 它充当了服务器的作用,用法非常简单 它负责将内容提交给苹果的APNs服务器,苹果的APNs服务器再将内容推送给用户的设备PushMeBaby的主页
2、PushMeBaby的使用步骤 n注释掉不要的错误 填写必要信息 deviceToken:用于找到设备的令牌 payload:推送的内容 将推送的调试证书改为名apns.cer,添加到PushMeBaby项目中 command + R启动程序,然后点击Push 接下来就可以在设备上接收到远程推送通知四、JPush
(1)什么是JPush 一套远程推送解决方案,支持android和iOS两个平台 它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量、开发复杂度 更多的信息,可以参考JPush官方网站: 集成iOS SDK的步骤可以参考(2)JPush的集成步骤
注册帐号,创建应用 填写iOS App的必要信息 iOS开发证书和iOS生产证书必须是p12格式的交换证书 (4)利用JPush发送通知 JPush会自动记录和管理所有安装过此app的设备deviceToken 利用JPush,可以轻易地给所有设备发送远程推送通知