Search 浏览器如何静默自我更新带 Developer ID 签名校验的更新器全解析【免费下载链接】SearchA small, fast WebKit browser for macOS, by Office Commun.项目地址: https://gitcode.com/gh_mirrors/search59/SearchSearch 是一款运行在 macOS 上的轻量 WebKit 浏览器约 3 MB由设计工作室 Office Commun 打造。它内置了一个静默自我更新机制每天在后台检查一次新版本静默下载更新包并通过 SHA256 哈希与 Developer ID 签名校验确认来源可信后悄悄替换到原安装位置——下次启动即生效全程不打断你正在浏览的页面。本文带你完整拆解这套带 Developer ID 签名校验的更新器是如何工作的。没有框架、没有守护进程一个 JSON 文件搞定一切传统 macOS 应用的自动更新往往依赖第三方更新框架或常驻后台的守护进程。Search 的更新器反其道而行源码注释把立场写得很直白Updater.swift❌ 不用任何更新框架不运行任何后台守护进程✅ 只在下载页旁边放一个小小的appcast.json文件记录最新版本号、ZIP 包地址、SHA256 校验值✅ 每天读一次、用户手动点检查时再读一次若文件里提到的构建比当前更新就把对应的 ZIP静默下载、检查、放进应用所在目录下次打开时就是新版本✅ 永远不会自己重启应用——你正在读的页面不会因为浏览器想变新而被中断这是Chrome 的思路没有 Chrome 的机器。检查节奏一天一次开着就每小时看一次自动检查由 checkIfDue 控制规则很克制场景行为每次启动距上次检查超过20 小时才真正去读 feed否则跳过应用常驻运行挂一个每小时触发一次的计时器容忍 5 分钟防止开着浏览器一周就永远不检查手动触发设置 › 关于 里有Check now按钮点一下立即检查![说明] 每次检查完都会记录时间在设置页显示X 前检查过——每天自动一次Settings.swift。下载前的三道安全闸门 在真正下载 ZIP 之前更新器会先对 feed 里的地址做严格把关link只接受 HTTPS唯一的例外是测试构建通过环境变量SEARCH_FEED指向自己的测试 feed正式版无论怎么启动都只认官网 feed同域校验ZIP 与 DMG 的地址必须和 feed 本身在同一个主机上——即使 feed 主机被攻陷或 DNS 被劫持它也无法把去这里下载的指引指到别的地址缺校验值即拒绝build.sh发布时一定会写入 SHA256所以一个缺少校验和的 feed 会被当作不是我们的 feed直接拒收核心环节Developer ID 签名校验拿到 ZIP 后Swap.install 会依次执行下载 → 比对哈希 → 用ditto解压 → 签名校验 → 替换任何一步失败都整体放弃。签名校验verify是整套机制的信任基石是同一个应用新包的CFBundleIdentifier必须与当前运行的 Search 完全一致确实更新新包的构建号build number必须严格大于当前版本防止回滚更新严格签名检查用SecStaticCodeCheckValidity执行kSecCSStrictValidate | kSecCSCheckAllArchitectures | kSecCSCheckNestedCode——对每个架构、包括所有嵌套代码做严格验证证书链必须落在 Apple要求串developerID要求证书链以Apple 根证书为锚点、经过 Apple 的Developer ID 中间机构、叶子为 Developer ID Application 证书且subject.OU必须等于正在运行的这个应用的 Team ID源码里有一句很关键的话从签名里读出的 Team ID 只是证书自己声称的东西而任何人都能造一张那样声称的证书——所以必须走 Apple 锚点的完整链校验而不是只读 Team ID。自编译版本永远不会被自动更新自己swift build出来的构建是 ad-hoc 签名没有 Team ID更新器会直接以unsignedHere拒绝——一个无法与任何别的东西区分开的应用绝不接受换壳。原子替换两次重命名且绝不自动重启 通过全部检查后替换swap只靠同一磁盘卷上的两次 rename把当前的Search.app改名为Search.app.old旁路暂存把新包 rename 到正式位置若第二步失败立即撤销第一步应用原封不动几个精妙之处rename 而非复制同卷操作几乎是瞬时且原子的正在运行的进程不受影响——内核会跟着 rename 走旧版本继续从.old运行且它的签名身份没变钥匙串项对它依然有效更新器只删除自己产生的东西临时目录和那个.old包。.old的清理sweep只在退出时、以及下次启动时应对上次非正常退出进行且会先确认它确实是本应用才动手你的数据一个字都不会碰更新器有意放过了一切用户数据Updater.swift 注释~/Library/Application Support/Search里的会话、历史、书签、隐藏元素 →不读、不搬、不重写com.officecommun.search的默认设置、钥匙串 →原封不动新旧包保持相同的 bundle id 和签名身份因此旧构建存进钥匙串的密码新构建开箱即读换用新版本的时机完全由你决定要么下次自然启动生效要么在设置里点Relaunch now实现上用一个 shell 等待本进程退出后再open应用relaunch失败兜底与用户控制权情况更新器的应对安装目录不可写如只读挂载切换为offered状态在应用内提示新版本已发布附 DMG 下载按钮——和第一次安装一样设置中关闭Install updates on its ownSettings.swift默认开启关掉后更新器只告知Search x.x 已发布——在设置里等你手动点 Installfeed 声明的最低系统版本高于本机该版本对你不算更新直接不展示发布侧三个文件如何严丝合缝配对更新能静默成立靠的是发布流水线的配合build.sh产出Search.dmg给人Search.zip给更新器并同时生成appcast.json——版本、构建号、两个下载地址、ZIP 的 SHA256、更新说明、最低系统版本一个字段不少publish.sh把这三个文件原样拷到官网目录文件名永不改变所以站点链接、更新器的 feed 地址都永远有效公证策略DMG 会被公证并 staple首次打开即通过 GatekeeperZIP 则交给更新器自己把关——哈希 签名校验就是它的 Gatekeeperbuild.sh 注释小结Search 的更新器是小而自洽的典范值得每个做 macOS 应用的人参考环节做法换来什么检查一天一次 常驻每小时一次不打扰、不漏查传输单文件 JSON feedHTTPS 同域无劫持面信任SHA256 Developer ID 全链严格签名 Team 匹配换壳攻击不成立替换同卷两次原子 rename失败回滚应用永不损坏数据只动 bundle不碰设置与钥匙串密码、历史无缝继承控制权从不自动重启关自动安装则只提示用户始终在方向盘后想深入了解更新相关的安全边界比如更新通道本身属于漏洞报告范围可以阅读 SECURITY.md整体架构与设计取舍则见 README.md。【免费下载链接】SearchA small, fast WebKit browser for macOS, by Office Commun.项目地址: https://gitcode.com/gh_mirrors/search59/Search创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
DeskcommCRM深度评测:桌面端客户管理与销售管道一体化实战 这两年我把市面上主流的客户管理系统基本都试用过一轮,从纯在线SaaS到需要自己部署的开源方案都有接触。最近团队内部搭建客户信息库的时候,我又把DeskcommCRM翻出来做了深度使用,算是目前少数让我觉得“能真正常驻桌面端干活”的CRM系统。De… · 2026/9/26 22:00:54
Atlas 300V 24G推理卡部署YOLOv5实战:从模型转换到性能调优 在AI推理这个圈子里,Atlas这个词越来越多地出现在边缘设备和服务器部署方案里。我最早接触到它,是因为一个安防项目需要在设备端跑YOLOv5做实时检测,当时对比了一圈硬件,最后锁定了华为的Atlas 300V 24G。那段时间几乎是天天泡在文… · 2026/9/26 22:00:54
seo网站优化知识性能优化 建站报价低背后隐藏的SEO陷阱:懂这5点安全优化才不亏 域名服务器配置一塌糊涂,SEO优化做得再花哨也是白搭。很多站长拿到建站报价单,看到几千块的价格就签了字,结果网站上线后不仅搜索引擎收录慢,还频繁遭遇恶意攻击。其实,… · 2026/9/26 22:34:23
WinDbg(x86)实战:32位崩溃转储分析从误区到命令链 简介:WinDbg(x86)是微软推出的32位系统调试工具,主要面向需要排查蓝屏崩溃问题的开发者与系统管理员。它通过加载内存转储文件,解析停止代码、调用堆栈与活动进程信息,配合 !analyze -v 、 k 、 lm 等命令,可快速… · 2026/9/26 22:34:11
DeskcommCRM实操指南:从坐席工作台到客户数据闭环的落地经验 1. 一个被Excel和IM拖垮的销售团队,逼出了DeskcommCRM这类产品先讲个真实场景。我前几年接触过一个三十来人的销售团队,每天早上晨会,销售们要轮流报当天计划,主管要根据“印象”分配线索,月底统计业绩靠的是销售自己报… · 2026/9/26 22:34:11
Redis内核解析:从零拆解ae事件驱动框架与事件循环 聊到Redis的内核解析,很多人第一反应是跳表、压缩列表、字典这些数据结构,但真正让Redis在单线程模型下还能扛住十万级QPS的,其实是藏在ae.c/ae.h里那套自研的事件驱动框架。这套框架跑在每次命令处理之前和之后,是Redis一切网络I… · 2026/9/26 22:34:04
MSVCP140D.dll缺失怎么修复?从Debug DLL真相到完整排查流程 "由于找不到MSVCP140D.dll,无法继续执行代码"——这个报错弹窗我一年至少撞上二十次,有读者截图求助的,也有朋友拎着笔记本上门让我修的。每次看到MSVCP140D.dll这个名字,我都知道对方多半已经被网上那些"下载DLL放… · 2026/9/26 22:33:58
Blender AI建模插件实战:从AI生成到可编辑网格与批量导出 简介:专为Adobe Illustrator设计的3D设计增强插件,面向平面设计师、插画师及UI创作者,解决AI原生3D能力不足、需频繁切换软件的问题。它提供实时预览、丰富材质库、自定义形状、精细的光照阴影控制和多种导出格式,帮助用户将二维设… · 2026/9/26 22:33:52
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46