-
1.简介
- 推送分为本地推送和远程推送2种。可以在应用没有打开甚至手机锁屏情况下给用户以提示。它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用;如果用户不同意则下次打开程序也不会弹出该提示框,需要用户到设置里面设置。一共有三种提示类型:
UIUserNotificationTypeBadge:应用图标右上角的信息提示
UIUserNotificationTypeSound:播放提示音
UIUserNotificationTypeAlert:提示框
- 推送分为本地推送和远程推送2种。可以在应用没有打开甚至手机锁屏情况下给用户以提示。它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用;如果用户不同意则下次打开程序也不会弹出该提示框,需要用户到设置里面设置。一共有三种提示类型:
-
2.本地推送
-
2.1本地推送的注册以及拿到userInfo (程序被杀死时,即没有启动程序时点击通知)
// 一般在在启动时注册通知
// 程序被杀死,点击通知后调用此程序
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) { //iOS10特有
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
//进行用户权限的申请
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
// 遵守代理协议
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
//在block中会传入布尔值granted,表示用户是否同意
if (granted) {
//点击允许
NSLog(@"注册通知成功");
// 获取用户对通知的设置信息 对应ios8的didRegisterUserNotificationSettings:代理方法, ios10不会调用这个代理方法
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"settings:== %@", settings);
}];
} else {
//点击不允许
NSLog(@"注册通知失败");
}
}];
// 2.自动获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken
// 如果是注册远程推送,还是和以前一样,需要加上下面这行代码
[[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
}else if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { // iOS 8.0 - iOS 10(iOS8-9使用)
// 1.请求授权
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
// 2.自动获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken
// 如果是注册远程推送,还是和以前一样,需要加上下面这行代码
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else { // iOS 8.0之前不用请求授权
// 2.自动获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
// ios8之前不用设置setting 即registerForRemoteNotificationTypes == registerForRemoteNotifications;
}
// 点击通知后调用改方法, 通过
launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]获取本地通知内容
// launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] == 代理方法中的userInfo参数
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
// 这里添加处理代码, 根据不同的通知内容进行不同的页面处理
}
return YES;
}
-
2.1本地推送拿到userInfo (处于前台或后台时,点击通知)
// 程序没有被杀死(处于前台或后台),点击通知后会调用此程序
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// 这里添加处理代码, 根据不同的通知内容进行不同的页面处理
}
-
总结:
// 点击本地通知时: 如果程序处于前台或者后台时调用, notification.userInfo是通知的消息。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
// 点击本地通知时: 如果程序被杀死时调用, (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]是通知的消息userInfo。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
-
2.3发送本地通知
范例1:
- (IBAction)addLocalNotification {
// 1.创建一个本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 1.1.设置通知发出的时间
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
// 1.2.设置通知内容
localNote.alertBody = @"这是一个推送这是一个推送";
// 1.3.设置锁屏时,字体下方显示的一个文字
localNote.alertAction = @"赶紧!!!!!";
localNote.hasAction = YES;
// 1.4.设置启动图片(通过通知打开的)
localNote.alertLaunchImage = @"../Documents/IMG_0024.jpg";
// 1.5.设置通过到来的声音
localNote.soundName = UILocalNotificationDefaultSoundName;
// 1.6.设置应用图标左上角显示的数字
localNote.applicationIconBadgeNumber = 999;
// 1.7.设置一些额外的信息
localNote.userInfo = @{@"qq" : @"704711253", @"msg" : @"success"};
// 2.执行通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}
范例2:
// 设置本地通知
+ (void)registerLocalNotification:(NSInteger)alertTime alertBody:(NSString *)alertBody userDict:(NSDictionary *)userDict
{
UILocalNotification *notification = [[UILocalNotification alloc] init];
// 设置触发通知的时间
NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];
notification.fireDate = fireDate;
// 时区
notification.timeZone = [NSTimeZone defaultTimeZone];
// 设置重复的间隔
notification.repeatInterval = kCFCalendarUnitSecond;
// 通知内容
notification.alertBody = alertBody;
notification.applicationIconBadgeNumber = 1;
// 通知被触发时播放的声音
notification.soundName = UILocalNotificationDefaultSoundName;
// 通知参数
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];
-
2.3取消本地通知
取消所有的本地通知
// 取消所有本地通知
[application cancelAllLocalNotifications];
取消某个本地通知
// 取消某个本地推送通知
+ (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;
}
}
}
}
-
参考博客:
http://www.cnblogs.com/r360/p/5741136.html http://blog.csdn.net/u014220518/article/details/51489139