必须掌握的iOS技术|网络|推送与数据处理

22、深入探讨iOS开发:从基础到高级功能 本文深入探讨了iOS开发的多个技术层面,从基础的用户界面设计和数据处理,到网络通信、多媒体处理,再到地图集成、推送通知、游戏开发以及多任务处理。通过详细的代码示例和技术解析,帮助开发者全面提升iOS应用开发技能,适合不同阶段的iOS开发者学习与实践。 阅读详情

我们所开发的 App 或多或少会与网络相连。或是拉取服务器端数据来更新 UI,或是通过网络推送自己的消息,或是在手机端删除自己曾经的照片,或是打开音乐播放应用下载自己喜欢的歌曲。如何请求、接收、处理、发送数据,就是我们这节要讨论的内容。

计算机理论

1.谈谈 HTTP 中 GET 与 POST 的区别

关键词:#方向 #类型 #参数位置

  • 从方向上来看,GET 是从服务器端获取信息,POST 是向服务器端发送信息。

  • 从类型上来看,GET 处理静态和动态内容,POST 只处理动态内容。

  • 从参数位置来看,GET 的参数在其 URI 里,POST 的参数在它的包体里:从这个角度来看,POST 比 GET 更加安全隐秘。

  • GET 可以被缓存,可以被储存在浏览器历史中,其内容理论上有长度限制;POST 在这 3 点上恰恰相反。

2.谈谈 Session,Token,Cookie 的概念

关键词:#用户认证 #客户端 #服务器端

  • Session 是服务器端用来认证、追踪用户的数据结构。它通过判断客户端传来的信息确定用户,确定用户的唯一标识是客户端传来的 Session ID。

  • Token 是服务器端生成的一串字符串,是客户端进行请求的令牌、服务器端用以确定用户的唯一标识。Session ID 就经常被用作 Token 来使用。Token的出现避免了服务器频繁的查询用户名和密码,降低了数据库的查询压力。

  • Cookie 是客户端保存用户信息的机制。初次会话 HTTP 协议会在 Cookie 里记录一个 Session ID ,之后每次把 Session ID 发给服务器端。

  • Session 一般用于用户验证。它默认存在服务器的一个文件里,当然内存、数据库里也可以存储。

  • 若是客户端禁用了 Cookie,客户端会用 URL 重写技术,即会话时在 URL 的末尾加上 Session ID,并发送给服务器端。

3.在一个 HTTPS 连接的网站里,输入账号密码点击登录后,到服务器返回这个请求前,中间经历了什么

关键词:#锁 #客户端 #服务器端

1) 客户端打包请求。包括 url,端口啊,你的账号密码等等。账号密码登陆应该用的是 Post 方式,所以相关的用户信息会被加载到 body 里面。这个请求应该包含三个方面:网络地址,协议,资源路径。注意,这里是 HTTPS,就是 HTTP + SSL / TLS,在 HTTP 上又加了一层处理加密信息的模块(相当于是个锁)。这个过程相当于是客户端请求钥匙。

2) 服务器接受请求。一般客户端的请求会先发送到 DNS 服务器。 DNS 服务器负责将你的网络地址解析成 IP 地址,这个 IP 地址对应网上一台机器。这其中可能发生 Hosts Hijack 和 ISP failure 的问题。过了 DNS 这一关,信息就到了服务器端,此时客户端会和服务器的端口之间建立一个 socket 连接,socket 一般都是以 file descriptor 的方式解析请求。这个过程相当于是服务器端分析是否要向客户端发送钥匙模板。

3) 服务器端返回数字证书。服务器端会有一套数字证书(相当于是个钥匙模板),这个证书会先发送给客户端。这个过程相当于是服务器端向客户端发送钥匙模板。

4) 客户端生成加密信息。根据收到的数字证书(钥匙模板),客户端会生成钥匙,并把内容锁上,此时信息已经加密。这个过程相当于客户端生成钥匙并锁上请求。

