第一步:注册本地通知:
// 设置本地通知
+ (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; //默认声音
notification.soundName = @"LocalNotificationMusic.m4r";//播放音乐
// 通知参数
NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"开始学习iOS开发了" forKey:@"key"];
notification.userInfo = userDict;
// ios8后,需要添加这个注册,才能得到授权
NSString *system = [[ICDeviceInfoHelper shareInstant]getDeviceSystemVersion];
NSInteger systemInt = [system floatValue];
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)] && systemInt >= 8) {
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中的代理 方法回调
这里氛围两种情况
1. 当app没有关闭, 进入后台运行时, 通过本地通知途径进入app, 将触发application: didReceiveLocalNotification
方法.
2. 当app关闭时, 通过本地通知途径进入app, 不会触发application: didReceiveLocalNotification
方法. 需要通过application: didFinishLaunchingWithOptions:
方法, 判断是否由本地通知打开app.(具体方法见代码)
当app没有关闭(后台运行), 调用本地通知启动
// 本地通知回调函数,当应用程序在前台时调用
- (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"];
}
当app关闭, 调用本地通知启动
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//app启动时,其他代码
[self otherCode];
/*本地通知方式-启动*/
//获取本地通知,如果不是本地通知方式启动, notification将为nil
UILocalNotification *notification = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey];
if (notification && [notification isKindOfClass:[UILocalNotification class]]) {
//获取本地通知详细信息
NSDictionary *userInfo = notification.userInfo;
//通过信息判断为哪条本地通知, 做出相应回应
NSString *name = [userInfo objectForKey:@"name"];
if ([name isEqualToString:@"remindNotification"]) {
//做出反应
[self actionCode];
}
}
return YES;
}
取消某个本地通知
// 取消某个本地推送通知
+ (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