美文网首页
iOS 本地通知

iOS 本地通知

作者: _桃夭大人_ | 来源:发表于2019-01-29 11:04 被阅读0次

    1.应用场景

    可以在指定的时间点推送;
    可以自定义的通知样式;
    不需要依赖APNS(苹果推送服务器);
    不需要创建证书;

    2.注册推送

    iOS10 以上需要导入头文件 <UserNotifications/UserNotifications.h>

        if (@available(iOS 10.0,*)) {
            // iOS10 及以上
            UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
            [center requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound completionHandler:^(BOOL granted, NSError * _Nullable error) {
                if (granted) {
                    // 注册成功
                }else{
                    // 注册失败
                }
            }];
        }else{
            // iOS8 及以上
            UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
            
            [[UIApplication sharedApplication] registerUserNotificationSettings:setting];   
        }
    

    3.发送通知

    - (void)sendNotificationMessage{
        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:@"Define_Sound"];
            // 角标
            content.badge = @1;
            
            // 设置多长时间之后发送
            NSTimeInterval time = [[NSDate dateWithTimeIntervalSinceNow:1] timeIntervalSinceNow];
            UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:time repeats:NO];
            
            // id:便于以后移除、更新 指定通知
            NSString * noticeId = @"noticeId";
            // 通知请求
            UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:noticeId content:content trigger:trigger];
            // 添加通知请求
            [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
                if (error == nil) {
                    NSLog(@"本地推送成功");
                }
            }];
            
        }else{
            UILocalNotification * locationNotice = [[UILocalNotification alloc]init];
            // 发送时间
            locationNotice.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
            // 通知内容
            locationNotice.alertBody = @"通知内容";
            locationNotice.userInfo = @{@"json":@"自定义内容",@"NoticeID":@"123"};
            // 角标
            locationNotice.applicationIconBadgeNumber = 1;
            // 默认铃声
            locationNotice.soundName = UILocalNotificationDefaultSoundName;
            // 循环提醒
            locationNotice.repeatInterval = NSCalendarUnitDay;
            // 发送
            [[UIApplication sharedApplication] scheduleLocalNotification:locationNotice];
        }
    }
    

    4.移除通知

    #pragma mark -- 移除某个通知
    -(void)removeNoticeWithNoticeId:(NSString *)noticeID{
        if (@available(iOS 10.0,*)) {
            
            UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
            // 判断noticeID是否存在
            [center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
            
                for (UNNotificationRequest * request in requests) {
                    if([noticeID isEqualToString:request.identifier]){
                        [center removePendingNotificationRequestsWithIdentifiers:@[noticeID]];
                    }
                }
                
            }];
            
        }else{
            // 获取scheduled中的通知
            NSArray * scheduledArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
            
            for (UILocalNotification * localNotice in scheduledArray) {
                NSDictionary * userInfo = localNotice.userInfo;
                NSString * userNoticeID = [userInfo objectForKey:@"NoticeID"];
                if ([userNoticeID isEqualToString:noticeID]) {
                    [[UIApplication sharedApplication] cancelLocalNotification:localNotice];
                }
            }
        }
    }
    #pragma mark -- 移除所有通知
    - (void)removeAllNotification{
        if (@available(iOS 10.0,*)) {
            UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
            [center removeAllPendingNotificationRequests];
        }else{
            [[UIApplication sharedApplication] cancelAllLocalNotifications];
        }
    }
    

    5.权限问题

    本地推送通知 也需要得到用户的 允许,否则也是看不到 通知的。

    #pragma mark -- 检测通知 开关状态
    - (void)checkNotificationSwitchState{
        if (@available(iOS 10.0,*)) {
            UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
            [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                if (settings.notificationCenterSetting == UNNotificationSettingEnabled) {
                    NSLog(@"通知权限开启");
                }else{
                    NSLog(@"通知权限关闭");
                }
            }];
        }else{
            UIUserNotificationSettings * settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
            
            if (settings.types == UIUserNotificationTypeNone) {
                NSLog(@"通知权限关闭");
            }else{
                NSLog(@"通知权限开启");
            }
            
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS 本地通知

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