5) 客户端发送加密信息。服务器端会收到由自己发送出去的数字证书加锁的信息。 这个时候生成的钥匙也一并被发送到服务器端。这个过程是相当于客户端发送请求。

6) 服务器端解锁加密信息。服务器端收到加密信息后,会根据得到的钥匙进行解密,并把要返回的数据进行对称加密。这个过程相当于服务器端解锁请求、生成、加锁回应信息。

7) 服务器端向客户端返回信息。客户端会收到相应的加密信息。这个过程相当于服务器端向客户端发送回应。

8) 客户端解锁返回信息。客户端会用刚刚生成的钥匙进行解密,将内容显示在浏览器上。

整个过程的流程图如下:

iOS 网络请求

4.请说明并比较以下类:URLSessionTask,URLSessionDataTask,URLSessionUploadTask,URLSessionDownloadTask

关键词:#URLSession

  • URLSessionTask 是个抽象类。通过实现它可以实例化任意网络传输任务,诸如请求、上传、下载任务。它的暂停(cancel)、继续(resume)、终止(suspend)方法有默认实现

  • URLSessionDataTask 负责 HTTP GET 请求。它是 URLSessionTask 的具体实现。一般用于从服务器端获取数据,并存放在内存中。

  • URLSessionUploadTask 负责 HTTP Post/Put 请求。它继承了 URLSessionDataTask。一般用于上传数据。

  • URLSessionDownloadTask 负责下载数据。它是 URLSessionTask 的具体实现。它一般将下载的数据保存在一个临时的文件中;在 cancel 后可将数据保存,并之后继续下载。

它们之间的关系如下图:

5. 什么是 Completion Handler?

关键词:#闭包

Completion Handler 一般用于处理 API 请求之后的返回数据。

当URLSessionTask 结束之后,无论成功或是报错,Completion Handler 一般都会接受 3 个参数:Data, URLResponse,Error,注意这 3 个参数都是 Optional。

在 Swift 中,Completion Handler 必须标明 ​@escaping​。因为它总是在 API 请求之后才执行,也就是说方法已经返回才会涉及 Completion Handler,是个经典的逃逸闭包情况。

6. 代码实战:设计一个方法,给定 API 的网址,返回用户数据

关键词:#URLSessionDataTask

这道题目考察的是 URLSessionDataTask 的基本用法。下面是一种最简单粗暴的写法:


func queryUser(url: String, completion: @escaping (_ user: User?, _ error : Error?) -> Void)) {

  guard let url = URL(string: url) else {
    return
  }

  URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error {
      DispatchQueue.main.async {
        completion(nil, error)
      }
      return
    } else if let data = data, let response = response as? HTTPURLResponse {
       DispatchQueue.main.async {
         completion(convertDataToUser(data), nil)
       }
    } else {
       DispatchQueue.main.async {
         completion(nil, NSError(“invalid response”))
       }
    }
  }.resume()
}

上面的写法有很多问题,其中最主要的是:

  • url 出错处理不当。应该返回错误信息以方便日后调试,而不是应该 return

  • 用 URLSession 的单例不妥。这样每次请求创建一个 dataTask 是一种浪费,同时短时间内多次请求会不必要的造成服务器压力。正确的处理方法应该是每次请求都取消上一次请求(无论有无完成)。

  • 代码重复冗余。代码中多次用到了切换至主线程并调用闭包的过程。实际上我们可以将整个方法扩展为一个类,然后将返回值与成员变量结合起来使用。

除了以上 3 点,我们还可以进一步修正代码,增强其可读性,并完善其逻辑。修改后的代码如下:


enum QueryError: String {
  case InvaldURL = “Invalid URL”,
  case InvalidResponse = “Invalid response”
}

class QueryService {
  typealias QueryResult = (User?, String?) -> Void

  var user: User?
  var errorMessage: String?

  let defaultSession = URLSession(configuration: .default)
  var dataTask: URLSessionDataTask?

