iOS 通知

news2025/1/9 20:26:42

iOS 通知分为本地推送和远程推送两类

一. 本地推送使用流程

1. 注册通知
//请求通知权限
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (error) { NSLog(@"request authorization error: %@", error); }
}];

//注册通知
[[UIApplication sharedApplication] registerForRemoteNotifications];
2.推送通知
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; //标题
content.sound = [UNNotificationSound defaultSound];
        
NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber + 1;
content.badge = @(badge);
content.body = message;// 本地推送一定要有内容,即body不能为空。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000
    if (@available(iOS 15.0, *)) 
    {
        content.interruptionLevel = UNNotificationInterruptionLevelTimeSensitive;//会使手机亮屏且会播放声音;可能会在免打扰模式(焦点模式)下展示
             // @"{"aps":{"interruption-level":"time-sensitive"}}";
             // @"{"aps":{"interruption-level":"active"}}";
             content.body = message;// 本地推送一定要有内容,即body不能为空。
    }
#endif

// repeats,是否重复,如果重复的话时间必须大于60s,要不会报错
//UNCalendarNotificationTrigger 如果是时间触发
//UNLocationNotificationTrigger 地点触发
 UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.01  repeats:NO];

 /* */
//添加通知的标识符,可以用于移除,更新等搡作
NSString * identifier = [[NSUUID UUID] UUIDString];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
[center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) 
{
    if(!error)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
                     
        });
    }
}];


//点击本地通知回调 
/*API_DEPRECATED("Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:]"*/

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    //
}

二.远程推送(APNS)

1. 远程推送的五步骤

1).应该程序注册APNS消息推送

2).ios 从APNS Server得到devicetoken.

3).应用程将devicetoken发送从自己的服务器。

4).服务器将消息发送给APNS服务器。

5).APNS发送给app

苹果官司方给机制解释图

2. 远程推送大小限制

远程通知负载的大小根据服务器使用的API不同而不同

当使用HTTP/2 provider API时,负载最大为4kB;当使用legacy binary interface时,负载最大为2kB。当负载大小超过规定的负载大小时,APNs会拒绝发送此通知 

3.推送通知实现
1)首先 设置 app 的bundle Id 支持 通知推送

2)申请推送通知证书,这个证书主要是服务器需要使用的

推送证书的申请过程和其它证书类似

3)app 注册通知 这部分和本地通知是一样的。
//请求通知权限
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (error) { NSLog(@"request authorization error: %@", error); }
}];

//注册通知
[[UIApplication sharedApplication] registerForRemoteNotifications];
4)收到APNS 发送的token 并发送给服务器
- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //注册推送消息成功
    //收到deviceToken并发送给服务器
    NSLog(@"deviceToken = %@", deviceToken);
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error API_AVAILABLE(ios(3.0))
{
    //注册推送消息失败
}

服务器收到token后,需要发送消息时,就可以把token,消息内容和证书一起发送给

APNS服务器,APNS就推送给app了。

5)app收到推送通知后的处理

1> app被杀死时,用户点击通知会在didFinishLaunchingWithOptions获取通知内容

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

...
    
// 注册通知类型
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
        if (error) { NSLog(@"request authorization error: %@", error); }
}];
[[UIApplication sharedApplication] registerForRemoteNotifications];


// app 被杀死时用户点击通知 获取推送内容
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo) {
   //能过点击通知启动app
   NSLog(@"userInfo = %@", userInfo);

}

...

}

2> app在后台,点击通知

//老版处理
/*- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    DDLogDebug(@"userInfo ----->%@",userInfo);
}*/

//新版处理
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler
{
    DDLogDebug(@"userInfo ----->%@",userInfo);
}


三.推送功能的测试

有个推送测试的工具 SmartPush

下载地址:

1、Github地址:https://github.com/shaojiankui/SmartPush

 2、release安装包:https://github.com/shaojiankui/SmartPush/releases

 

3、消息体格式: 

