美文网首页
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 本地推送通知

    本地推送通知 对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。 a...

  • iOS14开发- 通知

    iOS 中的通知主要分为 2 种,本地通知和远程通知。 本地通知 使用步骤 导入UserNotifications...

  • ios10新特性-UserNotification

    ios10新特性-UserNotification 引言:iOS的通知分本地通知和远程通知,iOS10之前采用的是...

  • iOS UserNotifications通知管理---本地通知

    iOS UserNotifications通知管理---本地通知篇 iOS 10对以前混乱的和通知相关的API进行...

  • IOS的通知

    通知详解 简书-iOS10 推送通知 UserNotifications iOS10本地通知UserNotifi...

  • iOS推送通知概览

    iOS推送通知概览 一、响应推送(本地通知 和 远程通知 都合适) iOS 10 以前 1. UIUserNoti...

  • 关于iOS通知那些事

    一、概述 通知分为本地通知和远程推送通知,iOS10中对于通知这一块改变较大,本文主要针对iOS10的通知,iOS...

  • iOS 推送通知及通知扩展

    级别: ★★☆☆☆标签:「iOS 本地推送」「iOS 远程推送」「iOS通知扩展」作者: dac_1033审校: ...

  • iOS消息通知产品设计

    ios消息类型有本地通知、推送消息以及系统消息。 消息类型: 本地通知:是由ios设备生成并发布的,无论应用程序是...

  • 通知及Block传值代码示例

    通知 在IOS中,主要有广播通知(broadcast notification)、本地通知(local notif...

网友评论

      本文标题:iOS 本地通知

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