  func queryUsers(url: String, completion: @escaping QueryResult) {
    dataTask?.cancel()

    guard let url = URL(string: url) else {
      DispatchQueue.main.async {
        completion(user, QueryError.InvalidURL)
      }
      return   
    }

    dataTask = defaultSession.dataTask(with: url) { [weak self] data, response, error in
      defer {
        self?.dataTask = nil
      }
      if let error = error {
        self?.errorMessage = error.localizedDescription
      } else if let data = data,
          let response = response as? HTTPURLResponse,
          response.statusCode == 200 {
            self?.user = convertDataToUser(data)
      } else {
        self?.errorMessage = QueryError.InvalidResponse
      }

      DispatchQueue.main.async {
        completion(self?.user,self?.errorMessage)
      }
    }.resume()  
  }
}

上面的修改方法主要针对一些硬伤。如果配合 Swift 的面向协议的编程来实现该 API,整个代码会更加灵活。

信息推送

7. iOS 开发中本地消息通知的流程是怎样的?

关键词:#UserNotifications

UserNotifications 框架是苹果针对远程和本地消息通知的框架。其流程主要分 4 步:

1) 注册。通过调用 requestAuthorization 这个方法,通知中心会向用户发送通知许可请求。在弹出的 Alert 中点击同意,即可完成注册。

2) 创建。首先设置信息内容 UNMutableNotificationContent 和触发机制 UNNotificationTrigger ;然后用这两个值来创建 UNNotificationRequest;最后将 request 加入到当前通知中心 UNUserNotificationCenter.current() 中。

3) 推送。这一步就是系统或者远程服务器推送通知。伴随着一声清脆的响声(或自定义的声音),通知对应的 UI 显示到手机界面的过程。

4) 响应。当用户看到通知后,点击进去会有相应的响应选项。设置响应选项是 UNNotificationAction 和 UNNotificationCategory。

加分回答:

远程推送的流程与本地推送大同小异,不同的是第 2 步创建,参数内容和消息创建都在服务器端完成,而不是在本地完成。

8.iOS 开发中远程消息推送的原理是怎样的?

关键词: #APNs Server

回答这道题目的关键在于理清 iOS 系统,App,APNs 服务器,以及 App 对应的客户端之间的关系。具体来说就是:

  1. App 向 iOS 系统申请远程消息推送权限。这与本地消息推送的注册是一样的;

  1. iOS 系统向 APNs(Apple Push Notification Service) 服务器请求手机的 device token,并告诉 App,允许接受推送的通知;

  1. App 将手机的 device token 传给 App 对应的服务器端;

  1. 远程消息由 App 对应的服务器端产生,它会先经过 APNs;

  1. APNs 将远程通知推送给响应手机。

具体的流程图如下:

数据处理

9.iOS 开发中如何实现编码和解码?

关键词: #Encodable #Decodable

编码和解码在 Swift 4 中引入了 Encodable 和 Decodable 这两个协议,而 Codable 是 Encodable 和 Decodable 的合集。在 Swift 中,Enum,Struct,Class 都支持 Codable。一个最简单的使用如下:


enum Gender: String, Codable {
  case Male = “Male”
  case Female = “Female”
}

class User: Codable {
  let name: String
  let age: Int
  let gender: Gender

  init(name: String, age: Int, gender: Gender) {
    (self.name, self.age, self.gender) = (name, age, gender)
  }
}

这样定义完成之后,我们就可以轻易的在 User 及其对应 JSON 数据进行编码和解码,示范代码如下:


let userJsonString = """
{
        "name": "Cook",
        "age": 58,
        "gender": "Male"
}
"""

// 从JSON解码到实例
if let userJSONData = userJsonString.data(using: .utf8) {
  let userDecode = try? JSONDecoder().decode(User.self, from: userJSONData)
}

//从实例编码到JSON
let userEncode = User(name: "Cook", age: 58, gender: Gender.Male)
let userEncodedData = try? JSONEncoder().encode(userEncode)

追问:假如 JSON 的键值和对象的属性名不匹配该怎么办?

