美文网首页iOS基本功
iOS - 传值通知和推送通知(本地&远程)

iOS - 传值通知和推送通知(本地&远程)

作者: 搬砖的crystal | 来源:发表于2022-07-19 09:59 被阅读0次

    传值通知:类似通知,代理,block实现值传递。
    推送通知:推送到用户手机对应App上(主要是不在前台的情况)。
    本地通知:用于基于时间行为的通知,比如有关日历或者todo列表的小应用。另外,如果应用在后台执行,iOS允许它在受限的时间内运行,本地通知也很有用。比如:一个应用,在后台运行,向应用获取服务端消息,当消息到达时,比如下载更新版本的提示消息,通过本地通知机制通知用户。

    本地通知的例子:

    #import "AppDelegate.h"
    // iOS10.0 需要导入
    #import <UserNotifications/UserNotifications.h>
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [self registerAPN];
        return YES;
    }
    
    // 注册通知
    - (void)registerAPN {
        if (@available(iOS 10.0, *)) { // iOS10 以上
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
                
            }];
        } else {// iOS8.0 以上
            UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
            [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
        }
    }
    ......
    
    
    #import "DJViewController.h"
    
    // iOS10.0 需要导入
    #import <UserNotifications/UserNotifications.h>
    @interface DJViewController ()
    
    @end
    
    @implementation DJViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self addLocalNotice];
        
    }
    
    
    //添加通知
    - (void)addLocalNotice {
        if (@available(iOS 10.0, *)) {
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
            // 标题
            content.title = @"测试标题";
            content.subtitle = @"测试通知副标题";
            // 内容
            content.body = @"测试通知的具体内容";
            // 声音
           // 默认声音
         //    content.sound = [UNNotificationSound defaultSound];
         // 添加自定义声音
           content.sound = [UNNotificationSound soundNamed:@"Alert_ActivityGoalAttained_Salient_Haptic.caf"];
            // 角标 (我这里测试的角标无效,暂时没找到原因)
            content.badge = @1;
            // 多少秒后发送,可以将固定的日期转化为时间
            NSTimeInterval time = [[NSDate dateWithTimeIntervalSinceNow:10] timeIntervalSinceNow];
            // repeats,是否重复,如果重复的话时间必须大于60s,要不会报错
            UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:time repeats:NO];
            
            /*
            //如果想重复可以使用这个,按日期
            // 周一早上 8:00 上班
            NSDateComponents *components = [[NSDateComponents alloc] init];
            // 注意,weekday默认是从周日开始
            components.weekday = 2;
            components.hour = 8;
            UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
            */
            // 添加通知的标识符,可以用于移除,更新等操作
            NSString *identifier = @"noticeId";
            UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
            
            [center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
                NSLog(@"成功添加推送");
            }];
        }else {
            UILocalNotification *notif = [[UILocalNotification alloc] init];
            // 发出推送的日期
            notif.fireDate = [NSDate dateWithTimeIntervalSinceNow:10];
            // 推送的内容
            notif.alertBody = @"你已经10秒没出现了";
            // 可以添加特定信息
            notif.userInfo = @{@"noticeId":@"00001"};
            // 角标
            notif.applicationIconBadgeNumber = 1;
            // 提示音
            notif.soundName = UILocalNotificationDefaultSoundName;
            // 每周循环提醒
            notif.repeatInterval = NSCalendarUnitWeekOfYear;
            
            [[UIApplication sharedApplication] scheduleLocalNotification:notif];
        }
    }
    // 移除某一个指定的通知
    - (void)removeOneNotificationWithID:(NSString *)noticeId {
        if (@available(iOS 10.0, *)) {
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            [center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
                for (UNNotificationRequest *req in requests){
                    NSLog(@"存在的ID:%@\n",req.identifier);
                }
                NSLog(@"移除currentID:%@",noticeId);
            }];
    
            [center removePendingNotificationRequestsWithIdentifiers:@[noticeId]];
        }else {
            NSArray *array=[[UIApplication sharedApplication] scheduledLocalNotifications];
            for (UILocalNotification *localNotification in array){
                NSDictionary *userInfo = localNotification.userInfo;
                NSString *obj = [userInfo objectForKey:@"noticeId"];
                if ([obj isEqualToString:noticeId]) {
                    [[UIApplication sharedApplication] cancelLocalNotification:localNotification];
                }
            }
        }
    }
    
    // 移除所有通知
    - (void)removeAllNotification {
        if (@available(iOS 10.0, *)) {
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            [center removeAllPendingNotificationRequests];
        }else {
            [[UIApplication sharedApplication] cancelAllLocalNotifications];
        }
    }
    //检查授权
    - (void)checkUserNotificationEnable { // 判断用户是否允许接收通知
        if (@available(iOS 10.0, *)) {
            __block BOOL isOn = NO;
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                if (settings.notificationCenterSetting == UNNotificationSettingEnabled) {
                    isOn = YES;
                    NSLog(@"打开了通知");
                }else {
                    isOn = NO;
                    NSLog(@"关闭了通知");
                   [self showAlertView];
                }
            }];
        }else {
            if ([[UIApplication sharedApplication] currentUserNotificationSettings].types == UIUserNotificationTypeNone){
                NSLog(@"关闭了通知");
                [self showAlertView];
            }else {
                NSLog(@"打开了通知");
            }
        }
    }
    
    - (void)showAlertView {
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"通知" message:@"未获得通知权限,请前去设置" preferredStyle:UIAlertControllerStyleAlert];
        [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
        [alert addAction:[UIAlertAction actionWithTitle:@"设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
             [self goToAppSystemSetting];
        }]];
        [self presentViewController:alert animated:YES completion:nil];
    }
    
    // 如果用户关闭了接收通知功能,该方法可以跳转到APP设置页面进行修改
    - (void)goToAppSystemSetting {
        dispatch_async(dispatch_get_main_queue(), ^{
            UIApplication *application = [UIApplication sharedApplication];
            NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
            if ([application canOpenURL:url]) {
                if (@available(iOS 10.0, *)) {
                    if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
                        [application openURL:url options:@{} completionHandler:nil];
                    }
                }else {
                    [application openURL:url];
                }
            }
        });
    }
    
    @end
    

    相关文章

      网友评论

        本文标题:iOS - 传值通知和推送通知(本地&远程)

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