iOS本地推送

通过iOS本地推送实现定时推送

  • 先在appdelegate的didFinishLaunch方法中请求推送许可
    if (@available(iOS 10.0, *)) {
    UNUserNotificationCenter
    *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert+UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) { }]; center.delegate = self; } else { // Fallback on earlier versions [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:[NSSet set]] ]; }

     

  •   收到本地通知的处理
//iOS10之前收到本地通知
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{ NSLog(@"receive local notifi%@",notification.userInfo); }
//iOS10以后,这个代理代表app在前台的时候
 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler NS_AVAILABLE_IOS(10){ 

  NSLog(@"willPresentNotification local notifi%@",notification.request.content.userInfo);
  //代表交给didReceiveNotificationResponse处理
  completionHandler(UNNotificationPresentationOptionSound); 
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler NS_AVAILABLE_IOS(10){ NSLog(@"userNotificationCenter local notifi%@",response.notification.request.content.userInfo); if ([response.actionIdentifier isEqualToString:@"sure"]) { NSLog(@"notif sure"); }else if ([response.actionIdentifier isEqualToString:@"cancel"]){ NSLog(@"notif cancel"); } completionHandler(); }

 设置本地推送

- (void)addAlarmIndentifier:(NSString*)requestIndetifier isRepeat:(BOOL)repeat{
    NSDateComponents*cmp = [[NSCalendar currentCalendar] components:NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitWeekday fromDate:self.datepicker.date];
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.hour = cmp.hour;
    components.minute = cmp.minute  ;
    components.weekday = cmp.weekday;
    //通知声音
    NSString *soundName =  @"soundName";
    if (@available(iOS 10.0, *)) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
        content.title = @"wake up!!";
        content.body = @"time to massage" ;
        //类别,用于自定义通知动作
        content.categoryIdentifier = @"alarm";
        content.userInfo =@{@"name":@"jack"};
     
        //通知声音
        content.sound = [UNNotificationSound soundNamed:soundName];
        //触发器repeats:代表是否重复
        UNCalendarNotificationTrigger *trig = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:(repeat?YES:NO)];
        UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIndetifier content:content trigger:trig];
        //动作1
        UNNotificationAction*action1 = [UNNotificationAction actionWithIdentifier:@"sure" title:@"sure" options:UNNotificationActionOptionForeground];
        //动作2
        UNNotificationAction*action2 = [UNNotificationAction actionWithIdentifier:@"cacel" title:@"cancel" options:UNNotificationActionOptionAuthenticationRequired];
        //identifier:alarm
        UNNotificationCategory*category =    [UNNotificationCategory categoryWithIdentifier:@"alarm" actions:@[action1,action2] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
        //设置分类
        [center setNotificationCategories: [NSSet setWithObject:category]];
        //设置通知
        [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
            if (error) {
                NSLog(@"error===%@",error.localizedDescription);
            }
        }];
        
        
    } else {//ios 10 以下
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm";
        UILocalNotification *notification       = [[UILocalNotification alloc] init];
        //如果需要循环可以以过去的时间为标准,然后设置repeatInterval
        notification.fireDate  = self.datepicker.date;
        
        notification.repeatCalendar             = [NSCalendar currentCalendar];
        notification.repeatInterval             = repeat?NSCalendarUnitWeekOfYear:0;
        //        //    NSMinuteCalendarUnit
        notification.timeZone                   = [NSTimeZone systemTimeZone];
        notification.alertBody                  = @"wake up!!!";
        notification.soundName                  = soundName;
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    }
    
}

取消通知(全部取消)

- (void)cancel{
 
    if (@available(iOS 10.0, *)) {
        [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];
    } else {
          [[UIApplication sharedApplication] cancelAllLocalNotifications];
    }
}
  • 效果如下图:

posted @ 2018-07-02 23:20  菜鸟工程司  阅读(383)  评论(0编辑  收藏  举报