利用AI把旧iPad变成电子相框,自动读取NAS照片

家里的照片越存越多,统一存进 NAS 备份之后,平时却很少专门打开来看。

手边刚好有一台闲置多年的 iPad 4,Retina 屏幕显示效果依然不错,我就琢磨着把它支在书桌或电视柜上,专门用来轮播 NAS 里的家庭照片。

真正动手时才发现现成的方案不多:老设备停留在 iOS 8,不仅应用商店里早没了兼容软件,旧系统也不支持如今 NAS 默认的 SMB2/SMB3 共享协议。

而且电子相框需要常年插着电源摆在桌上,如果不管夜间息屏和电池过充,屏幕背光和老电池都撑不了太久。

于是,前阵子,我干脆朝 Codex 许愿,从头让它搓了一套专门面向越狱旧 iPad 的开源电子相框项目「NAS Photo Frame」(中文界面叫「NAS 相框」)。

从内嵌 libsmb2 读取局域网共享、1GB 内存下的大图降采样解码,到控制电池在 50%~70% 之间充放电的后台守护进程,再到跑在 NAS 上的 Docker 网页管理端,整套代码和工程脚本都是我带着 AI 一步步写出来并调通的。

通过局域网管理页面查看 iPad 电量、照片索引进度与本地缓存占用

▲ 通过局域网管理页面查看 iPad 电量、照片索引进度与本地缓存占用

支持位置地名显示,照片随机展示,自然过渡切换,交叉淡入淡出,平移与 Ken Burns 动态效果,反正相册该有的基本功能都有了。

随后,我去淘宝买了个相框,把旧 iPad 套了进去,最终就是下面这张照片的样子。

目前我已经把这个项目整理开源到了 GitHub 上,想用的话,全程都可以直接让你的 AI 帮你搞定。

Part 1

四个关键设计

为了让一台十年前的老 iPad 能稳定、免维护地在桌面上常年运行,项目重点处理了四个核心环节:

1. 不开 SMB1,直连读取 NAS 并支持断网缓存播放:老款 iOS 原生网络栈不支持现代文件共享协议,项目直接在应用内嵌入了开源的 libsmb2,通过 SMB2/SMB3 递归扫描指定目录下的 JPG、PNG、GIF、BMP 和 TIFF 照片,将元数据存入本地 SQLite 索引,并在遇到路由器重启或 NAS 临时离线时自动切换为循环播放本地已缓存的照片。

2. 针对 1GB 内存做后台降采样解码:iPad 4 只有 1GB 运行内存,如果把相机或手机拍的几千万像素原图直接完整解码进内存,播不了几张就会闪退,因此程序会在后台队列里用 ImageIO 按屏幕实际像素尺寸做降采样,主线程只负责画面切换与淡入淡出动效。

3. 硬件级定时唤醒与夜间自动息屏:旧 iPad 进入深度睡眠后 Wi-Fi 会断开,很难只靠外部网络指令唤醒,项目内置的 PFDisplayScheduler 守护进程默认每天 22:00 自动锁屏息屏,并在次日 06:59:30 通过 IOKit 电源管理接口提前半分钟唤醒硬件,07:00 准时解锁屏幕、恢复设定亮度并打开相框。

4. 50%~70% 电量滞回控制:为了减轻长期插电对老电池的压力,PFChargeLimiter 守护进程会直接读写底层电源管理服务,当电量充到 70% 及以上时自动停止向电池充电,等电量自然回落到 50% 及以下时再恢复充电,处于 51%~69% 之间则保持原有状态以避免频繁启停,也不用担心电池鼓包爆炸。

网页管理端支持远程锁屏唤醒、调整定时计划与充电阈值,以及修改 NAS 相册路径

▲ 网页管理端支持远程锁屏唤醒、调整定时计划与充电阈值,以及修改 NAS 相册路径

日常播放时界面为纯黑底色全屏展示,支持顺序或随机轮播、超宽照片缓慢平移与小幅缩放(Ken Burns 动效)。

手指单击屏幕或向左滑可切到下一张,向右滑返回上一张,长按屏幕 1.5 秒即可呼出应用内的设置页面。

照片左下角还可以读取 EXIF 信息显示拍摄日期与 GPS 地点,优先调用系统在线反查,旧系统接口不可用时会自动回退到内置的 GeoNames 离线地名库,匹配 50 公里内最近的城市并标注「附近」。

Part 2

iPad 与 NAS 端准备

先简单说说准备环节。

推荐的硬件与系统组合是 iPad 4(armv7 架构)搭配 iOS 8.4.1 永久越狱(Untethered Jailbreak),工程最低编译目标为 iOS 8.0。

之所以优先选 iOS 8.4.1 而不是最终版的 iOS 10.3.3,一方面是因为 1GB 内存跑 iOS 8 的系统常驻开销更低,另一方面是永久越狱在遇到停电重启后依然能保持越狱状态和后台守护进程,不需要人工重新引导。

在配置 iPad 之前,最好先在 NAS 上新建一个专用账户(例如 photo-frame),仅勾选照片目录的只读权限,并开启 SMB2/SMB3 与 NTLMSSP 用户名密码认证。

独立账户,这样做会安全一些。

相框配置需要把 NAS 地址、共享文件夹名和子目录填写在应用里。

三个字段的具体填法如下:

✦ NAS 服务器:填写固定的局域网 IPv4 地址(如 192.168.1.10),避免老系统解析局域网主机名不稳定。

✦ SMB 共享名:只填 NAS 控制面板里的共享名称(如 Photos),不要带 smb:// 前缀或 IP 地址。

✦ 照片子目录:填写共享文件夹内部的相对路径(如 Family/Album),如果要直接播放整个共享根目录则留空。