{
  "aps": {
    "alert": {
      "title": "新消息",
      "body": "您有一条新的消息!"
    },
    "badge": 1,
    "sound": "default"
  },
  "customData": {
    "type": "message",
    "id": "12345"
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习_18_Stream流

文章目录 前言一、不可变集合二、Stream流思想第一步:得到Stream流第二步:Stream流的中间方法Stream流的终结方法 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容:BV17F411T7Ao 一、不可变集合 不可变集合就是长度和内容都不可…

HTML+CSS浮动和清除浮动的效果及其应用场景举例

一、清除浮动的效果 解释 .container:用于展示浮动和清除浮动效果的容器,具有边框和背景色以便于区分。 .float-box:浮动元素,用不同的背景色标识。 .clearfix:使用伪元素清除浮动的类,应用于第二个容器。 …

【chips】个人笔记系列-SystemVerilog

Title:System Verilog 学习 背景与发展 什么是SV 啥是SystemVerilog? 就是用来专门写验证和测试的 Verilog 升级版——在verilog的基础上加了些C的思想、语法、模块。 为啥要搞出一个SystemVerilog? 设计IC (integrated circuit)时用的是 …

02_TensorFlow2 Eager Execution:让AI编程从‘慢条斯理’变‘急不可耐’的神奇魔法!

1. Eager execution 的特性 即刻执行(Eager execution)是TensorFlow2.0的新特性,如同python解释器一样,执行即可获得计算结果,不需要手动建立图结构和会话,与python的兼容性更强, 为快速搭建和测试算法模型…

C语言 之 内存函数 memcpy、memmove函数的使用和模拟实现 memset、memcmp函数的使用

文章目录 1.memcpy函数的使用和模拟实现例子:模拟实现: 2.memmove函数的使用和模拟实现例子:模拟实现: 3.memset函数的使用**例子:** 3.memcmp函数的使用例子: 首先 我们要明确下面这些函数之所以被称作内存函数&#…

130-横向移动PTH哈希PTT票据PTK密匙Kerberos

pass the hash (哈希传递攻击,简称pth)利用lm(老版本哈希)或ntlm(新版本)的值进行的渗透测试 pass the ticket (票据传递攻击,简称ptt)利用的票据凭证TGT进行…

sql手工注入——sqli-labspage第六关到第十关

第六关 一确定攻击点判断闭合方式 跟个双引号引起报错 说明页面有报错语句的位置 http://127.0.0.1/Less-6/?id1%22http://127.0.0.1/Less-6/?id1%22尝试闭合 闭合成功 http://127.0.0.1/Less-6/?id1%22%20--http://127.0.0.1/Less-6/?id1%22%20-- 二.查询数据库名 ht…

多商户小程序审核存在商户入口无法通过

小程序拒绝如下: 需要注意的地方如下: 关闭店铺展示关闭商户入驻关闭diy中的申请入口、店铺街入口等关闭个人中心广告的申请入口关闭分销关闭支付宝

基于Java语言的能源管理系统中软网关的应用

介绍 软网关适用于建筑、工厂、商场、医院、园区、高耗能企业、城市双碳建设平台等的水、电、气、热、油等能源数据采集、加工、分析、预警、碳指标、碳排放计算等场景; 企业通过软网关采集底层电表数据,传输给时序库,从而完成能源管理系统…

nginx全方位讲解

安装nginx [rootnginx ~]# tar zxf nginx-1.24.0.tar.gz [rootnginx ~]# cd nginx-1.24.0/ [rootnginx nginx-1.24.0]# ls auto CHANGES.ru configure html Makefile objs src CHANGES conf contrib LICENSE man README [rootnginx nginx-…

Python编码系列—Python WebSocket 实时通信:构建高效互动的网络应用

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

基于贝叶斯优化卷积神经网络(Bayes-CNN)的多因子数据分类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 贝叶斯优化过程 贝叶斯优化后的CNN训练和识别结果 标准的CNN的识别结果 2.算法运行软件版本 matlab2022a 3.部分核心程…

JavaScript(29)——函数参数

动态参数 arguments是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参,结果是一个伪数组。 function sum() {console.log(arguments);}sum(2, 3, 4)sum(6, 7) 剩余参数 剩余参数允许我们将一个不定数量的参数表示为一个数组 function sum…

深入理解HTTP的基础知识:请求-响应过程解析

首先,我们从网络协议的最顶层开始讲解,即应用层。在网络通信中,应用层是最接近用户的一层,它负责为特定的网络应用提供服务和功能。应用层协议定义了数据交换的规则和格式,以便不同的应用程序能够相互通信和交换信息。…

Xenu 网站死链接检测工具下载以及使用指南

引言 Xenus Link Sleuth(简称 Xenu)是一款功能强大的网站死链接检测工具。由于其绿色蜗牛形状的图标,Xenu 被广大的 SEO 人员亲切地称为“绿蜗牛”。 随着网站的发展,可能会因为删除过期内容或改版而导致一些死链接的产生。死链…

扫描包得到所有Bean的Class对象

文章目录 1.任务介绍以及类加载器1.介绍2.类加载器1.介绍2.自己程序的类路径 2.新建一个模块sun-spring用来写自己的spring容器1.新建模块2.查看是否交给父模块管理3.引入日志 3.具体实现1.目录2.Component.java3.ComponentScan.java4.MonsterDao.java5.MonsterService.java6.S…

第三期书生大模型实战营 进阶岛第3关LMDeploy 量化部署进阶实践

环境准备 conda create -n lmdeploy python3.10 -y conda activate lmdeploy conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia -y pip install timm1.0.8 openai1.40.3 lmdeploy[all]0.5.3为方便文件管理,我…

Vue(一) 插值与指令语法、数据代理、MVVM模式、事件处理

文章目录 1. 初始Vue2. 模板语法2.1 插值语法2.2 指令语法 3. el与data的两种写法3.1 el的两种写法3.2 data的两种写法 4. MVVM模式5. 数据代理5.1 Object.defineProperty()5.2 何为数据代理5.4 vue中的数据代理 6. 事件处理6.1 v-on6.2 事件修饰符6.3 键盘按键事件 1. 初始Vue…

【C语言】预处理的使用

预处理 一、预处理-宏定义1、程序编译过程(1) 编写源程序(2) 程序编译过程说明 2、预处理3、宏的概念4、无参宏5、带参宏6、带参宏的副作用7、宏定义中的符号粘贴 二、预处理.条件编译1、无值宏定义2、条件编译3、条件编译的使用场景 三、预处理.头文件1、头文件的作用2. 头文件…

RTSP/Onvif安防视频监控平台EasyNVR在欧拉系统中启动失败的原因排查

视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种视频流格式。平台支持轻量化部署,可兼容各类操作系统,包括Windows、Linux…