iOS本地推送(本地通知)

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

如果出现以下信息:

1 Attempting to schedule a local notification2 with an alert but haven’t received permission from the user to display alerts3 with a sound but haven’t received permission from the user to play sounds说明在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:typecategories: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:notMessdelegate:nilcancelButtonTitle:@"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;}} }}

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

享受每一刻的感觉,欣赏每一处的风景,这就是人生。

iOS本地推送(本地通知)

相关文章:

你感兴趣的文章:

标签云: