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中有下面这个方法:

[objc]view plaincopy

print?

// Registering UIUserNotificationSettings more than once results in previous settings being overwritten.

- (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS(8_0);

这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。

第一步:注册本地通知:

[objc]view plaincopy

print?

// 设置本地通知

+ (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]  LocalNotification:notification];

}

第二步:处理通知,这个是在appdelegate中的代理 方法回调

[objc]view plaincopy

print?

// 本地通知回调函数,当应用程序在前台时调用

- (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"];

}

第三步:在需要的时候取消某个推送

[objc]view plaincopy

print?

// 取消某个本地推送通知

+ (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本地推送(本地通知))