ios通知机制
ios通知机制是ios消息传递机制的一部分,关于ios消息传递机制有篇不错的博文,http://www.cocoachina.com/applenews/devnews/2013/1216/7543.html
[/size]
IOS中还有一类产生事件的功能,那就是通知。通过通知,可以在一定的条件下触发响应的事件。类似于Android中的广播机制(BroadcaseReceiver),接收到通知(广播)后,便可执行指定的方法。
通过NSNotificationCenter获取通知对象,注册并使用通知。
在iOS下应用分为两种不同的Notification种类,本地和远程。
1.本地UILocalNotificaiton的使用
本地的Notification由iOS下NotificationManager统一管理,只需要将封装好的本地Notification对象加入到系统Notification管理机制队列中,系统会在指定的时间激发将本地Notification,应用只需设计好处理Notification的方法就完成了整个Notification流程了。
本地Notification所使用的对象是UILocalNotification,UILocalNotification的属性涵盖了所有处理Notification需要的内容。UILocalNotification的属性有fireDate、timeZone、repeatInterval、repeatCalendar、alertBody、alertAction、hasAction、alertLaunchImage、applicationIconBadgeNumber、soundName和userInfo。
Demo:
//发送通知 UILocalNotification *notification=[[UILocalNotification alloc] init]; if (notification!=nil) { NSDate *now=[NSDate new]; notification.fireDate=[now dateByAddingTimeInterval:10];//10秒后通知 notification.repeatInterval=0;//循环次数,kCFCalendarUnitWeekday一周一次 notification.timeZone=[NSTimeZone defaultTimeZone]; notification.applicationIconBadgeNumber=1; //应用的红色数字 notification.soundName= UILocalNotificationDefaultSoundName;//声音,可以换成alarm.soundName = @"myMusic.caf" //去掉下面2行就不会弹出提示框 notification.alertBody=@"通知内容";//提示信息 弹出提示框 notification.alertAction = @"打开"; //提示框按钮 //notification.hasAction = NO; //是否显示额外的按钮,为no时alertAction消失 // NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"]; //notification.userInfo = infoDict; //添加额外的信息 [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } [notification release];
取消通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. application.applicationIconBadgeNumber = 0; // Add the view controller's view to the window and display. [window addSubview:viewController.view]; [window makeKeyAndVisible]; return YES; } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { //点击提示框的打开 application.applicationIconBadgeNumber = 0; } - (void)applicationDidBecomeActive:(UIApplication *)application { //当程序还在后天运行 application.applicationIconBadgeNumber = 0; }
登记UILocalNotification
在设置完UILocalNotification对象之后,应用需要在系统Notification处理队列中登记已设置完的UILocalNotification对象。登记UILocalNotification*localNotification的方式为:
[[UIApplicationsharedApplication]scheduleLocalNotification:localNotification];
在有些时候,应用可能需要直接激发一个Notification而不是等一段时间在激发,应用可以以下的方式直接触发已设好的Notification:
[[UIApplicationsharedApplication]presentLocalNotificationNow:localNotification];
处理UILocalNotification
在提醒框动作按钮被点击后,应用开始运行时,可以在-(BOOL)application:didFinishLaunchingWithOptions:这个Applicationdelegate方法中处理。可以通过以下方式来加载为最近未处理的Notification:
UILocalNotification*localNotif=[launchOptionsobjectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
如果应用正在运行时,可以通过覆盖在ApplicationDelegate中的方法-(void)application:didReceiveLocalNotification:来处理Notification。作为方法的第二个参数为UILocalNotification对象,只需处理对象携带的userInfo来处理响应的动作。
取消UILocalNotification
可以使用以下两个方式来取消一个已经登记的Notification,第一个方式可以直接取消一个指定的Notification,第二个方式将会把该应用已登记的Notification一起取消
[[UIApplicationsharedApplication]cancelLocalNotification:localNotification];
[[UIApplicationsharedApplication]cancelAllLocalNotification];
2.NSNotificationCenter消息通信机制介绍
---是专门供程序中不同类间的消息通信而设置的
注册通知:即要在什么地方接受消息
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(mytest:)name:@"mytest"object:nil];
参数介绍:
addObserver: 观察者,即在什么地方接收通知;
selector: 收到通知后调用何种方法;
name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
发送通知:
调用观察者处的方法。
[[NSNotificationCenterdefaultCenter]postNotificationName:@"mytest" object:searchFriendArray];
参数:
postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
object:传递的参数
注册方法的写法:
-(void)mytest:(NSNotification*)notification
{
idobj=[notificationobject];//获取到传递的对象
}
附:注册键盘升启关闭消息 //键盘升起 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; //键盘降下 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
远程通知:http://www.cocoachina.com/newbie/tutorial/2012/0104/3827.html