iOS几种设计模式之-通知
这里要讲的通知并不是NSNotification,而是用于基于行为的通知UILocalNotification(本地通知)和远程通知,主要用来当程序在后台运行时,通过本地或者远程通知传送给用户。至于NSNotification一般用来在不同页面传值或者响应事件,在后边的博客中会讲到的。
1.本地通知
本地通知(local notification),用于基于行为的通知,比如有关日历提醒一类的应用。同时如果应用程序不在前台运行,本地通知也是一个很有用的机制。比如,一个应用,在后台运行,向应用的服务器端获取消息,当消息到达时,比如下载更新版本的提示消息,通过本地通知机制通知用户。
本地通知时UILocalNotification的实例,主要有三类属性:
1.scheduled time 时间周期,用来指定iOS系统发送通知的日期和时间;
2.notification type ,通知类型,包括警告信息,动作按钮的标题,应用图标上的badge(数字标记)和播放的声音;
3.自定义数据,本地通知可以包含一个dictionary类型的本地数据
注意:iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被忽略。
1.1 iOS的四种通知类型
1.横幅(Banner) 横幅通知是在iOS5中出现的新特性,是显示在屏幕顶部的横条,几秒钟会自动消失。一条横幅通知会显示程序的小图标,程序的名字和通知的内容。小图标可以帮助用户一眼就看清楚是哪一个程序在提醒他们。
2.提醒(Alert) 提醒通知不会自动消失,需要用户与之交互才能关闭。设计师需要设计通知的具体内容,有时还要action button设计title。整个提醒通知的背景样式,包括里面的按钮的样式都是不可变的,所以设计师和开发者就不要发挥创意了。Android由于其开放性,我们是可以自己设计控件的,而iOS这样做可能是为了保持UI风格的一致性。
3.标记(Badge)
标记通知是显示在程序图标的右上角的红色椭圆形标记,里面显示的数字表示需要用户处理的通知的数量。同样地,标记地颜色和形状、大小也是不可更改地。app store中有更新地应用程序的数量,mail中收到的未读邮件的数量都是用标记通知用户的。
4.声音(Sound)
声音提示也是iOS的一种通知方式,支持自定义,可以与前面的三种通知类型搭配使用。
1.2 本地通知Demo
//当应用程序在后台运行的时候, 本地通弹出, 当用户点击通知框上的Action按纽的时候, 这个委托方法将会被调用
(void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification )notification
{
NSDictionary *usrInfo = notification.userInfo;
NSLog(@"%@",[usrInfo objectForKey:@"From"]);
}
//viewController的viewDidLoad方法
(void)viewDidLoad {
[super viewDidLoad];
UILocalNotificationlocalNotification = [[UILocalNotification alloc] init];
NSDatenowDate = [NSDate new];
//设置通知的响应时间
localNotification.fireDate = [nowDate dateByAddingTimeInterval:5]; localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.alertBody = @"六点半开始上课";
localNotification.alertAction = @"知道了";
//通知声音为自己本地下载好的声音
localNotification.soundName = @"msgcome.wav";
localNotification.applicationIconBadgeNumber = 2;
NSDictionary *usrInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"From",@"Value", nil];
localNotification.userInfo = usrInfo;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
当运行程序后,按home健返回到主界面,这个时候程序在后台运行,几秒钟后可以收到通知提醒。
2.远程推送通知
1.应用程序的推送通知机制:
该应用的远程服务(provider)先发出一条通知给苹果的推送通知服务(Apple Push Notification service,APNS),苹果的通知服务器再把这个通知推送给所以安装了这个应用的iOS设备。
2.通知类型
如果要使用推送通知,必须先在苹果的推送通知服务里注册你要使用哪几种类型的通知。
注:必须在真机上才能测试和运行,同时需要安装远程推送证书,这个大家需要注意,不然X-code一直会报错。
3.具体过程:
1.app首先向手机注册远程通知,自己可以确定注册通知的类型。
2.device向APNS发送一个连接请求,目的是请求到一个device token,APNS收到请求后,返还给device一个device token。
3.device把token发送给provider(服务器),服务器把通知传送给APNS,通过远程服务再把这个通知推送给所有安装了这个应用的iOS设备。
注意:测试只能在真机上测试,并且需要一个远程推送通知证书,没有证书是不能推送的,在编译的时候就会报错。
4.一个简单的demo
第一步
在appdelegate中
//注册通知
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound ];
return YES;
}
//注册成功之后,回调此方法
- (void)application:(UIApplication )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData)deviceToken {
NSLog(@"%@",deviceToken);
}
//失败后回调此方法,我们把失败的内容打印出来
- (void)application:(UIApplication )application didFailToRegisterForRemoteNotificationsWithError:(NSError)error {
NSLog(@"%@",error);
}
//收到远程通知之后,会回调此方法
(void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo {
NSLog(@"%s",func);
}
第二步
创建远程推送证书以及本地配置文件,这个操作网上有很多教程,大家可以自己去看看。
第三步
在取到deviceToken后,需要把这个deviceToken发送给provider,也就是一个服务器,这里我给大家推荐一个用OC写的第三方provider,我把它放在了gitHub上进行了托管,大家可以去这个链接上下载。
去这个链接去下载:链接
或者直接在命令行中输入:
git clone https://github.com/papercai/RemotePushProvider.git
运行起来之后,输入取到的deviceToken,就可以收到APNS发送来的通知,可以是铃声或者程序右上方红色的数字或者横幅和标记等。
3.需要注意的几点
1.保证标记的内容时最新的
2.对同一事件不要发出多个通知
3.通知内容不用包含应用程序的名称
4.关注于信息的表达,而不是用户的操作。避免提示用户去点哪一个按钮或者如何打开app
5.简短,最好不要超过两行。
6.使用句式大写和合适的标点符号,结尾一般使用句号。