在 ios 开发中,经常会使用到通知的功能。而通知又分为本地通知和远程通知。远程通知的实现有很多中,可以利用第三方实现。本文主要介绍本地通知的使用,远程通知会在后面给大家介绍。要实现本地通知的功能很简单,只需要一个类就够了。这个类就是UILocalNotification。通过它就能轻轻松松实现本地通知的功能。下面直接上代码
/**
* 设置本地通知
*/
- (void)settingNotication{
// 判断是否是 ios8以上的系统。如果是 ios8 只需要主动向用户注册通知设置(比如是否运行弹框,设置图标右上角数字等)
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]];
}
// 创建本地推送对象
UILocalNotification *notification = [[UILocalNotification alloc] init];
// 设置通知触发时间
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
// 设置时区(为空则使用默认时区,该属性值决定了fireDate的时间)
notification.timeZone = [NSTimeZone defaultTimeZone];
// 设置推送重复间隔时间(这里设置了一分钟推送一次通知)
notification.repeatInterval = NSCalendarUnitMinute;
// 设置通知声音(可以指定一个声音文件名,包括扩展名。声音文件时长不能超过30秒,超过30秒系统会使用默认的声音)
notification.soundName = UILocalNotificationDefaultSoundName;
// 设置通知内容(该属性值为 nil,则通知触发了也不会有任何提示)
notification.alertBody = @"是时候吃早餐了";
// 设置应用图片右上角显示的文字
notification.applicationIconBadgeNumber = 10;
// 设置用户点击提醒框中动作按钮(“View”)时,等待应用加载时显示的图片,这个将替代应用原本设置的加载图片
// 该属性在 ios8下没有效果
notification.alertLaunchImage = @"images";
// 在锁屏情况下,该属性替换“slide to unlock” 中“unlock”
notification.alertAction = @"去吃早餐";
// 传递数据
notification.userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"测试通知001",@"notificationId", nil];
// 将通知登记到系统Notification处理队列中(这一步非常重要,没有这一步,创建出来的通知可以说废的)
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
运行效果图
图一:没有锁屏的情况下
图二:锁屏情况下
如何处理UILocalNotification?
在提醒框动作按钮被点击后,应用开始运行是,可以在-(BOOL)application:didFinishLaunchingWithOptions:这个Application delegate方法中处理。可以通过以下方式来加载最近未处理的通知。UILocalNotification *localNotif=[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];如果应用正在运行时,可以通过覆盖在Application Delegate中的方法
-(void)application:didReceiveLocalNotification:来处理Notification。作为方法的第二个参数为UILocalNotification对象,
只需处理对象携带的userInfo来处理响应的动作。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification {
// 处理接收到的本地通知
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"接收到本地提醒p" message:notification.alertBody
delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alert show];
//在这里你就可以通过notification的useinfo做自己想做的事情
// ..........................
// 取消某个特定的本地通知
for (UILocalNotification *noti in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
NSString *notiID = noti.userInfo[@"notificationId"];
NSString *receiveNotiID = notification.userInfo[@"notificationId"];
if ([notiID isEqualToString:receiveNotiID]) {
[[UIApplication sharedApplication] cancelLocalNotification:notification];
return;
}
}
}
总结
本地通知的机制在应用开发中非常有效,可以很好的帮助开发者管理一些指定时间需要发生的事件,例如闹钟类的应用。而且因为系统统一对本地通知的管理,让同样的任务可以非常简单得被处理,而无需让应用浪费资源去等待事件的触发。