本地推送通知效果图如下:
// 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; }
当退出后台时,发一条本地通知
- (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. dispatch_async(dispatch_get_main_queue(), ^{ UILocalNotification * localNotification = [[UILocalNotification alloc] init]; if (localNotification) { localNotification.fireDate= [[[NSDate alloc] init] dateByAddingTimeInterval:3]; localNotification.timeZone=[NSTimeZone defaultTimeZone]; localNotification.alertBody = @"客户端有新的版本,点击到 App Store 升级。"; localNotification.alertAction = @"升级 "; localNotification.soundName = @""; localNotification.applicationIconBadgeNumber=1; //应用的红色数字 [application scheduleLocalNotification:localNotification]; } }); } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } // 本地通知回调函数,当应用程序在前台时调用 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { NSLog(@"noti:%@",notification); // 获取通知所带的数据 NSString *notMess = notification.alertBody;//[notification.userInfo objectForKey:@"key"]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"本地通知(前台)" message:notMess delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; //将红色的小数字清空掉 application.applicationIconBadgeNumber = 0; }
// 取消某个本地推送通知 - (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; } } } }
在iOS8之后,以前的本地推送写法可能会出错,接收不到推送的信息,
如果出现以下信息:
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
说明在IOS8下没有注册,所以需要额外添加对IOS8的注册方法,API中有下面这个方法:
[objc] view plaincopyprint?
这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。
第一步:注册本地通知:
[objc] view plaincopyprint?
第二步:处理通知,这个是在appdelegate中的代理 方法回调
[objc] view plaincopyprint?
第三步:在需要的时候取消某个推送
[objc] view plaincopyprint?
下载demo:https://github.com/632840804/LocalPush