建设设计网站/百度一下你就知道了 官网
文章目录
- 一、推送通知的介绍
- 1. 简介
- 2. 通知的分类
- 二、本地通知
- 1. 本地通知的介绍
- 2. 实现本地通知
- 3. 监听本地通知的点击
- 三、远程通知
- 1. 什么是远程通知
- 2. 为什么需要远程通知
- 3. 远程通知的原理
- 4. 如何做远程通知
- 5. 远程通知证书配置
- 6. 获取远程推送要用的 `DeviceToken`
- 7. 测试方式: 远程通知
- 8. 监听远程通知的点击事件
- 四、极光推送
- 1. [极光推送 iOS 文档](https://docs.jiguang.cn/jpush/client/iOS/ios_sdk/)
- 2. 在极光推送平台创建一个应用
- 3. [iOS SDK 集成](https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/),官网讲解的很详细,简单导入 极光推送的iOS SDK
- 4. 测试项目的 `Bundle Identifier`要与我们上面创建证书的 `Bundle ID` 保持一致,并且打开如下图所示
- 5. 在 `AppDelegate.m` 导入极光推送的相应代码
- 6. 在极光推送后台进行推送,[发送通知](https://www.jiguang.cn/console/push/#/push/app/61a37ea3be0141df677f2da6/setting/platform/ios)
一、推送通知的介绍
1. 简介
推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的。
一般说来,当要显示消息或下载数据的时候,通知是由远程服务器(程序的提供者)发送,然后通过苹果的推送通知服务(Apple Push Notification Service,简称APNS)推送到设备的程序上。
2. 通知的分类
1、本地通知
概念:由APP本身给应用程序推送消息,不需要服务器的支持
常见场景:app本地定时提醒
注意:不是非常常用.
2、远程通知
概念:由服务器推送消息给用户,需要服务器的支持
常见场景:APP关闭后提醒的通知消息
注意:非常常用.但是如果仅仅是给用户提醒,客户端(你)做的事情就非常简单.
3、推送通知的呈现样式
- 在屏幕顶部显示一块横幅
- 锁屏界面也可以显示
提示:收到通知还可以做如下操作
- 收到通知时,同时播放音效.(比如支付宝或者微信收账语音提示)
- 收到通知时,改变APP图标上的数字(app图标上的消息数量)
二、本地通知
1. 本地通知的介绍
-
直接由应用程序(程序中写入对应代码)给用户发出通知
-
本地通知需要用到一个重要的类:
UNUserNotificationCenter
-
本地通知的实现步骤:
(1)创建本地通知
(2)设置本地通知要发出的内容等信息- 发出时间
- 发出内容
- 播放的音效
(3)调度本地通知
2. 实现本地通知
(1)、注册通知
- 通常是在
AppDelegate
的didFinishLaunchingWithOptions
中进行注册,代码如下
let center = UNUserNotificationCenter.current()center.delegate = selfcenter.requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ inif granted == true {print("允许通知")} else {print("不允许通知")}}
(2)、创建并且发出通知
public func send(_ body: String) {let content = UNMutableNotificationContent()// 通知的内容content.title = "门禁Demo本地消息"content.subtitle = "iBeacon"content.body = bodycontent.sound = UNNotificationSound.default// 间隔多久推送一次// UNTimeIntervalNotificationTrigger 延时推送// UNCalendarNotificationTrigger 定时推送// UNLocationNotificationTrigger 位置变化推送// 当前时间之后的0.1s后推送一次(如果重复的话时间要大于等于60s)let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 0.1, repeats: false)// 消息标识let id = "req_identifier" + UUID().uuidString// 建立通知请求let request = UNNotificationRequest.init(identifier: id, content: content, trigger: trigger)// 将建立的通知请求添加到通知中心UNUserNotificationCenter.current().add(request)}
总体属性展示
@NSCopying open var badge: NSNumber? // 应用程序右上角的数字
open var body: String // 提示信息
@NSCopying open var sound: UNNotificationSound? // 设置通知发出时音效
open var subtitle: String // 通知副标题
open var title: String // 通知中心的标题
open var userInfo: [AnyHashable : Any] // 额外信息
(3)、移除通知
// 移除所有的通知UNUserNotificationCenter.current().removeAllPendingNotificationRequests()// 移除某个通知UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [id])
3. 监听本地通知的点击
(1)、为什么要监听本地通知的点击?
不管应用程序出于后台还是被杀死,点击通知都可以打开应用程序。
当用点击通知时,进入到某一个固定界面,需要监听用户点击了通知
(2)、监听本地通知的点击,应用程序分很多种状态
- 在前台:如果在前台不需要进行页面跳转
- 在后台:点击应用时进行页面的跳转
- 被杀死:点击应用打开应用时,进行页面的跳转
应用程序在前台或者后台时的代码如下
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {print("本地通知的点击")/**UIApplicationStateActive, 前台UIApplicationStateInactive, 进入前台UIApplicationStateBackground 在后台*/if application.applicationState == .active {return // 前台情况下 不做操作}// 进行页面的跳转}
应用程序被杀死时的情况下不会走上面的代码,但是不管是在任何情况下都会走下面的代码,通过launchOptions
的key
来做出各种判断,代码如下
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// Override point for customization after application launch.// 判断是否是通过点击通知打开了应用程序if let key = launchOptions?[UIApplication.LaunchOptionsKey.localNotification] {// 在app杀死的情况下,本地通知的所走的地方}
}
提示:对应 launchOptions
的其他常用 key 如下
- 对应的是启动应用程序的的远程通知信息userInfo(NSDictionary)
UIApplicationLaunchOptionsRemoteNotificationKey
- 对应的是为启动应用程序的的本地通知对象(UILocalNotification)
UIApplicationLaunchOptionsLocalNotificationKey
- 对应的对象为启动URL(NSURL)
UIApplicationLaunchOptionsURLKey
- 从点击3D Touch iCon启动,对应的是点击的iCon的信息。
UIApplicationLaunchOptionsShortcutItemKey
* 有关蓝牙的操作
UIApplicationLaunchOptionsBluetoothPeripheralsKey
UIApplicationLaunchOptionsBluetoothCentralsKey
* 对应启动的源应用程序的bundle ID (NSString)
UIApplicationLaunchOptionsSourceApplicationKey
三、远程通知
1. 什么是远程通知
概念:由服务器发送消息给用户弹出消息的通知(需要联网)
远程推送服务,又称为 APNS
(Apple Push Notification Services
)
APNS通知
:是指通过向 Apple APNs 服务器发送通知,到达 iOS 设备,由 iOS 系统提供展现的推送。用户可以通过 IOS 系统的 “设置” >> “通知” 进行设置,开启或者关闭某一个 App 的推送能力。
2. 为什么需要远程通知
例子:APP搞活动,促销活动或者商品降价,想告知用户.但是该用户不经常打开APP。 如何通知该用户有最新的活动呢?
传统方式:只有用户打开了APP客户端,客户端向服务器请求是否有最新的活动,才能在APP中告知用户活动.
局限性:只要用户关闭了APP,就无法跟APP的服务器沟通,无法从服务器上获得最新的数据内容
远程通知的好处:不管用户打开还是关闭APP,只要联网了,都能接收到服务器推送的远程通知
3. 远程通知的原理
1、原理图
2、为什么服务器不直接推消息给用户
- 在通常情况下服务器端是不能主动向客户端推消息的
- 如果想服务器端给客户端推消息,必须建立长连接
- 客户端在处于后台时(app杀死的情况下)不能和服务器端建立长连接
3、为什么苹果服务器可以推消息给用户?
所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
苹果建立长连接的作用: 时间校准、系统升级提示、查找我的iPhone、远程通知 等等
常见疑惑:
苹果在推送消息时,如何准确的推送给某一个用户,并且知道是哪一个APP ?
在服务器把消息给苹果的APNs服务器时,必须告知苹果DeviceToken
DeviceToken
是由用户手机的UDID和应用程序的BundleID共同生成的
通过DeviceToken可以找到唯一手机中的唯一应用程序
4、完整的流程图
4. 如何做远程通知
- 首先,BundleID对应的App ID必须是明确的(特殊功能)
- 该APPID必须配置两个证书
- **开发证书:**用于调试远程推送
- **发布证书:**用于发布后给用户推送消息
- 根据上面的App ID重新配置描述文件
- 安装对应的证书,即可开始测试远程推送
5. 远程通知证书配置
1、我们先创建一个 CSR
文件(又叫做:证书签名请求文件)(下面会用到,它是用来绑定电脑的)
-
找到
Launchpad
里面的 钥匙串访问
-
打开
钥匙串访问
->证书助理
->从证书机构颁请求证书
-
出现如下界面,选择存储到磁盘,点击继续
*选择存储到待会好找的地方(比如:桌面,自己建的文件夹等等),存储
2、在 Identifiers
里面创建一个明确的App ID
- 提示:
Bundle ID
一定要填写明确的
点击注册
3、为(2)
中创建的App ID 配置推送 开发证书(测试证书)与推送发布证书
点击进入编辑页面
4、配置描述文件
* iOS证书分2种,1种是开发证书,用来给你(开发人员)做真机测试的;1种是发布证书,发布证书又分发布到app store的(这里不提及)和发布测试的ad hoc证书。
提示:描述文件下载完后记得双击运行一下
6. 获取远程推送要用的 DeviceToken
1、工程的 Bundle identifier
要与我们上面设置的 App ID
保持一致,并且添加Push Notification
选项
2、在苹果的APNs服务器注册,以获取DeviceToken
- 通常在
AppDelegate
里面的didFinishLaunchingWithOptions
中添加如下代码进行注册
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// Override point for customization after application launch.// 1.向用户请求可以给用户推送消息let center = UNUserNotificationCenter.current()center.delegate = selfcenter.requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ inif granted == true {print("允许通知")} else {print("不允许通知")}}// 2.注册远程通知(拿到用户的DeviceToken)application.registerForRemoteNotifications()return true
}
- 注册之后在另外一个代理方法中,拿到DeviceToken
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {// 将用户的用户名和deviceToken发送给服务器,让服务器进行保存备份即可print(deviceToken as NSData)// 例如:<e967259e b9622008 89a9d3fb ab3be0c5 e25ef2ab 569f0ae4 850779b8 187be219>// 其中我们服务器要保存的 deviceToken 是不包括两边的尖括号的}func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {print(error.localizedDescription)}
注意:
- 获取到的
deviceToken
发送给服务器,让服务器进行保存备份即可 - 我们服务器要保存的 deviceToken 是不包括两边的尖括号的
7. 测试方式: 远程通知
(1)、使用一个第三方的Mac程序来测试:PushMeBaby,并删除里面的资源,把我们自己推送的开发证书与发布证书模仿其命名改名并拖进去
(2)、修改 PushMeBaby里面的ApplicationDelegate.m
,把 self.deviceToken
修改为我们上面 3.6
中运行后拿到的 DeviceToken
,切记 DeviceToken
不包含左右尖括号
(3)、做完操作,运行PushMeBaby
,选择相应的内容
备注
还有其他APP 同样可以实现,例如:PushMan、SmartPush
可以实现在电脑上模拟APNS推送
8. 监听远程通知的点击事件
其实和本地通知的监听是一样的,一种是在前台和后台的监听,一种是在app杀死情况下的监听,代码如下
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// Override point for customization after application launch.LocalNotification.shared.setNotifiAuth()// 2.注册远程通知(拿到用户的DeviceToken)application.registerForRemoteNotifications()// 判断是否是通过点击通知打开了应用程序if let key = launchOptions?[UIApplication.LaunchOptionsKey.localNotification] {// 在app杀死的情况下,本地通知的所走的地方}return true
}func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {// 将用户的用户名和deviceToken发送给服务器,让服务器进行保存备份即可print(deviceToken)// 例如:<f52a0bc4 57274b41 04684820 f2da2e60 96dd0f8c f24e15b7 7592a8ee b48f5138>// 其中我们服务器要保存的 deviceToken 是不包括两边的尖括号的}func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {print(error.localizedDescription)}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {print("本地通知的点击")/**UIApplicationStateActive, 前台UIApplicationStateInactive, 进入前台UIApplicationStateBackground 在后台*/if application.applicationState == .active {return // 前台情况下 不做操作}// 进行页面的跳转}class LocalNotification: NSObject {/// 单例public static let shared = LocalNotification()public func setNotifiAuth() {let center = UNUserNotificationCenter.current()center.delegate = selfcenter.requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ inif granted == true {print("允许通知")} else {print("不允许通知")}}}public func send(_ body: String) {let content = UNMutableNotificationContent()// 通知的内容content.title = "Demo本地消息"content.subtitle = "iBeacon"content.body = bodycontent.sound = UNNotificationSound.default// 间隔多久推送一次// UNTimeIntervalNotificationTrigger 延时推送// UNCalendarNotificationTrigger 定时推送// UNLocationNotificationTrigger 位置变化推送// 当前时间之后的0.1s后推送一次(如果重复的话时间要大于等于60s)let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 0.1, repeats: false)// 消息标识let id = "req_identifier" + UUID().uuidString// 建立通知请求let request = UNNotificationRequest.init(identifier: id, content: content, trigger: trigger)// 将建立的通知请求添加到通知中心UNUserNotificationCenter.current().add(request)}
}@available(iOS 13.0.0, *)
extension LocalNotification: UNUserNotificationCenterDelegate {// 前台显示弹窗func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {return .alert}func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {}
}
提示:我们可以使用新的监听用户点击远程通知的方法,如下:(包含上面的两种监听方式)
/*此方法是新的用于响应远程推送通知的方法1.如果应用程序在后台,则通知到,点击查看,该方法自动执行2.如果应用程序在前台,则通知到,该方法自动执行3.如果应用程序被关闭,则通知到,点击查看,先执行didFinish方法,再执行该方法4.可以开启后台刷新数据的功能step1:点击target-->Capabilities-->Background Modes-->Remote Notification勾上step2:在给APNs服务器发送的要推送的信息中,添加一组字符串如:{"aps":{"content-available":"999","alert":"bbbbb.","badge":1}}其中content-availabel就是为了配合后台刷新而添加的内容,999可以随意定义
*/
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {print("本地通知的点击")/**UIApplicationStateActive, 前台UIApplicationStateInactive, 进入前台UIApplicationStateBackground 在后台*/if application.applicationState == .active {return // 前台情况下 不做操作}// 进行页面的跳转completionHandler(.newData);}
四、极光推送
1. 极光推送 iOS 文档
APNs 通知:是指通过向 Apple APNs 服务器发送通知,到达 iOS 设备,由 iOS 系统提供展现的推送。用户可以通过 IOS 系统的 “设置” >> “通知” 进行设置,开启或者关闭某一个 App 的推送能力。
JPush iOS SDK 不负责 APNs 通知的展现,只是向 JPush 服务器端上传 Device Token 信息,JPush 服务器端代理开发者向 Apple APNs 推送通知。
APNs 通知与应用内消息对比
APNS | 应用内消息 | |
---|---|---|
推送原则 | 由 JPush 服务器发送至 APNS 服务器,再下发到手机。 | 由 JPush 直接下发,每次推送都会尝试发送,如果用户在线则立即收到。否则保存为离线。 |
离线消息 | 离线消息由 APNS 服务器缓存按照 Apple 的逻辑处理。 | 用户不在线 JPush server 会保存离线消息,时长默认保留一天。离线消息保留 5 条。 |
推送与证书环境 | 应用证书和推送指定的 iOS 环境匹配才可以收到。 | 自定义消息与 APNS 证书环境无关。 |
接收方式 | 应用退出,后台以及打开状态都能收到 APNS。 | 需要应用打开,与 JPush 建立连接才能收到。 |
展示效果 | 如果应用后台或退出,会有系统的 APNS 提醒。如果应用处于打开状态,则不展示,iOS 10 开始可实现前台展示。 | 非 APNS,默认不展示。可通过获取接口自行编码处理。 |
处理函数 | Apple 提供的接口:didReceiveRemoteNotification | JPush 提供的接口:networkDidReceiveMessage |
2. 在极光推送平台创建一个应用
3. iOS SDK 集成,官网讲解的很详细,简单导入 极光推送的iOS SDK
4. 测试项目的 Bundle Identifier
要与我们上面创建证书的 Bundle ID
保持一致,并且打开如下图所示
静默推送(silent_push):如果只携带content-available: 1,不携带任何badge,sound 和消息内容等参数,则可以不打扰用户的情况下进行内容更新等操作即为“Silent Remote Notifications”。
5. 在 AppDelegate.m
导入极光推送的相应代码
这里说明几个参数
- appKey:选择极光控制台的应用 ,点击“设置”获取其 appkey 值。请确保应用内配置的 appkey 与极光控制台上创建应用后生成的 appkey 一致。
- channel:指明应用程序包的下载渠道,为方便分渠道统计,具体值由你自行定义,如:App Store。
- apsForProduction:
- 1.3.1 版本新增,用于标识当前应用所使用的 APNs 证书环境。
- 0(默认值)表示采用的是开发证书,1 表示采用生产证书发布应用。
- 注:此字段的值要与 Build Settings 的 Code Signing 配置的证书环境一致。
- advertisingIdentifier:详见 关于 IDFA。
6. 在极光推送后台进行推送,发送通知
在手机上我们就能收到推送通知了
相关文章:

iOS推送通知
文章目录 一、推送通知的介绍1. 简介2. 通知的分类 二、本地通知1. 本地通知的介绍2. 实现本地通知3. 监听本地通知的点击 三、远程通知1. 什么是远程通知2. 为什么需要远程通知3. 远程通知的原理4. 如何做远程通知5. 远程通知证书配置6. 获取远程推送要用的 DeviceToken7. 测试…...

安全产品与等级保护:匹配与选择指南
基本要求项测评项基本措施对应产品网络架构应保证网络各个部分的带宽满足业务高峰期需要;带宽管理流量控制系统应避免将重要网络区域部署在边界处,重要网络区域与其他网络区域之间应采取可靠的技术隔离手段;网络及安全设备配置访问控制策略防…...

网络分层和网络原理之UDP和TCP
温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本). http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…...

软件包管理:在CentOS 7中部署Tengine
目录 下载: 方法一: 方法二: 部署: 实验操作 下载: 方法一: 1、打开浏览器搜索tengine并点击官网 2、选择需要安装的版本并复制链接链接 标题栏处可以更改为中文界面 下滑选择版本单击下载 在远程连…...

爬取A站视频,涉及m3u8格式的处理
一、抓包分析 1.进入A站进行抓包分析 进入一个页面,右点击鼠标按钮,点击检查 接着点击network,点击Fetxh/XHR,然后刷新网页,得到下面的页面 发现其中有许多d595开头的文件,它们是ts文件,点击其中一个。在…...

《微信小程序开发从入门到实战》学习九十四
7.1 视图容器组件 7.1.4 movable-view和movable-area组件 movable-view是一个可移动的视图容器,它需要与movable-area组件结合使用。movabke-view只能放在movable-area组件中,在movable-area组件的范围内拖曳滑动。 movable-view组件属性如下…...

深度学习记录--Batch Norm
Batch Norm 与Input Norm对输入层进行归化不同,Batch Norm是对隐藏层进行归化 实现 ,其中、调节均值和方差 ,...

svn和git的本质区别是什么
参考: https://blog.csdn.net/feiying0canglang/article/details/126550676 上边图中,跨越了区的箭头,它中间的区数据都会同步。例如:git checkout ,它是将本地仓库数据更新到暂存区和工作区的。\ 理解 gitlab和svn都…...

Redis面试
1.说说什么事redis Redis是一种基于键值对的NoSql数据库。 Redis中的value支持string(字符串)、hahs(哈希)、list、set、zset(有序集合)、bitmaps(位图),HyperLoglog等数…...

贪吃蛇(C)
游戏背景:贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 总: 游戏设计大纲: 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇。 实现的基本功能: 1、贪吃蛇地图绘制。 2、蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作)。 …...

【云原生】Docker基于Dockerfile多级构建,实现缩小镜像体积
目录 一、基于上次的nginx的Dockerfile做多级构建 二、基于上次的php的Dockerfile修改做多级构建 三、基于上次的mysql的Dockerfile修改做多级构建 基于以上三个镜像构建 四、镜像体积是不是越小越好?为什么要缩减镜像体积? 五、缩小镜像体积的方法…...

第七十一周周报
学习目标: 一、实验 二、小程序 学习时间: 2024.1.20-2024.1.26 学习产出: 一、小程序 这周花了两天根据陈勇和纪行之的代码优化了小程序的代码 二、实验 根据stylegan2仓库的redeme文件重新跑了stylegan2和diffusion-stylegan2 DV…...

绿色制造的行业标杆OEKO-TEX STeP认证
STeP是“OEKO-TEX国际环保纺织协会”推出的一个独立的第三方认证体系。STeP全称Sustainable Textile & Leather Production(可持续纺织和皮革生产),是面向纺织和皮革供应链中环保且负有社会责任的生产工厂推出的透明认证体系。 STeP认证的…...

第3章:Python 的函数和模块(基于最新版 Python3.12 编写)
文章目录 3.1 函数:编写你的代码乐曲3.1.1 什么是函数?3.1.2 如何定义函数?3.1.3 如何调用函数?3.1.4 函数的返回值3.1.5 函数的文档字符串3.1.6 默认参数值3.1.7 可变数量的参数3.1.8 局部变量和全局变量3.1.9 递归函数 3.2 模块…...

网络安全产品之认识漏洞扫描设备
文章目录 一、什么是漏洞扫描设备二、漏洞扫描设备的主要功能三、漏洞扫描设备的主要技术四、漏洞扫描设备的主要类型五、漏洞扫描设备的使用方式六、漏洞扫描设备如何与其他安全设备联动七、漏洞扫描设备的应用场景 漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在…...

Hadoop增加新节点环境配置(自用)
完成Hadoop集群增添一个新的节点配置(文中命名为)Hadoop106,没有进行继续为该节点分配身份职能的步骤 1.在VMware中安装CentOS 7 新建虚拟机 1.⾸先我们创建⼀个新的虚拟机,也可以点⽂件-新建虚拟机。 2.选择⾃定义,…...

Apache Shiro 安全框架
前言 Apache Shiro 是一个强大且容易使用的Java安全矿建,执行身份验证,授权,密码和会话管理。使用Shiro的易于理解的API您可以快速轻松的获得任何应用程序直到大的项目。 一丶什么是Shiro 1.Shiro是什么 Apache Shiro是一个强大且易于使用…...

防火墙的NAT
目录 1. NAT 概念解析 2. 配置NAT策略: 1. NAT 概念解析 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多的NAPT 服务器映射 源NAT --- 基于源IP地址进行转换。我们之前接过的静态NAT,动态NAT,NAPT都属…...

Java基础进阶03-注解和单元测试
目录 一、注解 1.概述 2.作用 3.自定义注解 (1)格式 (2)使用 (3)练习 4.元注解 (1)概述 (2)常见元注解 (3)Target &#x…...

Mac+Android Studio配置 Flutter环境
Fluttrer中文下载官网 Flutter下载官网 1、环境变量 .zshrc #Flutter export PUB_HOSTED_URL"https://pub.flutter-io.cn" export FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn" export FLUTTER_HOME/Users/leon/Flutter/flutter_3_10_4/f…...

架构整洁之道-设计原则
4 设计原则 通常来说,要想构建一个好的软件系统,应该从写整洁的代码开始做起。这就是SOLID设计原则所要解决的问题。 SOLID原则的主要作用就是告诉我们如何将数据和函数组织成为类,以及如何将这些类链接起来成为程序。请注意,这里…...

数据结构(队列)
一.什么是队列 1.队列定义 队列是一种特殊的线性表,特殊之处在于他只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。和栈一样,队列也是一种操作受限制的线性表。进行插入操作的一端称为队尾,进行删除操作的…...

docker容器启动后修改或添加端口 nacos容器 版本2.x需要额外开放9848、9849
1.输入docker ps -a查看需要修改的容器ID: 记录下、 docker ps -a 2.停止docker systemctl stop docker 3.进入docker 容器文件夹,找到对应容器的位置: docker的默认文件夹应该是/var/lib/docker 如果不是root用户查看的话,可能会出现权限…...

C语言实现归并排序算法(附带源代码)
归并排序 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。 可从上到下或从下到上进行。 动态效果过程演示: 归并排序(Merge Sort)是一种分治算法,它将一个数组分为两个子数组,分别对这两个…...

考研C语言刷题基础篇之分支循环结构基础(二)
目录 第一题分数求和 第二题:求10 个整数中最大值 第三题:在屏幕上输出9*9乘法口诀表 第四题:写一个代码:打印100~200之间的素数 第五题:求斐波那契数的第N个数 斐波那契数的概念:前两个数相加等于第三…...

Scala基础知识
scala 1、scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数式编程。 2、scala解释器 要启动scala解释器,只需要以下几步: 按住windows键 r输入scala即可 在scala命令提示窗口中执行:quit,即可退…...

数学建模-------误差来源以及误差分析
绝对误差:精确值-近似值; 举个例子:从A到B,应该有73千米,但是我们近似成了70千米;从C到D,应该是1373千米,我们近似成了1370千米,如果使用绝对误差,结果都是3…...

Arduino和MPLAB X 开发STM32F103和PIC16F15376
要点: 使用Arduino开发STM32F103(Blue Pill),MPLAB X 开发PIC16F15376(Curiosity Nano)C/C嵌入式开发ESP32(Arduino、ESP-IDF)和STM32实时操作系统FreeRTOS STM32使用FreeRTOS示例 在使用 FreeRTOS 时&a…...

手机操作系统Android
▶1.Android系统概述 Andaid(读[安卓)由Coosle公司和开放手机联盟共同开发,它是基于Lmx内核的开源操作系统。Andtoid主要用于移动设备,如智能手机和平板计算机。2008年发布了第一部Andtoid智能手机,以后Android逐渐扩展到平板计算机、电视、…...

2024年,你是否还在迷茫?
2024年,你是否还在迷茫? 别担心!鸿蒙来了,这个未来技术的制高点,为你提供了答案! 诸多大厂疯抢、24年预计鸿蒙相关的岗位需求将达到百万级、就业均薪达到19K,全国高校开课…… 种种现象都在表…...