这个是很久之前在CSDN上发布过的文章了,现在整理放到新的个人博客上。本篇文章是讲如何操作本地推送,若使用过程中出现任何问题,可以加群提出或者在评论中提出。
iOS版本兼容
在iOS8之后,以前的本地推送写法可能会出错,接收不到推送的信息, 如果出现以下信息:
Attempting to schedule a local notification
with an alert but haven’t received permission from the user to display alerts
with a sound but haven’t received permission from the user to play sounds
说明在iOS8下没有注册,所以需要额外添加对IOS8的注册方法,API中有下面这个方法:
//RegisteringUIUserNotificationSettingsmorethanonceresultsinprevioussettingsbeingoverwritten. -(void)registerUserNotificationSettings:(UIUserNotificationSettings*)notificationSettingsNS_AVAILABLE_IOS(8_0);
这个方法是8.0之后才能使用的,所以需要判断一下系统的版本。
本地通知三步法
第一步:注册本地通知
第二步:处理通知回调
第三步:取消某个推送或者全部推送
注册本地通知
//设置本地通知 +(void)registerLocalNotification:(NSInteger)alertTime{ UILocalNotification*notification=[[UILocalNotificationalloc]init]; //设置触发通知的时间 NSDate*fireDate=[NSDatedateWithTimeIntervalSinceNow:alertTime]; NSLog(@"fireDate=%@",fireDate); notification.fireDate=fireDate; //时区 notification.timeZone=[NSTimeZonedefaultTimeZone]; //设置重复的间隔 notification.repeatInterval=kCFCalendarUnitSecond; //通知内容 notification.alertBody=@"该起床了..."; notification.applicationIconBadgeNumber=1; //通知被触发时播放的声音 notification.soundName=UILocalNotificationDefaultSoundName; //通知参数 NSDictionary*userDict=[NSDictionarydictionaryWithObject:@"开始学习iOS开发了"forKey:@"key"]; notification.userInfo=userDict; //ios8后,需要添加这个注册,才能得到授权 if([[UIApplicationsharedApplication]respondsToSelector:@selector(registerUserNotificationSettings:)]){ UIUserNotificationTypetype=UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound; UIUserNotificationSettings*settings=[UIUserNotificationSettingssettingsForTypes:type categories:nil]; [[UIApplicationsharedApplication]registerUserNotificationSettings:settings]; //通知重复提示的单位,可以是天、周、月 notification.repeatInterval=NSCalendarUnitDay; }else{ //通知重复提示的单位,可以是天、周、月 notification.repeatInterval=NSDayCalendarUnit; } //执行通知注册 [[UIApplicationsharedApplication]scheduleLocalNotification:notification]; }
处理通知回调
处理通知回调,这个是在appdelegate中的代理方法回调:
//本地通知回调函数,当应用程序在前台时调用 -(void)application:(UIApplication*)applicationdidReceiveLocalNotification:(UILocalNotification*)notification{ NSLog(@"noti:%@",notification); //这里真实需要处理交互的地方 //获取通知所带的数据 NSString*notMess=[notification.userInfoobjectForKey:@"key"]; UIAlertView*alert=[[UIAlertViewalloc]initWithTitle:@"本地通知(前台)" message:notMess delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertshow]; //更新显示的徽章个数 NSIntegerbadge=[UIApplicationsharedApplication].applicationIconBadgeNumber; badge--; badge=badge>=0?badge:0; [UIApplicationsharedApplication].applicationIconBadgeNumber=badge; //在不需要再推送时,可以取消推送 [HomeViewControllercancelLocalNotificationWithKey:@"key"]; }
取消某个推送
//取消某个本地推送通知 +(void)cancelLocalNotificationWithKey:(NSString*)key{ //获取所有本地通知数组 NSArray*localNotifications=[UIApplicationsharedApplication].scheduledLocalNotifications; for(UILocalNotification*notificationinlocalNotifications){ NSDictionary*userInfo=notification.userInfo; if(userInfo){ //根据设置通知参数时指定的key来获取通知参数 NSString*info=userInfo[key]; //如果找到需要取消的通知,则取消 if(info!=nil){ [[UIApplicationsharedApplication]cancelLocalNotification:notification]; break; } } } }
源代码
大家可以到我的GITHUB下载Demo,地址为:https://github.com/CoderJackyHuang/LocalPush
推荐阅读
segmentfault上有一篇细说iOS消息推送讲得挺详细的,这是讲解APNS的文章,还有360doc里的一篇iOS推送小结文章讲得也不错!