美文网首页iOS开发知识小集
iOS 本地消息通知推送

iOS 本地消息通知推送

作者: 蒋伟_iOS | 来源:发表于2019-04-04 17:55 被阅读5次

    一. 打开项目推送开关

    打卡项目推送开关.png

    二. 注册通知

    1. 先导入头文件#import <UserNotifications/UserNotifications.h>

    如果你的工程年代久远,导入会报错,就需要导入框架,见图。

    导入通知框架.png

    2. 注册通知

    • 区分iOS 10.0 以前和以后进行注册
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        if (@available(iOS 10.0, *)) {
    
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            center.delegate = self;
            [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound)
                                  completionHandler:^(BOOL granted, NSError * _Nullable error) {
                                  }];
            [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
            }];
    
        } else {
            
            if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
                [[UIApplication sharedApplication] registerUserNotificationSettings:
                 [UIUserNotificationSettings settingsForTypes:
                  UIUserNotificationTypeAlert|
                  UIUserNotificationTypeBadge|
                  UIUserNotificationTypeSound categories:nil]];
            }
            
        }
        
        return YES;
    }
    

    三. 处理接受到通知后的回调

    1. 遵守协议

    @interface AppDelegate () <UNUserNotificationCenterDelegate>
    

    2. 本地通知回调

    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_AVAILABLE_IOS(4_0) {
        
        UIAlertView *alert = [[UIAlertView alloc]
                              initWithTitle:notification.alertTitle
                              message:notification.alertBody
                              delegate:self
                              cancelButtonTitle:@"确定"
                              otherButtonTitles:nil,
                              nil];
        [alert show];
    
    }
    

    alert提示通知内容

    3. 前台通知回调

    - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
    willPresentNotification:(UNNotification *)notification 
    withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler 
    __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0){
        
        NSLog(@"应用在前台运行是接受到通知,会直接调用该方法");
        
    }
    

    应用正在运行时接到通知,你可以在这里自定义处理

    ⚠️注意:前台收到推送时不会有消息弹窗效果的
    • 想有后台收到通知一样的弹窗效果,加入下面的代码。
    completionHandler(UNNotificationPresentationOptionBadge | 
    UNNotificationPresentationOptionSound | 
    UNNotificationPresentationOptionAlert);
    

    4. 后台通知回调

    - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
    didReceiveNotificationResponse:(UNNotificationResponse *)response 
    withCompletionHandler:(void(^)(void))completionHandler 
    __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) __TVOS_PROHIBITED{
        
        NSLog(@"后台或者未启动时接受到通知,点击通知会调用该方法");
        
    }
    

    用户在app在后台或者未启动的时候,点击了通知,你可以在这里做自定义处理

    四. 发送通知

    - (void)startLocalPush {
        
        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyy-MM-dd HH:mm";
        NSDate *fireDate = [formatter dateFromString:@"2019-04-04 17:42"];
        [localNotification setTimeZone:[NSTimeZone defaultTimeZone]];
        localNotification.fireDate = fireDate;
        localNotification.repeatInterval = kCFCalendarUnitDay;
        localNotification.alertBody = @"移动考勤提醒您:下班啦,记得考勤打卡哦!
    
          事务千万条,打卡第一条,
          打卡不及时,发薪两行泪!";
    
        localNotification.alertTitle = @"考勤提醒";
        localNotification.soundName = UILocalNotificationDefaultSoundName;
        
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    }
    
    

    fireDate:是指开始触发的时间点。
    repeatInterval:是循环的时间,这是个枚举,不是填数字的!!!

    typedef NS_OPTIONS(NSUInteger, NSCalendarUnit) {
            NSCalendarUnitEra                = kCFCalendarUnitEra,
            NSCalendarUnitYear               = kCFCalendarUnitYear,
            NSCalendarUnitMonth              = kCFCalendarUnitMonth,
            NSCalendarUnitDay                = kCFCalendarUnitDay,
            NSCalendarUnitHour               = kCFCalendarUnitHour,
            NSCalendarUnitMinute             = kCFCalendarUnitMinute,
            NSCalendarUnitSecond             = kCFCalendarUnitSecond,
            NSCalendarUnitWeekday            = kCFCalendarUnitWeekday,
            NSCalendarUnitWeekdayOrdinal     = kCFCalendarUnitWeekdayOrdinal,
            NSCalendarUnitQuarter            API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitQuarter,
            NSCalendarUnitWeekOfMonth        API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitWeekOfMonth,
            NSCalendarUnitWeekOfYear         API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitWeekOfYear,
            NSCalendarUnitYearForWeekOfYear  API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitYearForWeekOfYear,
            NSCalendarUnitNanosecond         API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = (1 << 15),
            NSCalendarUnitCalendar           API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0)) = (1 << 20),
            NSCalendarUnitTimeZone           API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0)) = (1 << 21),
    
        NSEraCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitEra instead") = NSCalendarUnitEra,
        NSYearCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitYear instead") = NSCalendarUnitYear,
        NSMonthCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitMonth instead") = NSCalendarUnitMonth,
        NSDayCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitDay instead") = NSCalendarUnitDay,
        NSHourCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitHour instead") = NSCalendarUnitHour,
        NSMinuteCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitMinute instead") = NSCalendarUnitMinute,
        NSSecondCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitSecond instead") = NSCalendarUnitSecond,
        NSWeekCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitWeekOfMonth or NSCalendarUnitWeekOfYear, depending on which you mean") = kCFCalendarUnitWeek,
        NSWeekdayCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitWeekday instead") = NSCalendarUnitWeekday,
        NSWeekdayOrdinalCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_4, 10_10, 2_0, 8_0, "Use NSCalendarUnitWeekdayOrdinal instead") = NSCalendarUnitWeekdayOrdinal,
        NSQuarterCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_6, 10_10, 4_0, 8_0, "Use NSCalendarUnitQuarter instead") = NSCalendarUnitQuarter,
        NSWeekOfMonthCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_7, 10_10, 5_0, 8_0, "Use NSCalendarUnitWeekOfMonth instead") = NSCalendarUnitWeekOfMonth,
        NSWeekOfYearCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_7, 10_10, 5_0, 8_0, "Use NSCalendarUnitWeekOfYear instead") = NSCalendarUnitWeekOfYear,
        NSYearForWeekOfYearCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_7, 10_10, 5_0, 8_0, "Use NSCalendarUnitYearForWeekOfYear instead") = NSCalendarUnitYearForWeekOfYear,
        NSCalendarCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_7, 10_10, 4_0, 8_0, "Use NSCalendarUnitCalendar instead") = NSCalendarUnitCalendar,
        NSTimeZoneCalendarUnit NS_CALENDAR_ENUM_DEPRECATED(10_7, 10_10, 4_0, 8_0, "Use NSCalendarUnitTimeZone instead") = NSCalendarUnitTimeZone,
    };
    

    应有尽有,自己选。

    效果图:

    推送效果图.jpeg

    Demo地址:

    https://github.com/muyan091115/LocalPush.git

    相关文章

      网友评论

        本文标题:iOS 本地消息通知推送

        本文链接:https://www.haomeiwen.com/subject/rywxiqtx.html