ios 本地推送

              本地推送和远程推送的功能是一样的,都是要提醒用户去做某些事情。但是和远程推送不同的就是本地推送是不需要设备联网的,而远程推送是必需要设备联网的,因为只有联网状态下,才能和苹果的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:@"可以领取体力了!" ];


然后你的本地推送就写完了 ,是不是很简单啊

你可能感兴趣的:(ios)