iOS推送通知

news2024/9/29 13:31:09

文章目录

  • 一、推送通知的介绍
    • 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 = self
        center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ in
            if granted == true {
                print("允许通知")
            } else {
                print("不允许通知")
            }
        }

(2)、创建并且发出通知

public func send(_ body: String) {
        let content = UNMutableNotificationContent()
        // 通知的内容
        content.title = "门禁Demo本地消息"
        content.subtitle = "iBeacon"
        content.body = body
        content.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 = self
        center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ in
            if 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 = self
        center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ in
            if granted == true {
                print("允许通知")
            } else {
                print("不允许通知")
            }
        }
    }
    
    public func send(_ body: String) {
        let content = UNMutableNotificationContent()
        // 通知的内容
        content.title = "Demo本地消息"
        content.subtitle = "iBeacon"
        content.body = body
        content.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.coloradmin.cn/o/1409592.html

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

相关文章

技术解读 | KunDB助力头部金融机构关键系统的Oracle国产替代

星环科技自主研发的分布式交易型数据库KunDB助力头部金融机构实现了关键系统的Oracle国产化替代。 通过可视化迁移工具完成了对象与数据的平滑迁移&#xff0c;将原先两套Oracle系统&#xff08;一套Oracle单机系统&#xff0c;一套Oracle RAC系统&#xff09;统一迁移到一套K…

运动戴什么耳机好?怎样选运动耳机?2024年运动蓝牙耳机推荐

​运动耳机作为运动人士的得力助手&#xff0c;不仅要求佩戴舒适&#xff0c;还需要在音质表现、防水性能、通话质量等方面有出色表现。下面我为大家推荐几款性能全面的运动耳机&#xff0c;希望能满足不同需求的运动爱好者&#xff0c;来看看吧。 1.南卡开放式耳机&#xff08…

02-TiDB部署本地测试集群

基于v7.5版本 1、下载并安装 TiUP curl --proto https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh 下载后路径/root/.tiup&#xff0c;已自动将环境变量写入文件中&#xff0c;需要手动执行source source /root/.bashrc 2、在当前 session 执行以下命令…

深入理解3D扩散生成式模型

Stable Dreamfusion 上的这个存储库启发了这个博客。 我认为 3D 扩散和 3D 生成似乎是每个人心中的下一件大事。 Stability AI 开始招聘才华横溢的 3D AI 工程师&#xff0c;谷歌和学术界每天似乎都在进行令人印象深刻的即时 3D 模型生成器研究。 然而&#xff0c;虽然我对这些…

GuitarPro和Earmaster那个适合新手

许久没发文了&#xff0c;最近在网上刷到了一位音乐UP主从容Free&#xff0c;他把自己对GuitarPro和Earmaster这2款软件的使用感受进行了详细分享&#xff0c;还没看过的朋友可以戳下面的链接跳转到小破站看完整的&#xff1a; 我不允许还有人不知道这个学吉他的神器&#xff…

专业140+总分420+复旦大学957信号与系统考研经验复旦电子信息与通信

今年专业957信号与系统140&#xff0c;数二140&#xff0c;总分420&#xff0c;顺利上岸复旦大学&#xff0c;回顾这一年的复习&#xff0c;有起有落&#xff0c;也有过犹豫和放弃&#xff0c;好在都坚持下来了&#xff0c;希望大家考研复习要不忘初心&#xff0c;困难肯定是很…

深度学习(5)--Keras实战

目录 一.Keras基础概念 二.如何跑通Keras项目 2.1.在cmd上跑通 2.2.在PyCharm上跑通 一.Keras基础概念 Keras是深度学习中的一个神经网络框架&#xff0c;是一个高级神经网络API&#xff0c;用Python编写&#xff0c;可以在TensorFlow&#xff0c;CNTK或Theano之上运行。 …

【labVIEW】学习记录

【labVIEW】学习记录 一、简介二、安装及激活三、使用 回到目录 一、简介 labVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;是一款由美国国家仪器公司&#xff08;National Instruments&#xff09;开发的可视化编程环境和开发平台。LabV…

Windows在局域网内开启共享文件夹

局域网内多台电脑开启共享文件夹可以提高使用舒适度&#xff0c;而共享文件夹的设置方式也非常简单。 1、开启网络共享 1.1 确定网络类型&#xff1a;公用or专用 首先我们需要确定自己的网络类型&#xff0c;首先从网络和共享中心可以看到我的电脑连接了一个wifi&#xff0c…

snmp网管服务MIB Browser使用

MIB Browser 软件打开显示界面&#xff0c;首先需要配置地址、端口号、团体名、snmp版本点击Advanced&#xff0c;弹出配置界面 配置成功后双击走测列表信息就可以查看交换机端口状态、版本号等信息&#xff1b; 例如&#xff1a;我的交换机8号端口是正常&#xff0c;其他端口是…

基于FPGA的高效除法器

FPGA可以通过除号直接实现除法&#xff0c;但是当除数或被除数位宽较大时&#xff0c;计算会变得缓慢&#xff0c;导致时序约束不能通过。此时可以通过在除法IP中加入流水线来提高最大时钟频率&#xff0c;这种方式提高时钟频率也很有限。如果还不能达到要求&#xff0c;就只能…

牛客刷题之列表

文章目录 生成数字列表列表的长度添加列表元素append() 列表尾添加insert(index,elem) 在任意位置插入 删除列表元素pop(index) 删除下标为index 的元素并返回remove(x) 删除指定元素 生成数字列表 方法一&#xff08;普通方法&#xff09; num input() newnum num.split() a…

Flutter中实现中国省份地图

效果展示(这里只展示局部&#xff0c;完全展示违规)&#xff1a; 可以点击省份改变颜色&#xff0c;更多功能可以自行拓展。 注&#xff1a;非完整中国地图&#xff01;&#xff01;&#xff01; 本文用于记录在Flutter项目中安卓端实现中国地图&#xff0c;因为实现过程是通过…

vue项目中debugger不生效问题解决

Vue中使用debugger在chrome谷歌浏览器中失效问题&#xff08;已解决&#xff09;_vue debugger不生效-CSDN博客 卡了半天,最后解决了

Python中安全删除列表元素的实用技巧详解

概要 在 Python 中&#xff0c;列表是一种常用的数据结构&#xff0c;用于存储一组有序的元素。然而&#xff0c;有时候需要从列表中删除特定的元素&#xff0c;以满足需求。本文将介绍一些安全删除列表元素的实用技巧&#xff0c;以及如何处理各种情况下可能出现的异常。 使用…

​第20课 在Android Native开发中加入新的C++类

​这节课我们开始利用ffmpeg和opencv在Android环境下来实现一个rtmp播放器&#xff0c;与第2课在PC端实现播放器的思路类似&#xff0c;只不过在处理音视频显示和播放的细节略有不同。 1.压缩备份上节课工程文件夹并修改工程文件夹为demo20&#xff0c;将demo20导入到Eclipse或…

代码随想录算法训练营29期|day30 任务以及具体安排

332.重新安排行程 class Solution {private LinkedList<String> res;private LinkedList<String> path new LinkedList<>();public List<String> findItinerary(List<List<String>> tickets) {Collections.sort(tickets, (a, b) -> a.…

Spring基于dynamic-datasource实现MySQL多数据源

目录 多数据源实现 引入依赖 yml配置文件 业务代码 案例演示 多数据源实现 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamicdatasourcespringbootstarter</artifactId><version>3.5.0</version> &…

Java玩转《啊哈算法》排序之桶排序

过去心不可得&#xff0c;现在心不可得&#xff0c;未来心不可得 目录在这里 楔子代码地址桶排序代码核心部分优缺点 完整代码演示 升级版核心代码完整代码演示 楔子 大家好&#xff01;本人最近看了下《啊哈算法》&#xff0c;写的确实不错&#xff0c;生动形象又有趣&#x…

AR 自回归模型

文章目录 总的代码ADF 检验(是否平稳)差分操作拟合AR 模型预测可视化总的代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.ar_model import AutoReg from statsmodels.tsa.stattools import adfuller# 生成一个示例时间序…