在iOS8之后,以前的本地推送写法可能会出错,接收不到推送的信息,
如果出现以下信息:
<span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">1 Attempting to schedule a local notification
2 with an alert but haven't received permission from the user to display alerts
3 with a sound but haven't received permission from the user to play sounds</span>
说明在IOS8下没有注册,所以需要额外添加对IOS8的注册方法,API中有下面这个方法:
- // Registering UIUserNotificationSettings more than once results in previous settings being overwritten.
- - (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0);
这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。
第一步:注册本地通知:
- // 设置本地通知
- + (void)registerLocalNotification:(NSInteger)alertTime {
- UILocalNotification *notification = [[UILocalNotification alloc] init];
- // 设置触发通知的时间
- NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];
- NSLog(@"fireDate=%@",fireDate);
- notification.fireDate = fireDate;
- // 时区
- notification.timeZone = [NSTimeZone defaultTimeZone];
- // 设置重复的间隔
- notification.repeatInterval = kCFCalendarUnitSecond;
- // 通知内容
- notification.alertBody = @"该起床了...";
- notification.applicationIconBadgeNumber = 1;
- // 通知被触发时播放的声音
- notification.soundName = UILocalNotificationDefaultSoundName;
- // 通知参数
- NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];
- notification.userInfo = userDict;
- // ios8后,需要添加这个注册,才能得到授权
- if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
- UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
- UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type
- categories:nil];
- [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
- // 通知重复提示的单位,可以是天、周、月
- notification.repeatInterval = NSCalendarUnitDay;
- } else {
- // 通知重复提示的单位,可以是天、周、月
- notification.repeatInterval = NSDayCalendarUnit;
- }
- // 执行通知注册
- [[UIApplication sharedApplication] scheduleLocalNotification:notification];
- }
第二步:处理通知,这个是在appdelegate中的代理 方法回调
- // 本地通知回调函数,当应用程序在前台时调用
- - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
- NSLog(@"noti:%@",notification);
- // 这里真实需要处理交互的地方
- // 获取通知所带的数据
- NSString *notMess = [notification.userInfo objectForKey:@"key"];
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"
- message:notMess
- delegate:nil
- cancelButtonTitle:@"OK"
- otherButtonTitles:nil];
- [alert show];
- // 更新显示的徽章个数
- NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
- badge--;
- badge = badge >= 0 ? badge : 0;
- [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
- // 在不需要再推送时,可以取消推送
- [HomeViewController cancelLocalNotificationWithKey:@"key"];
- }
第三步:在需要的时候取消某个推送
- // 取消某个本地推送通知
- + (void)cancelLocalNotificationWithKey:(NSString *)key {
- // 获取所有本地通知数组
- NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;
- for (UILocalNotification *notification in localNotifications) {
- NSDictionary *userInfo = notification.userInfo;
- if (userInfo) {
- // 根据设置通知参数时指定的key来获取通知参数
- NSString *info = userInfo[key];
- // 如果找到需要取消的通知,则取消
- if (info != nil) {
- [[UIApplication sharedApplication] cancelLocalNotification:notification];
- break;
- }
- }
- }
- }