可以在对象中定义一个枚举(enum CodingKeys: String, CodingKey),然后将属性和 JSON 中的键值进行关联。

追问:假如 class 中某些属性不支持 Codable 该怎么办?

将支持 Codable 的属性抽离出来定义在父类中,然后在子类中配合枚举(enum CodingKeys),将不支持的 Codable 的属性单独处理。

10.谈谈 iOS 开发中数据持久化的方案

关键词: #plist #Preference #NSKeyedArchiver #CoreData

数据持久化就是将数据保存在硬盘中,这样无论是断网还是重启,我们都可以访问到之前保存的数据。iOS 开发中有以下几种方案:

  • plist。它是一个 XML 文件,会将某些固定类型的数据存放于其中,读写分别通过 contentsOfFile 和 writeToFile 来完成。一般用于保存 App 的基本参数。

  • Preference。它通过 UserDefaults 来完成 key-value 配对保存。如果需要立刻保存,需要调用 synchronize 方法。它会将相关数据保存在同一个 plist 文件下,同样是用于保存 App 的基本参数信息。

  • NSKeyedArchiver。遵循 NSCoding 协议的对象就就可以实现序列化。NSCoding 有两个必须要实现的方法,即父类的归档 initWithCoder 和解档 encodeWithCoder 方法。存储数据通过 NSKeyedArchiver 的工厂方法 archiveRootObject:toFile: 来实现;读取数据通过 NSKeyedUnarchiver 的工厂方法 unarchiveObjectwithFile:来实现。相比于前两者, NSKeyedArchiver 可以任意指定存储的位置和文件名。

  • CoreData。前面几种方法,都是覆盖存储。修改数据要读取整个文件,修改后再覆盖写入,十分不适合大量数据存储。CoreData 就是苹果官方推出的大规模数据持久化的方案。它的基本逻辑类似于 SQL 数据库,每个表为 Entity,然后我们可以添加、读取、修改、删除对象实例。它可以像 SQL 一样提供模糊搜索、过滤搜索、表关联等各种复杂操作。尽管功能强大,它的缺点是学习曲线高,操作复杂。

以上几种方法是 iOS 开发中最为常见的数据持久化方案。除了这些以外,针对大规模数据持久化,我们还可以用 SQLite3、FMDB、Realm 等方法。相比于 CoreData 和其他方案,Realm 以其简便的操作和丰富的功能广受很多开发者青睐。同时大公司诸如 Google 的 Firebase 也有离线数据库功能。其实没有最佳的方案,只有最合适的方案,应该根据实际开发的 App 来挑选合适的持久化方案。

65、iOS开发技术综合指南 本博客全面介绍了iOS开发的各项核心技术与实践方法,涵盖从基础概念、工具使用到高级功能实现的完整知识体系。内容包括Xcode与Interface Builder的使用、Objective-C内存管理机制、UI组件设计与动画效果、Core Data与文件存储、网络请求与GameKit通信、Core Location与MapKit地图集成、AVFoundation音视频处理、推送通知与In-App Purchase实现,并深入讲解了触摸事件、手势识别、UITableView与UIViewController架构 阅读详情

相关推荐

24、iOS开发中的关键技术与实践

本博客介绍了iOS开发中的多项关键技术与实践,涵盖UIAlertView委托处理、Selector的使用、Category扩展、手势识别、定位与地图显示、以及Apple推送通知服务(APNs)的实现方法。通过具体代码示例和操作流程图解,帮助开发者快速掌握iOS开发核心技能,并提供了综合应用案例以实现地图定位与通知功能的整合。

beer8的博客 56

《iOS总结》APP上传步骤(详细版)

1. 在网页https://developer.apple.com/中选择Member Center, 登陆账号, 选择Certificates, Identifiers&Profiles, 选择iOS Apps 中的Identifiers , 进入Identifiers以下的App IDs 选择+号创建, 填写Name, (例如:权世界项目:Class21GDWorldPush), 填写Ex

蜗牛一步一步爬 1094

Swift项目开发实战:MousouLINE源码分析

