iOS推送通知

文章目录

  • 一、推送通知的介绍
    • 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. 本地通知的介绍

  1. 直接由应用程序(程序中写入对应代码)给用户发出通知

  2. 本地通知需要用到一个重要的类: UNUserNotificationCenter

  3. 本地通知的实现步骤:
    (1)创建本地通知
    (2)设置本地通知要发出的内容等信息

    • 发出时间
    • 发出内容
    • 播放的音效

    (3)调度本地通知

2. 实现本地通知

(1)、注册通知

  • 通常是在 AppDelegatedidFinishLaunchingWithOptions 中进行注册,代码如下
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 // 前台情况下 不做操作}// 进行页面的跳转}

应用程序被杀死时的情况下不会走上面的代码,但是不管是在任何情况下都会走下面的代码,通过launchOptionskey来做出各种判断,代码如下

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. 什么是远程通知

概念:由服务器发送消息给用户弹出消息的通知(需要联网)
远程推送服务,又称为 APNSApple 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 提供的接口:didReceiveRemoteNotificationJPush 提供的接口: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. 在极光推送后台进行推送,发送通知

在这里插入图片描述

在这里插入图片描述

在手机上我们就能收到推送通知了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security 存储密码之 JDBC

Spring Security的JdbcDaoImpl实现了UserDetailsService接口,通过使用JDBC提供支持基于用户名和密码的身份验证。 JdbcUserDetailsManager扩展了JdbcDaoImpl,通过UserDetailsManager接口提供UserDetails的管理功能。 当Spring Security配置为接受用户名/密码进行身份验证时,…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴&#xff0c;梳理了系统的行为需求。但你可能也发现了&#xff0c;其实还有些微妙的业务概念还没有澄清&#xff0c;这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模&#xff0c;需要理论和实践相结合。由于我们的模型有一定的…

vue3+elementPlus pc和小程序ai聊天文生图

websocket封装可以看上一篇文章 //pc端 <template><div class"common-layout theme-white"><el-container><el-aside><div class"title-box"><span>AI Chat</span></div><div class"chat-list&…

【软件测试】学习笔记-构建并执行 JMeter 脚本的正确姿势

有些团队在组建之初往往并没有配置性能测试人员&#xff0c;后来随着公司业务体量的上升&#xff0c;开始有了性能测试的需求&#xff0c;很多公司为了节约成本会在业务测试团队里选一些技术能力不错的同学进行性能测试&#xff0c;但这些同学也是摸着石头过河。他们会去网上寻…

一天吃透计算机网络面试八股文

面试网站&#xff1a;topjavaer.cn 目录&#xff1a; 网络分层结构三次握手两次握手可以吗&#xff1f;四次挥手第四次挥手为什么要等待2MSL&#xff1f;为什么是四次挥手&#xff1f;TCP有哪些特点&#xff1f;说说TCP报文首部有哪些字段&#xff0c;其作用又分别是什么&…

idea结合git回到某个提交点

概述&#xff1a;在IntelliJ IDEA中&#xff0c;你可以使用Git工具来回到某个提交点。 第一步&#xff1a;打开idea&#xff0c;打开git的管理面 可以看到&#xff0c;由于我的大改动&#xff0c;导致现在出问题了&#xff0c;所以我准备回退到某一版本。 点击左下角的git 点…

使用IntelliJ IDEA快速搭建springboot 基础模板项目

使用IntelliJ IDEA快速搭建springboot 基础模板项目&#xff01;今天和大家分享一下&#xff0c;如何使用IntelliJ IDEA里面的maven插件&#xff0c;来快速搭建一个简单的Springboot基础项目。 第一步&#xff0c;菜单里面找到&#xff0c;文件-》新建-项目。如图。我们勾选了是…

这是一片测试文章

这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 真的是测试文章 -111122225555444433333333222211111 dddddaaa

sklearn 学习-混淆矩阵 Confusion matrix

混淆矩阵Confusion matrix&#xff1a;也称为误差矩阵&#xff0c;通过计算得出矩阵的结果用来表示分类器的精度。其每一列代表预测值&#xff0c;每一行代表的是实际的类别。 from sklearn.metrics import confusion_matrixy_true [2, 0, 2, 2, 0, 1] y_pred [0, 0, 2, 2, 0…

高中数学:集合

一、基本概念与关系 1、元素 2、集合 集合中元素的特性 1、确定性。2、无序性。3、互异性。 3、空集&#xff0c;用∅符号表示 4、元素与集合的关系是属于关系&#xff0c;用∈符号表示 5、集合与集合的关系是包含关系。用⊆或者⊊符号表示 子集与真子集。 A⊊B > A⊆B 反之…

Microsoft Remote Desktop for Mac(远程桌面连接)激活版

Microsoft Remote Desktop是一款由微软开发的远程桌面连接工具&#xff0c;它允许用户从另一台计算机或移动设备远程连接到Windows桌面或服务器。 以下是该软件的一些主要特点和功能&#xff1a; 跨平台支持&#xff1a;Microsoft Remote Desktop支持Windows、macOS、iOS和Andr…

数据结构(顺序表)

文章目录 一、线性表1、线性表1.1、线性表的定义1.2、线性表的操作 2、顺序表2.1、顺序表的实现--静态分配2.2、顺序表的实现--动态分配2.2、顺序表的特点 3、顺序表的基本操作3.1、插入操作3.2、删除操作3.3、查找操作3.2、按位查找3.2、按值查找 一、线性表 1、线性表 1.1、…

第二百八十八回

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容&#xff0c;本章回中将介绍如何播放视频.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…

Docker Registry(镜像仓库)

什么是Docker Registry 镜像仓库负责存储&#xff0c;管理和分发镜像&#xff0c;并且提供登入认证能力&#xff0c;建立仓库的索引。镜像仓库管理多个repositoy&#xff0c;repositoy通过命名来区分。每个repository包含一个或多个镜像&#xff0c;镜像通过镜像名称和标签&am…

k8s从初识到上天系列第二篇:kubernetes的组件和架构

&#x1f609;&#x1f609; 欢迎加入我们的学习交流群呀&#xff01; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、SpringSecurity、Docker、Grpc、各种MQ、Rpc、SpringCloud等等很多应用和源码…

【JAVA语言-第15话】集合框架(二)——List、ArrayList、LinkedList、Vector集合

目录 List集合 1.1 概述 1.2 特点 1.3 常用方法 1.4 ArrayList集合 1.4.1 概述 1.4.2 练习 1.5 LinkedList集合 1.5.1 概述 1.5.2 特点 1.5.3 常用方法 1.5.4 练习 1.6 Vector类 1.6.1 概述 1.6.2 练习 1.7 List实现类的异同点 List集合 1.1 概述 java.util…

【自动化测试】读写64位操作系统的注册表

自动化测试经常需要修改注册表 很多系统的设置&#xff08;比如&#xff1a;IE的设置&#xff09;都是存在注册表中。 桌面应用程序的设置也是存在注册表中。 所以做自动化测试的时候&#xff0c;经常需要去修改注册表 Windows注册表简介 注册表编辑器在 C:\Windows\regedit…

一篇文章带你了解C++中隐含的this指针

文章目录 一、this指针的引出二、this指针的特性【面试题】 一、this指针的引出 我们先来定义一个日期类Date&#xff0c;下面这段代码执行的结果是什么呢&#xff1f; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}v…

基于springboot+vue的明星周边产品销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

Python tkinter (6) Listbox

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…