在iOS8之后,以前的本地推送写法可能会出错,接收不到推送的信息,

如果出现以下信息:

<span  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中有下面这个方法:


 
 
1. // Registering UIUserNotificationSettings more than once results in previous settings being overwritten.  
2. - (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0);


这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。

第一步:注册本地通知:



 
    
 
1. // 设置本地通知  
2. + (void)registerLocalNotification:(NSInteger)alertTime {  
3. UILocalNotification *notification = [[UILocalNotification alloc] init];  
4. // 设置触发通知的时间  
5. NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];  
6. @"fireDate=%@",fireDate);  
7.     
8. .fireDate = fireDate;  
9. // 时区  
10. .timeZone = [NSTimeZone defaultTimeZone];  
11. // 设置重复的间隔  
12. .repeatInterval = kCFCalendarUnitSecond;  
13.     
14. // 通知内容  
15. .alertBody =  @"该起床了...";  
16. .applicationIconBadgeNumber = 1;  
17. // 通知被触发时播放的声音  
18. .soundName = UILocalNotificationDefaultSoundName;  
19. // 通知参数  
20. NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];  
21. .userInfo = userDict;  
22.     
23. // ios8后,需要添加这个注册,才能得到授权  
24. if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {  
25.     UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;  
26. UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type  
27.  categories:nil];  
28.  sharedApplication] registerUserNotificationSettings:settings];  
29. // 通知重复提示的单位,可以是天、周、月  
30. .repeatInterval = NSCalendarUnitDay;  
31. else {  
32. // 通知重复提示的单位,可以是天、周、月  
33. .repeatInterval = NSDayCalendarUnit;  
34.   }  
35.     
36. // 执行通知注册  
37.  sharedApplication] scheduleLocalNotification:notification];  
38. }


第二步:处理通知,这个是在appdelegate中的代理 方法回调


 
 
1. // 本地通知回调函数,当应用程序在前台时调用  
2. - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {  
3. @"noti:%@",notification);  
4.     
5. // 这里真实需要处理交互的地方  
6. // 获取通知所带的数据  
7. NSString *notMess = [notification.userInfo objectForKey:@"key"];  
8. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)"  
9.  message:notMess  
10.  delegate:nil  
11.  cancelButtonTitle:@"OK"  
12.  otherButtonTitles:nil];  
13.  show];  
14.     
15. // 更新显示的徽章个数  
16.  sharedApplication].applicationIconBadgeNumber;  
17.   badge--;  
18. 0 ? badge : 0;  
19.  sharedApplication].applicationIconBadgeNumber = badge;  
20.     
21. // 在不需要再推送时,可以取消推送  
22.  cancelLocalNotificationWithKey:@"key"];  
23. }


第三步:在需要的时候取消某个推送


1. // 取消某个本地推送通知  
2. + (void)cancelLocalNotificationWithKey:(NSString *)key {  
3. // 获取所有本地通知数组  
4. NSArray *localNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;  
5.     
6. for (UILocalNotification *notification in localNotifications) {  
7. NSDictionary *userInfo = notification.userInfo;  
8. if (userInfo) {  
9. // 根据设置通知参数时指定的key来获取通知参数  
10. NSString *info = userInfo[key];  
11.         
12. // 如果找到需要取消的通知,则取消  
13. if (info != nil) {  
14.  sharedApplication] cancelLocalNotification:notification];  
15. break;  
16.       }  
17.     }  
18.   }  
19. }


下载demo:https://github.com/632840804/LocalPush