在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