作品链接:
http://www.jianshu.com/users/1e0f5e6f73f6/top_articles
- 作用:让不在前台(后台或者关闭)的APP知道APP内部发生的事情
1.本地通知
一.本地通知的介绍
- 直接由应用程序(程序中写入对应代码)给用户发出通知
- 本地通知需要用到一个重要的类:UILocalNotification
- 本地通知的实现步骤
1.创建本地通知
2.设置本地通知要发出的内容等信息
2.1发出时间
2.2发出内容
2.3播放的音效
3.调度本地通知
二.实现本地通知
1.注册通知
- iOS8之后,如果想要发出通知(无论本地还是远程),必须先进行注册.(iOS8之前不需要)
- 通常是在didFinishLaunchingWithOptions中进行注册
代码如下:
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
}
2.创建并且发出通知
// 1.创建本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 2.设置本地通知的信息
// 2.1.设置提示信息
localNote.alertBody = @"我想你了";
// 2.2.设置通知弹出的时间
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
// 2.3.设置滑块显示的文字
localNote.alertAction = @"美女来了";
// 2.4.是否让上面的文字生效
localNote.hasAction = NO;
// 2.5.设置通知中心的标题
localNote.alertTitle = @"十万火急的事";
// 2.6.设置通知的声音
localNote.soundName =UILocalNotificationDefaultSoundName;
// 2.7.设置应用程序图标右上角的数字
localNote.applicationIconBadgeNumber = 5;
// 3.调度通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
3.本地通知的方法
@property(nonatomic,copy) NSDate *fireDate; 发出时间
@property(nonatomic,copy) NSTimeZone *timeZone; 时区,如果不设置,则是系统默认的时区
@property(nonatomic) NSCalendarUnit repeatInterval; 多久重复一次(枚举类型)
@property(nonatomic,copy) NSCalendar *repeatCalendar; 多久重复一次(日期类型)
@property(nonatomic,copy) CLRegion *region 设置区域(进入某区域时发出通知)
@property(nonatomic,assign) BOOL regionTriggersOnce 进入某一个区域是否只提醒一次
@property(nonatomic,copy) NSString *alertBody; 通知的内容
@property(nonatomic) BOOL hasAction; 用于决定alertAction是否生效
@property(nonatomic,copy) NSString *alertAction;
@property(nonatomic,copy) NSString *alertLaunchImage;
@property(nonatomic,copy) NSString *alertTitle 设置通知中心的标题
// sound
@property(nonatomic,copy) NSString *soundName; 接收到通知时的音效(通常使用默认音效)
@property(nonatomic) NSInteger applicationIconBadgeNumber; 改变应用图标右上角的数字
@property(nonatomic,copy) NSDictionary *userInfo; 设置通知一些额外的信息
2.监听本地通知的点击
一.为什么要监听本地通知的点击?
- 1.通知点击之后会发生什么事情?
不管应用程序出于后台还是被杀死,点击通知都可以打开应用程序 - 2.什么情况下需要监听用户点击了通知(不常用)
比如:当用点击通知时,进入到某一个固定界面
二.如何监听本地通知的点击
- 应用程序分很多种状态
- 在前台
- 如果在前台不需要进行页面跳转
- 在后台
- 点击应用时进行页面的跳转
- 被杀死
- 点击应用打开应用时,进行页面的跳转
- 在前台
- 该代码为应用程序在前台或者后台时的做法
/*
UIApplicationStateActive, 在前台
UIApplicationStateInactive, 进入前台
UIApplicationStateBackground 在后台
*/
// 应用在前台时,也会收到该通知,这时不应该进行页面的跳转
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
// 跳转到固定的界面
if (application.applicationState == UIApplicationStateInactive) {
// 进行页面的跳转
} else {
// 其他情况不需要跳转
}
}
- 该代码为应用程序被杀死时的做法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
[application registerUserNotificationSettings:settings];
}
// launchOptions:
// 如果是正常启动程序,该参数为nil.
// 如果是通过别的方式打开我的应用程序,则launchOptions有值
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
// 跳转代码
}
return YES;
}
3.远程通知
一.什么是远程通知
- 概念:由服务器发送消息给用户弹出消息的通知(需要联网)
- 远程推送服务,又称为APNs(Apple Push Notification Services)
- 远程通知的好处:不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知
二.疑问
-
为什么公司服务器不直接推消息给用户?
- 在通常情况下服务器端是不能主动向客户端推消息的.
- 如果想服务器端给客户端推消息,必须建立长连接
- 公司客户端在处于后台时不能和服务器端建立长连接
-
为什么苹果服务器可以推消息给用户?
- 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
- 苹果建立长连接的作用:
- 时间校准
- 系统升级提示
- 查找我的iPhone
- 远程通知
- ...
-
苹果在推送消息时,如何准确的推送给某一个用户,并且知道是哪一个APP?
- 在公司服务器把消息给苹果的APNs服务器时,必须告知苹果DeviceToken
- 什么是DeviceToken?
- DeviceToken是由用户手机的UDID和应用程序的BundleID共同生成的
- 通过DeviceToken可以找到唯一手机中的唯一应用程序
- 如何获得DeviceToken?
- 客户端到苹果的APNs注册即可获得.
3.如何做远程通知
- 首先,BundleID对应的APPID必须是明确的(特殊功能)
- 该APPID必须配置两个证书
- 开发证书:用于调试远程推送
- 发布证书:用于发布后给用户推送消息
- 根据上面的APPID重新配置描述文件
- 安装对应的证书,即可开始测试远程推送
4.获取DeviceToken
-
1.在苹果的APNs服务器注册,以获取DeviceToken
- 通常在didFinishLaunchingWithOptions中添加如下代码进行注册
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
// 注册推送通知(本地通知/远程通知)
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
// 获取DeviceToken
[application registerForRemoteNotifications];
} else {
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeBadge];
}
if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
// 写跳转代码即可
}
return YES;
}
- 2.注册之后在另外一个代理方法中,拿到DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@",deviceToken);
}
- 3.将DeviceToken发送到服务器即可
4.监听远程通知的点击
一.为什么要监听远程通知的点击
- 比如有需求:点击通知之后跳转到某一个界面中
- 微信/QQ等应用并没有做该功能(不常见)
二.如何监听点击
- 1.应用程序分很多种状态
- 在前台
如果在前台不需要进行页面跳转 - 在后台
点击应用时进行页面的跳转 - 被杀死
点击应用打开应用时,进行页面的跳转
- 在前台
- 2.当应用程序出于后台时的监听
// 和本地通知基本一致,只是这里是接收到远程通知
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
// 跳转到固定的界面
if (application.applicationState == UIApplicationStateInactive) {
// 进行页面的跳转
} else {
// 其他情况不需要跳转
}
}
- 3.应用程序被杀死时的监听
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 判断是否是通过点击通知打开了应用程序
if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
// 写跳转代码即可
}
return YES;
}