要是搞不定,直接问你的 AI agent ,让它帮你填也行。

具体步骤,请看下一部分。

Part 3

使用 AI 完成全套工作

从旧 iPad 降级越狱、提取旧版 iOS 8 SDK 编译打包,到配置 SSH 与写入相框参数,全流程都可以直接交给 Claude Code、Codex 或 WorkBuddy 等 AI 自动处理。

第一步:iPad 降级与越狱

苹果至今仍在为 iPad 4 等 32 位设备签发 iOS 8.4.1 的 OTA 验证,哪怕手里的 iPad 已经升到了 iOS 10.3.3,也可以直接用数据线连上 Mac,把下面这段话发给你的 AI:

我用 USB 数据线连接了一台旧 iPad 4,请使用开源的 Legacy iOS Kit(https://github.com/LukeZGD/Legacy-iOS-Kit)帮我将它降级到 iOS 8.4.1 并开启永久越狱(Untethered Jailbreak),并在需要我按机身按键进入 DFU 模式时提醒我。

你的 AI 会自动在 Mac 上拉取脚本、安装依赖并启动刷机流程,你只需要在它提示时按机身电源键和 Home 键进入 DFU 模式。

刷机激活后,在 iPad 桌面的 Cydia 里搜索安装 OpenSSH,再进系统设置关闭锁屏密码、把「通用 → 自动锁定」设为「永不」即可。

第二步:编译、安装并写好相框配置

由于现代 Xcode 移除了 32 位 iOS 8 的系统链接库,先从 Apple Developer Downloads 下载好官方的 Xcode_6.4.dmg(例如放在 ~/Downloads/Xcode_6.4.dmg),然后把下面这段提示词里的设备 IP 和 NAS 信息改成你自己的发给你的 AI:

请克隆 https://github.com/nani-kun/NASPhotoFrame 仓库并阅读文档,帮我配好 Theos 与 iPhoneOS8.4.sdk(镜像在 ~/Downloads/Xcode_6.4.dmg),编译并安装到我的 iPad(IP:192.168.1.xxx,root 默认密码:alpine)。

安装后请直接通过 SSH 调用设备上的命令行工具帮我写好配置并唤醒相框:
– NAS 地址:192.168.1.10,共享名:Photos,子目录:Family/Album
– SMB 账号:photo-frame,密码:你的只读密码
– 每天 07:00 唤醒、22:00 息屏,亮度 80%,开启 50%~70% 充电保护

上面的咒语中需要填写 iPad 的局域网地址,得改成你实际的,这个地址可以去 iPad 的 Wi-Fi 信息中查看,也可以看路由器后台页面。

发送后,喝杯咖啡慢慢等。

第三步:部署局域网网页管理端(可选)

如果希望平时在浏览器里查看 iPad 电量、缓存进度,或者随时点按钮修改相册目录和作息时间,可以再发一句话让你的 AI 把 nas-manager 部署起来:

请按 docs/NAS_MANAGER.md 帮我在 NAS 上(NAS IP:192.168.1.xxx,SSH 用户名xxx,密码让我来输入)用 Docker 部署 nas-manager 管理页面(iPad IP:192.168.1.xxx),自动生成管理员密码并把容器生成的 SSH 公钥配进 iPad,完成后把访问地址和密码发给我。

记得改一下上面咒语中的地址和 SSH 用户名。

部署完成后,在局域网浏览器打开 http://部署机IP:8787,输入账号密码就能看到完整的状态监控与控制面板。

Part 4

日常使用注意事项

在长期摆放使用过程中,有几个细节需要注意:

1. 状态栏闪电图标显示:老版本 iOS 在后台切断充电后,屏幕右上角的闪电图标可能依然不会消失,判断电池是否真正停充可以直接看网页管理端显示的充电状态。

2. 临时充满电带出门:如果临时需要把 iPad 充满电带出门,直接在网页管理端关闭「充电保护」并保存即可恢复正常充电。

3. 照片格式兼容性:目前扫描器支持 JPG、JPEG、PNG、GIF、BMP 和 TIFF 格式,暂不包含 HEIC 和视频文件;如果手机备份到 NAS 的相册以 HEIC 为主,可以先准备一个导出为 JPG 的目录专门供相框读取。

4. 锁屏密码与局域网安全:定时唤醒后自动进入相框需要 iPad 关闭锁屏密码,建议这台旧设备不要登录主力 Apple ID,同时将旧 iPad 和默认未开启 HTTPS 的 nas-manager 仅放在受信任的家庭局域网内使用,不要暴露到公网。

5. 开源协议:项目自有代码采用 MIT 协议开源,内嵌的 libsmb2 与 GeoNames 离线城市数据分别遵循 LGPL-2.1 与 CC BY 4.0 协议。

Part 5

最后

很多人折腾 NAS 的终极形态,往往是给几万张照片存储进去,平时根本想不起来看。

而抽屉里那台十年前买来的老 iPad,二手平台估价两位数还不够顺丰到付,拿来盖泡面嫌沉,换不锈钢盆人家都嫌芯片太老。

以前想把这种古董设备改造成相框,光是折腾失效的旧系统依赖和交叉编译,就能让人在老论坛里耗掉整个周末。

现在,把底层代码和部署脚本全交给 AI 搞定,给老设备换个活法,也就是几句话的事。

同志们,时代变了,许愿也能成真了。

欢迎来到新世界。

相关链接:

✦ GitHub 仓库:https://github.com/nani-kun/NASPhotoFrame

✦ 构建与安装指南:https://github.com/nani-kun/NASPhotoFrame/blob/main/docs/BUILDING.md

✦ 局域网管理服务指南:https://github.com/nani-kun/NASPhotoFrame/blob/main/docs/NAS_MANAGER.md

封面:Gemini

By nanikun