本文还有配套的精品资源,点击获取 简介:MousouLINE项目基于Swift语言开发,可能是一个应用或工具的代码库,涉及即时通讯和社交网络功能。文章将深入探讨Swift语言的关键特性,并对项目中的UI设计、网络编程、JSON处理、多线程、推送通知、数据库集成、动画效果、第三方库使用、测试和版本控制等关键知识点进行分析,预测可能的技术实现。 1. Swift语言基...

weixin_32251525的博客 1335

【iOS】iOS中简单的网络请求

在完成暑假最后一个项目——仿写苹果原生APP天气预报时,需要进行网络请求,且网络请求在iOS开发中是比较重要的知识点,特学习并记录。

2301_80467753的博客 2388

iOS开发基础资料与实战学习包

自定义视图和动画能够提升应用的交互体验,让界面更加流畅和富有吸引力。CALayer为UIView提供了动画、布局和渲染的核心功能。通过使用CALayer,开发者可以自定义动画效果,甚至创建全动画驱动的用户界面。在这段代码中,创建了一个名为的自定义视图类,它继承自UIView。通过重写layerClass类方法,指定了视图层的具体类型为。通过设置属性,使得每个实例都具有独特的动画效果。定义了一个为背景并为其添加了一个基础动画,让渐变层产生旋转动画。

weixin_34598113的博客 427

iOS开发完整实战指南:初学者的技能提升之路

