iOS10 本地通知

2024-04-21 13:32
文章标签 本地 通知 ios10

本文主要是介绍iOS10 本地通知,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用户通知根据通知信息的来源,可以分为本地通知和远程通知。本地通知是由iOS操作系统根据条件在本机上触发的,例如闹钟就是基于时间触发提醒通知的。远程通知是第三方远程推送给用户的iOS设备的。这种通知常用于商家推销自家的产品。

下面主要讲述开发本地通知的过程:

  1. 请求授权
  2. 通知创建和发送
  3. 通知接收后的处理

请求授权

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound) completionHandler:^(BOOL granted,NSError* _Nullable error){if(!error){NSLog(@"授权成功");}else{NSLog(@"授权失败");}}];return YES;
}

通知的创建和发送

  1. 创建通知内容
  2. 创建触发器
  3. 创建通知请求对象
  4. 添加通知请求到通知中心
创建通知内容

用户通知内容由 UNNotificationContent 和 UNMutableNotificationContent 两个类描述,其中前者是不可变的,后面是可变的用户通知内容类,主要的属性如下:
- title : 通知主标题
- subtitle : 通知副标题
- body : 通知内容
- badge : 应用图标标记数字,NSNumber 类型
- sound : 通知到达的音效,UNNotificationSound 类型
- attachments : 通知内容附件集合,可以保存多个 UNNotificationAttachment 对象

视图控制器 ViewController.mscheduleNotification: 方法的代码如下:

UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];content.body = @"通知内容:大家好,新年快乐!";content.sound = [UNNotificationSound defaultSound];content.subtitle = @"通知副标题";content.title = @"通知标题";
创建触发器

本地通知触发器有三种类型:时间中断触发器、日历触发器和位置触发器。

这里主要讲一下时间中断触发器:

通过UNTimeIntervalNotificationTrigger 类的静态工厂方法 + triggerWithTimeInterval:repeats: 创建并初始化 UNTimeIntervalNotificationTrigger 对象,在 ViewController.mcreateTimeTrigger 方法的代码如下:

- (UNTimeIntervalNotificationTrigger*)createTimeTrigger
{UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10 repeats:NO];return trigger;
}
创建通知请求对象

我们需要将前面创建的内容和触发器封装到通知请求对象 UNNotificationRequest 中,其中通知请求对象用于管理本地通知内容和触发计划。在 ViewController.mscheduleNotification: 方法的代码如下:

UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"TimeTrigger" content:content trigger:[self createTimeTrigger]];//创建触发器
添加通知请求到通知中心

事实上,现在我们还没有开启通知计划,这需要将通知添加到通知中心。在 ViewController.mscheduleNotification: 方法的代码如下:

[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError* _Nullable error){if(!error){NSLog(@"添加到通知中心");}}];

上述代码将通知对象添加到通知中心,这样就开启了通知计划,等到触发器条件满足时发送通知。

通知接收后的处理

用户接收到通知后,有可能对通知进行一些操作,其中会涉及到的类有:UNNotificationActionUNNotificationCategory,以及委托协议 UNUserNotificationCenterDelegate ,下面简单说明一下:
- UNNotificationAction : 是动作,封装了用户进行的操作。它还有一个子类 UNTextInputNotificationAction ,该子类能够接收用户输入文本操作
- UNNotificationCategory : 是类别,它定义了一组操作
- UNUserNotificationCenterDelegate : 是响应动作的委托对象方法,当用户接收到通知并且执行了操作后,会回调该委托对象方法。

content.categoryIdentifier = @"myCategory";UNNotificationAction* action = [UNNotificationAction actionWithIdentifier:@"myAction" title:@"点赞" options:UNNotificationActionOptionNone];UNNotificationCategory* category = [UNNotificationCategory categoryWithIdentifier:@"myCategory" actions:@[action] intentIdentifiers:@[@""] options:UNNotificationCategoryOptionNone];NSSet* categories = [NSSet setWithObject:category];
[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:categories];
[UNUserNotificationCenter currentNotificationCenter].delegate = self;

实现 UNUserNotificationCenterDelegate 协议方法:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{if([response.actionIdentifier isEqualToString:@"myAction"]){NSLog(@"点赞了");}completionHandler();
}

注意

  • 通知能够显示在通知栏中显示的前提是,接收通知的应用处于非活动状态,也就是应用退到后台。所以在测试上面的案例时,当点击开启按钮后,需要点击设备的Home键退出应用

