iOS本地推送(本地通知)

来源:互联网 发布:linux系统简介 编辑:程序博客网 时间:2024/05/16 13:40

本地推送ios8推送LocalNotification本地通知ios通知
在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中有下面这个方法:

// 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;        }      }    }  } 
0 0