htmltable {th, td {th {pre {简介:《iOS开发实战》是一本针对初学者的实用指南,旨在提供iOS应用程序开发的全面经验。书中包含大量示例,涵盖从Objective-C和Swift编程语言,Xcode IDE使用,UI设计,到数据处理、网络编程、多媒体处理等关键技能。本书帮助读者通过理论知识与实际操作的结合,快速掌握iOS开发的核心技术。

weixin_42452483的博客 960

极光推送之iOS系统---devicetoken

极光推送之iOS系统---devicetoken

jkhedge的博客 2203

专业iOS编程:从入门到精通

本文将带您深入了解《专业iOS编程》一书,通过本书的章节概览,我们将探讨如何从创建个人图书馆开始,到使用表格视图、Map Kit、Action Views和Alerts,再到国际化应用开发、多媒体运用,以及网络服务的使用、数据处理、应用的集成和生产发布。本书内容全面,是iOS开发者的实用指南。

weixin_35950531的博客 350

iOS远程推送之获取deviceToken

远程推送的原理就是: 1手机或者说苹果自动将用户的UDID 和应用的 AppID发送到APNs,APNs返回一个deviceToken给iOS设备,同一个手机不同的应用会生成不同的deviceToken,同一个手机同一个应用只生成一个deviceToken; 2手机端将deviceToken发送到自己公司的后台服务器,用以保存; 3当后台需要推送消息给用户时,服务器将需要推送的消息和devic

liujingran_2015的博客 1万+

如何构建高质量的 QA 问答知识库

NLP 技术落地最普遍的场景就是智能客服,如阿里的”小蜜“,京东的“JIMI”等等。NLP 技术也广泛应用于搜索系统。无论是“智能客服”,还是“搜索系统”,构建的前提是拥有“高质量的QA知识库”。今天聊聊“如何构建高质量QA知识库。”。 历史对话数据分布分析 基于公司现有系统积累的大规模对话文本数据,需要对文本数据进行归类处理,分析每个部分数据的占比,挖掘出有价值的文本通过 NLP 相关技术进行商业价值转化。下文以医疗领域来举例说明,通过输入对象,可以将文本分为客服输入和用户输入两部分。挖掘相关问题,主要从

Jiassheng的博客 2151

AUTOSAR FEE 换页机制深度解析:从原理到实现逻辑

​​没有磨损均衡的EEPROM模拟,如同在沙地上建造城堡​​ ——AUTOSAR存储系统设计箴言

汽车电子软件领域知识分享 1337

iOS推送通知

推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的。一般说来,当要显示消息或下载数据的时候,通知是由远程服务器(程序的提供者)发送,然后通过苹果的推送通知服务(Apple Push Notification Service,简称APNS)推送到设备的程序上。直接由应用程序(程序中写入对应代码)给用户发出通知本地通知需要用到一个重要的类:本地通知的实现步骤:(1)创建本地通知。

旭日的博客 4285

CAN收发器TJA1145A休眠唤醒应用

TJA1145的唤醒工作原理主要依赖于其内部的唤醒机制和外部硬件的配合,主要涉及低功耗状态、选择性唤醒功能。TJA1145是一款CAN收发器,它支持多种工作模式,包括NormalStandbySleep等。在这些模式中,Sleep模式是最低功耗状态,而Normal模式则是最活跃的状态,其中Standby模式处于两者之间,允许一定的功能操作但功耗较低。TJA1145可以通过接收特定的唤醒源从Sleep或Standby模式唤醒到Standby或Normal模式。唤醒源的检测与处理。

radix关于mcu的博客,持续更新中... 5949

iOS知识树,知识目录(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)

本文旨在总结iOS知识网络,该知识网络罗列出常见UIKit,Foundation的对象特点和一些使用经验;文本编辑采用树的形式,对知识点进行罗列,并标注一些使用经验(★)希望对初学者有用或给一些解决疑难杂症者提供思路;某些知识点会深入探讨;通过总结希望站在一个较高平台的角度全观Objective-C。知识树中有些是原创文章,有些则是转载网络上iOS大神的文章。笔者会尽量详细的介绍各个知识点。当然一

申冠华的博客 4532

Docker 与容器技术的未来:从 OCI 标准到 eBPF 的演进

OCI 的核心目标是创建一个开放的、厂商中立的容器技术标准。这意味着,只要一个容器镜像符合 OCI 镜像格式规范,它就可以在任何符合 OCI 运行时规范的容器运行时上运行。eBPF 是一种革命性的技术,它允许在 Linux 内核中安全地运行沙盒程序,而无需修改内核源代码或加载内核模块。这些程序可以注册到内核中的各种事件点(如网络包到达、系统调用、函数调用/返回),并在事件发生时执行自定义逻辑。核心思想是:在不将数据复制到用户空间的情况下,程序可以直接在内核中处理数据,极大地提高了效率和性能。

专栏 1382

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3754

iOS推送测试实战:SmartPush快速上手与问题解决指南

还在为iOS推送测试烦恼吗?SmartPush这款macOS工具能帮你轻松搞定推送调试难题。作为一名iOS开发者,我深知推送测试的痛点,今天就来分享这套实用技巧。 ## 为什么你的推送总是失败? **常见误区一:证书配置不当** 很多开发者在使用SmartPush时,第一个遇到的障碍就是证书问题。推送证书从苹果开发者中心下载后,需要正确导入到Keychain中。SmartPush支持两种便捷

gitblog_00249的博客 1028

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 472

小米AI团队揭秘:MiMo-V2-Flash-Base的27T tokens训练工程实践

**MiMo-V2-Flash** 是小米AI团队推出的革命性混合专家(MoE)语言模型,拥有3090亿总参数和150亿激活参数,专为高速推理和智能体工作流设计。本文将深入解析这个27T tokens训练工程实践背后的技术细节,为初学者和开发者提供完整的指南。🚀 ## 🌟 项目核心亮点 **MiMo-V2-Flash-Base** 在27T tokens的庞大数据集上训练完成,实现了业界领

gitblog_01186的博客 968

Verilog数字钟

使用Verilog语言进行的数字钟的编写,FPGA开发板亲测正常 大学生一个,第一次自己做的东西,写出来分享在这里插入代码片一下,有不对的地方请大家批评指正。 这次的做的题是:设计一个数字钟,该数字钟能进行正常的时,分计时功能,且能对数字钟的时间进行调整。 该数字钟有3个按键,按键1为功能键,用于数字钟在“正常计时”,“时调整”,“分调整”这三个功能之间切换;按键2,3用于调整时间,仅当数字钟处于...

bin_bin_bun的博客 6149

WinClaw安全实战 02|五层纵深防护体系全解析:从原理到实操,打造零风险AI智能体

2026年AI智能体爆发式普及,OpenClaw以27.3万GitHub星标成为现象级工具,但恶意Skill投毒、提示词注入、数据外泄等安全事故频发,国家互联网应急中心、工信部等多部门接连发布风险警示。威努特基于国家关键信息基础设施安全防护经验,打造WinClaw安全版AI智能体,其核心竞争力在于**五层纵深防护体系**。本文从安全痛点切入,通过真实事故案例揭示风险本质,全景解构五层防护的架构设计与技术原理,逐层拆解身份认证、安装审查、消息拦截、执行约束、监控审计的实现逻辑,搭配20+实操演示、对比表格

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 495

安卓推送这件小事

今天来讲讲推送这件小事,事虽小,要做好却不容易。推送难,难于上青天。我们在讨论 Android 手机上的推送时,大多数情况是在说集成第三方推送,因为即使是像微信这样的大厂,也需要厂商加到启动白名单里才能保持在线。

weixin_67271870的博客 1242

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

终极iOS推送注册方案:Orbiter完全指南——告别SDK臃肿,轻松集成Urban Airship与Helios

Orbiter是一款轻量级iOS推送注册框架,专为希望简化Urban Airship和Helios推送服务集成的开发者设计。通过Orbiter,你无需引入庞大的SDK即可实现设备令牌注册与管理,显著减少应用体积并提升性能。本文将带你全面掌握这款工具的核心功能与使用方法。 ## 🚀 为什么选择Orbiter?解决SDK集成3大痛点 传统推送服务集成往往需要引入完整SDK,这会带来三个主要问题:

gitblog_00106的博客 1027

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NormaCore 完全指南:一套平台如何统一物理机器人开发、数据采集与AI推理部署

NormaCore 是一个面向物理机器人开发的开源平台(Physical Operations Platform),把机器人硬件、实时数据采集与 AI 推理部署统一在同一个仓库中。它包含一台可 3D 打印的 7+1 自由度机械臂 ElRobot、单二进制实时控制与数据收集平台 Station,以及基于 SmolVLA 的视觉-语言-动作模型训练与部署工具链,让你从"打印机械臂"到"跑通自己的模仿学

gitblog_00751的博客 942

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

EverMemOS 记忆原理指南:LoCoMo 93%准确率是怎么跑出来的,三步上手

做过 Agent 的人都撞过同一堵墙:换个会话,AI 就忘了你上周说过的偏好,长篇对话里前文的结论也找不回来。EverMemOS 就是冲着这个问题去的——它是一个本地优先的智能记忆系统,把对话写成可检索的记忆,在 LoCoMo 基准上拿到 93.05% 准确率。 ## 从"存进来→理清楚→找得到"看 EverMemOS 记忆检索流程 EverMemOS 的记忆管理可以拆成三步:先存进来,再理清

gitblog_00156的博客 904

突破iOS技术壁垒:新技术在iOS开发中的应用探索

用户在不同iOS设备上使用应用时,借助云存储服务,如iCloud,应用数据可实时同步,如文档编辑应用,用户在iPhone上编辑的文档,在iPad或Mac上能继续编辑,无需手动传输,提升了用户使用应用的连贯性。在游戏领域,VR和AR游戏为玩家带来身临其境的游戏体验,如基于位置的AR游戏,玩家可在现实世界中探索、战斗,打破了虚拟与现实的界限,拓展了iOS游戏开发的边界,吸引更多用户参与其中。随着新技术不断涌现,它们为突破这些壁垒提供了契机,让开发者能在iOS开发中开辟新路径,提升应用的质量与用户体验。

2501_91540223的博客 644
上一篇: springboot基础篇—SpringBoot 配置
下一篇: 一文读懂”JVM内存结构““Java内存模型““Java对象模型“
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值