大大的坑点

由于我之前设置的触发器的时间间隔是3秒,退出app后始终没有发送本地通知。将时间间隔设置为10秒后,就有效果了,这一点原因还不知道。

项目地址


转载自 关东升的《iOS开发指南》

这篇关于iOS10 本地通知的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923200

相关文章

本地如何快速启动静态服务器

本地快速启动静态服务器 有许多第三方库可以帮助你快速启动一个静态服务器,甚至无需编写代码。通过命令行运行这些库后,它们会自动启动一个服务器并打开指定端口,展示当前目录下的文件内容: 电脑得提前安装NodeJS 1、http-server http-server 是一个轻量级的命令行工具,允许你快速启动一个静态文件服务器。 安装 npm install -g http-server

【20240907问题记录(未解决)】Conda环境问题:SSH与本地环境变量不一致

Conda 允许用户在同一系统上创建多个独立的Python环境。然而,最近遇到了一个奇怪的问题:通过SSH连接到远程Ubuntu机器时,Conda环境变量的行为与本地机器不一致。以下是具体遇到的问题: 1. 问题描述 在本地Ubuntu机器上,我的conda的python版本是3.6,而pip版本可以通过命令 pip --version 查看,显示为: pip 21.3.1 from /ho

我成功在本地打开了Cesium啦!

1首先下载Node.js,我是跟着这篇下载的,https://zhuanlan.zhihu.com/p/77594251,不过这后面的我没弄对Cesium环境配置也没影响。 另外:我看其他推文说,在终端写node -v和npm-v查node和npm的版本可以检测node和npm是否下载成功。 2然后我在CesiumB站官号看的教学视频,跟着下载Cesium源代码。 Cesium基础入门1-零

html 本地存储(localStorage and sessionStorage)

刚刚学习anjularJS和html的项目开发,其中在ui库中使用一种步骤类型的样式,其实就是form表单的ng-if判断显示,样式好用但也伴随着很多的问题,其中一个bug就是刷新会回到第一步,回到第一步的原因是刷新时会从新加载js代码,因为状态没变,所以就会出现无论刷新的哪一步,都会回到第一步,解决该问题的方法就是本地存储。 百度发现有两种存储方式,一个是sessionStorage,还有个

k8s 存储(PV、PVC、SC、本地存储、NFS)

存储持久化相关三个概念: PersistentVolume (PV) 是对具体存储资源的描述,比如NFS、Ceph、GlusterFS等,通过PV可以访问到具体的存储资源;PersistentVolumeClaim (PVC) Pod想要使用具体的存储资源需要对接到PVC,PVC里会定义好Pod希望使用存储的属性,通过PVC再去申请合适的存储资源(PV),匹配到合适的资源后PVC和PV会进行绑定

git如何灵活切换本地账号对应远程github的两个账号

git如何灵活切换本地账号对应远程github的两个账号 问题: 有时候我们会同时维护两个github的账号里面的仓库内容,这时候本地git需要频繁的切换ssh,以方便灵活的与两个账号的仓库可以通信。这篇日记将阐述我是怎么解决这个问题的。1. 第一个账户 生成本地SSH2. 注意 我们要设置第二个账户的 本地 SSH 时3. 两个账号来回切换 问题: 有时候我们会同时维护两个git

vscode从本地安装插件

1. 打开VSCode。 2. 点击左侧菜单中的“扩展”(或按Ctrl+Shift+X)。 3. 点击“更多操作”(三个点)> “从VSIX安装”。 4. 选择下载的.vsix文件。 5. 点击“安装”即可安装插件。

AOP之执行前通知@Before

Spring AOP之执行前通知@Before 此文章说一下执行前通知,即注解@Before。 作用 多用于日志记录、权限校验、初始化资源等。 触发时间 目标函数执行触发。 定义 public class AopBeforeAspect {@Before("execution(public * com.example.demo.service.impl.AccountServiceI

Java传输本地目录到远程服务器

在使用Java进行开发时,有时需要将本地目录中的文件复制或传输到远程服务器上。这种场景在部署应用程序或进行数据迁移时尤为常见。JSch库提供了一种简便的方法来实现这一功能。以下是从Codekru网站获取的信息摘要,并结合相关内容,展示如何使用JSch库实现从本地计算机复制整个目录到远程服务器的过程。 准备工作 首先,确保您的项目中已经包含了JSch库的依赖。如果您使用Maven作为构建工具,可