iOS中提供了2种推送通知:
- 本地推送通知(Local Notification)
- 远程推送通知(Remote Notification)
推送通知的作用
可以让不在前台运行的app,告知用户app内部发生了什么事情
推送通知有5种不同的呈现效果
- 在屏幕顶部显示一块横幅(显示具体内容)
- 在屏幕中间弹出一个UIAlertView(显示具体内容)
- 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
- 更新app图标的数字(说明新内容的数量)
- 播放音效(提醒作用)
本地推送(Local Notification)
什么是本地推送通知
顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)
本地推送通知的使用场景
- 常用来定时提醒用户完成一些任务;
- 比如 : 清理垃圾、记账、买衣服、看电影、玩游戏
如何发出本地推送通知
// 创建本地推送通知对象
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
----------------------------------------------
// 设置本地推送通知属性
// 推送通知的触发时间(何时发出推送通知)
@property(nonatomic,copy) NSDate *fireDate; 这2个属性必须设置
// 推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;
----------------------------------------------
// 调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
其他属性
// 在锁屏时显示的动作标题(完整标题:“滑动来” + 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;
// 每隔多久重复发一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;
// 点击推送通知打开app时显示的启动图片
@property(nonatomic,copy) NSString *alertLaunchImage;
// 附加的额外信息
@property(nonatomic,copy) NSDictionary *userInfo;
// 时区
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)
iOS 8.0之后的的变化
- 在iOS 8.0之后如果要使用本地通知,需要得到用户的许可;
- 在 didFinishLaunchingWithOptions方法中添加如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 判断版本号
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert categories:nil];
// 注册用户是否需要通知内容
[application registerUserNotificationSettings:setting];
}
return YES;
}
以下是一段本地推送的简单代码
- (IBAction)localNote:(id)sender {
// 创建本地通知对象
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
localNotification.alertBody = @"Hello,i`m notification";
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
以下为展示效果
相信大家都会遇到这样一个需求:
- 根据点击的通知跳转到不同的页面里面
- 比如正在用QQ和朋友聊天,但此时微信来了一条信息,那么点击通知后,需要直接跳转到微信的聊天界面,那这个该怎么实现呢?
- 这时就要去系统的AppDelegate中做点事情了
首先我们先来了解一个AppDelegate中的方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
- 从上面我们可以得出结论
- 这个方法是App在进入前后,或者在前台的时候都会执行的方法
- 所以我们需要通过这个方法监听到用户点击后,来完成跳转
- 而且需要判断是否
是正在进入前台的时候
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
if (application.applicationState == UIApplicationStateInactive) {
// 跳转界面代码段
// 可以根据UserInfo判断跳转到哪个界面
}
}
- 还有一种情况就是当用户
杀死
了App后 - 就不能在
didReceiveLocalNotification
这个方法中进行跳转了,因为杀死了程序后,是不会调用这个方法的 - 这个时候就需要在
didFinishLaunchingWithOptions
这个方法中跳转 - 而且在这个方法中要判断是通过
点击图标
打开的,还是通过点击通知
打开的应用程序
LaunchOptions是一个字典,以下是存放的Key
NSString *const UIApplicationLaunchOptionsURLKey;
NSString *const UIApplicationLaunchOptionsSourceApplicationKey;
NSString *const UIApplicationLaunchOptionsRemoteNotificationKey;
NSString *const UIApplicationLaunchOptionsLocalNotificationKey; <-可以通过这个key来判断
NSString *const UIApplicationLaunchOptionsAnnotationKey;
NSString *const UIApplicationLaunchOptionsLocationKey;
NSString *const UIApplicationLaunchOptionsNewsstandDownloadsKey;
NSString *const UIApplicationLaunchOptionsBluetoothCentralsKey;
NSString *const UIApplicationLaunchOptionsBluetoothPeripheralsKey;
NSString *const UIApplicationLaunchOptionsShortcutItemKey;
NSString *const UIApplicationLaunchOptionsUserActivityDictionaryKey;
NSString *const UIApplicationLaunchOptionsUserActivityTypeKey;
远程推送(Remote Notification)
什么是远程推送通知
顾名思义,就是从远程服务器
推送给客户端
的通知(需要联网)
远程推送服务,又称为APNs(Apple Push Notification Services)
为什么需要远程推送通知?
传统获取数据的局限性
只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
远程推送通知可以解决以上问题
不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知
远程推送使用须知 :
- 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
- 什么是长连接 : 只要联网了,就一直建立连接
- 长连接的作用 :
- 时间校准
- 系统升级
- 查找我的iPhone
- 长连接的好处 :
- 数据传输速度快
- 数据保持最新状态
- 远程通知
获得deviceToken的过程
从获得deviceToken到推送消息给设备的过程
一.开发iOS程序的推送功能, iOS端需要做的事
1.请求苹果获得deviceToken
2.得到苹果返回的deviceToken
3.发送deviceToken给公司的服务器
4.监听用户对通知的点击
二:做远程通知提前做的操作:
- 可以真机调试(Device Token)
- 明确APPID
- 给APPID配置两个整数
- 远程推送专门配置一个描述文件
三:代码的实现
- iOS7 和 iOS8 分别发送请求,请求DeviceToken
- 获取DeviceToken代理方法
- 将DeviceToken发送给服务器(或者发送给激光推送)
- 通过
didReceiveRemoteNotifications
这个方法监听远程通知的点击
// 判断版本号
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
} else { // iOS7
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
}
}
// 注册远程通知
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
// 将DeviceToken传给服务器
NSLog(@"%@", deviceToken.description);
}