本地推送和远程推送的功能是一样的,都是要提醒用户去做某些事情。但是和远程推送不同的就是本地推送是不需要设备联网的,而远程推送是必需要设备联网的,因为只有联网状态下,才能和苹果的APNs服务器建立长连接,从而推送消息。本地推送是由App自己设定的,并且发送给安装此App的这台设备,属于一对一的对应关系。
首先创建一个单例,继承与NSObject
在.h中
//建立推送
-(void) addNotifiction:(NSString*) firedate keyA:(NSString*)key messageA:(NSString*)message;
//移除对应的推送
-(void)removeLocalNotificationByKey:(NSString*)key;
//移除所有推送
-(void)removeLocalAllNotification;
注册推送
-(void) registerLocalNotification:(UIApplication*)application;
+(NotificationHelper*) shareInstance;
在.m中
static NotificationHelper* instance;
+(NotificationHelper*) shareInstance
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
instance = [[super allocWithZone:NULL] init] ;
});
return instance ;
}
-(void) registerLocalNotification:(UIApplication*)application
{
application.applicationIconBadgeNumber = 0;//清除应用图标上的数字
//关键:加上版本的控制
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
}
#endif
}
-(void) addNotifiction:(NSString*) firedate keyA:(NSString*)key messageA:(NSString*)message
{
// NSLog(@"addNotifiction");
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm:ss"];
NSDate *now = [formatter dateFromString:firedate];//触发通知的时间
//如果firedate传入的是XX:XX:XX格式在表示在固定的时间点发送通知,如果传入的是XX格式表示从现在开始XX秒后发送通知
if(now == nil)
{
NSTimeInterval secs = [firedate doubleValue];
now = [NSDate dateWithTimeIntervalSinceNow:secs];
}
localNotification.fireDate = now;
//设置 时区
localNotification.timeZone = [NSTimeZone defaultTimeZone];
// 触发后,弹出警告框中显示的内容
localNotification.alertBody = message;
localNotification.alertAction = NSLocalizedString(@"View Details", nil);
// 触发时的声音(这里选择的系统默认声音)
localNotification.soundName = UILocalNotificationDefaultSoundName;
// 触发频率(repeatInterval是一个枚举值,可以选择每分、每小时、每天、每年等)
localNotification.repeatInterval = kCFCalendarUnitMinute;//测试用暂时写死为每隔一天 0:不重复
// 需要在App icon上显示的未读通知数(设置为1时,多个通知未读,系统会自动加1,如果不需要显示未读数,这里可以设置0)
localNotification.applicationIconBadgeNumber = 0;
// 设置通知的id,可用于通知移除,也可以传递其他值,当通知触发时可以获取
localNotification.userInfo = @{@"id":key};
// 注册本地通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
- (void)removeLocalNotificationByKey:(NSString*)key {
// 取出全部本地通知
NSArray *notifications = [UIApplication sharedApplication].scheduledLocalNotifications;
// 设置要移除的通知id
NSString *notificationId = key;
// 遍历进行移除
for (UILocalNotification *localNotification in notifications) {
// 将每个通知的id取出来进行对比
if ([[localNotification.userInfo objectForKey:@"id"] isEqualToString:notificationId]) {
// 移除某一个通知
[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
}
}
}
- (void)removeLocalAllNotification {
[[UIApplication sharedApplication] cancelAllLocalNotifications];
}
在AppDelegate中 的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中 去注册 推送,代码如下
[[NotificationHelper shareInstance] registerLocalNotification:application];
在你需要推送的地方写下以下代码
[[NotificationHelper shareInstance] addNotifiction:timeString keyA:@"key" messageA:@"可以领取体力了!" ];