iOS 通知

ops/2024/11/15 0:45:05/

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 >= 150000if (@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) {//能过点击通知启动appNSLog(@"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.ppmy.cn/ops/98454.html

相关文章

LangGPT结构化提示词编写实践

配置环境 创建文件夹,安装软件 创建窗口,激活环境 部署成功 测试部署成功 进入页面

ClickHouse集群的安装

目录 1.clickhouse中文文档地址 2.centos安装部署 2.1采用tgz的方式安装 2.2修改配置文件 2.3修改数据目录 2.4创建角色和目录 3 集群安装 3.1配置文件修改 3.2启动zookeeper 3.3启动clickhouse-server 3.4任意节点连接clickhouse 3.5查看集群 3.6建库 3.7查看数…

LeetCode.55.跳跃游戏(贪心算法思路)

题目描述: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 输…

C# 数组(Array)

C# 数组(Array) C# 中的数组是一种数据结构,用于存储一系列具有相同数据类型的元素。数组在内存中连续存储元素,这使得数组在访问元素时非常高效。在 C# 中,数组可以是单维的,也可以是多维的。此外&#x…

Vulkan 学习(4)---- Vulkan 逻辑设备

目录 Vulkan Logical Device OverView逻辑设备创建VkDeviceQueueCreateInfoDeviceExtension获取DeviceQueue参考代码 Vulkan Logical Device OverView 在 Vulkan 中,逻辑设备(Logical Device)是与物理设备(Physical Device)交互的接口,它抽象了对特定GPU(物理设备)…

笔记-系统规划与管理师-案例题-2023年-服务持续改进

【说明】 X公司主营运维服务业务,上一年度客户满意度明显下降,为寻找公司服务实施过程中存在的问题和缺陷,并提供服务改进活动有效实施的目标和方向,保证组织的服务质量稳定可控,公司决定让小王负责运维服务质量管理工…

零基础STM32单片机编程入门(三十九) 多传感器模块之NFC刷卡开门实战源码

文章目录 一.概要二.实验原理三.实验控制流程四.STM32单片机刷卡开门实验(RC522刷卡模块SG90舵机)五.CubeMX工程源代码下载六.实验效果七.小结 一.概要 NFC技术作为一种近距离无线通信技术,具有安全、便捷、高效的特点。随着智能手机的普及和移动支付的发展&#x…

掌握ChatGPT写作艺术:从入门到精通的四个层次

这些周末我仔细研究了如何通过优化提示词提升ChatGPT输出内容的质量。 关于如何使用ChatGPT辅助我们的写作,我归纳了以下规律,希望能为你带来启发。 一、写作步骤 撰写一篇文章,思路上必须是从抽象到具体逐步深入。 首先我们需要明确写什么…