那个总被忘记的瞬间
上个月参加朋友聚会,有人想看我拍的猫咪照片。
我解锁手机,打开照片 App,找到那张照片递过去。对方刚看了一眼,手指一滑——下一张是我和女朋友的亲密合照,再一滑——是身份证照片,再一滑——是……
「等等!别滑了!」我几乎是抢回手机。
事后我才想起来:这些照片我明明应该提前藏到「隐藏相册」里的。但问题是,每次拍完照片都要记得手动隐藏,这本身就是个反人性的操作。 人总会忘记,而忘记的代价就是尴尬。
系统相册的隐藏相册确实支持了 Face ID 保护,这很好。但核心问题依然存在:你需要先记得把照片放进去。
我尝试过各种方案:
每次拍完照立刻隐藏——但总会忘记
把私密照片存到「文件」App 的某个角落——找起来太麻烦,而且预览体验很差
用云相册的「私密空间」——还是要上传到别人的服务器,不放心
下载各种「隐私相册」App——要么广告太多,要么设计太丑,要么已经停止维护
最后我意识到:我需要的不是一个「需要记得隐藏」的相册,而是一个「默认就私密」的相册。
于是某个周末,我打开了 Xcode......
▍从 Face ID 保护开始
最开始我只想解决一个问题:给相册加一把锁。
听起来简单,但 iOS 开发里坑不少:
坑 :生物识别的权限处理
用户可能拒绝 Face ID 权限,也可能设备不支持。不能因为这些情况就让 App 无法使用。
我的做法是:优先尝试生物识别,如果不支持或用户拒绝,允许使用设备密码作为 fallback。这样既保证了安全性,又不至于把用户挡在门外。

▍后台模糊:防止偷瞄的最后一道防线
应用进入后台时,系统会截一张图显示在多任务界面。如果这时候显示的是相册内容,旁边的人一眼就能看到。
我花了很长时间调试 UIApplication.didEnterBackgroundNotification 的时机,确保在截图发生前就显示模糊蒙版。
技术细节:
使用 UIVisualEffectView 实现模糊效果,而不是截图方式,避免内存峰值
监听 didEnterBackgroundNotification 和 willEnterForegroundNotification,确保切换流畅
模糊强度可调节,兼顾隐私和美观

▍WiFi 传输是个意外收获
解决了隐私保护后,我又遇到了新问题:怎么把电脑里的照片批量传到 Luminara?
数据线 + iTunes?太麻烦了。
AirDrop?不支持 Windows,而且只能一张张传。
微信?压缩画质不说,还得先上传到腾讯的服务器。
我突然想到:为什么不直接在 App 里开一个 HTTP 服务器?
同一 WiFi 下,电脑浏览器访问手机的 IP 地址,就能直接上传下载。不需要安装任何软件,不需要注册账号,原画质传输。
但这个功能的开发比想象中复杂:
挑战 1:大文件传输的内存问题
如果一次性把几个 G 的视频读入内存,App 会直接崩溃。
解决方案是流式传输:
上传时,HTTP body 直接写入临时文件,再边读取边解析 multipart 数据
下载时,256KB 分块读取,边读边发送到 socket
支持 HTTP Range 请求,实现断点续传
这样即使传输 4K 视频,内存占用也能控制在几十 MB。
挑战 2:multipart 解析的复杂性
浏览器上传文件时,数据格式是 multipart/form-data。文件字段和文本字段(如 albumId、lastModified)可能跨越多个 TCP 包。
我设计了一个状态机来处理:
inPartHeaders:解析 part 的 headers
inFileContent:流式写入文件内容
inTextContent:累积文本字段内容
最头疼的是边界情况:文件名包含特殊字符(如换行符)会导致 HTTP 响应头被截断。最后通过 RFC 5987 编码才解决。

▍备份与恢复:数据安全无忧
随着照片越来越多,我开始担心一个问题:如果手机丢了或损坏了,这些照片怎么办?
iCloud 备份?那意味着照片要上传到苹果的服务器,违背了「本地存储」的初衷。
我在设置界面加入了独立的备份与恢复功能:
一键导出:在设置中点击「备份」,将所有相册、照片、视频、缩略图导出到一个文件夹(包含 albums.json 和 Media 目录),通过系统分享保存到文件App中
实况照片处理:Live Photo 的图片和视频部分分别保存,确保恢复后能正确配对
元数据保留:拍摄时间、地点、相册结构等信息完整保留在 albums.json 中
一键恢复:选择备份文件夹,所有数据原样还原到新设备
这样即使换手机,也能在几分钟内完成数据迁移,完全不需要依赖云服务。

▍重复照片检测:释放存储空间
用了一段时间后,我发现手机里有很多重复照片:
同一张照片从微信保存了多次
备份恢复后重复导入
截图分享后忘记删除原图
这些重复照片散落在不同的相册里,手动查找非常麻烦。
Luminara 的重复检测功能,让你可以在应用内快速找到并清理重复照片:
基于图像相似度算法:即使分辨率不同、轻微编辑过的照片也能识别
支持调节相似度阈值:根据需要调整检测敏感度
一键批量清理:选中重复照片后一键删除,释放存储空间
按相册筛选:可以选择只在特定相册中查找重复照片
这个功能让我清理出了冗余的空间。

▍照片地图:按地点回忆旅行
系统相册其实也有地图功能,但入口隐藏很深,大量照片时在地图上堆叠成一团,根本无法直观看到拍摄地点的分布。
Luminara 把地图作为一级入口,与列表视图并列:
直观展示:地图视图与列表视图随时切换,不需要层层点击
按相册筛选:只看某个旅行相册的照片在地图上的分布
更好的聚类:大量照片时也能清晰呈现地理分布,不会堆叠成一团
时间轴结合:可以在地图上按时间顺序浏览,重温旅行路线
这个功能特别适合喜欢旅行的用户。看着地图上一个个标记,就像重新走了一遍那些地方。

▍三种相册视图模式:随心切换
Luminara 提供三种视图模式,满足不同场景需求:
卡片视图:以网格形式展示照片缩略图,适合快速浏览和查找
列表视图:展示照片详情(名称、大小、日期),适合精细管理
时间轴视图:按时间顺序展示照片,重温美好回忆
每种视图都支持滑动手势快速切换,操作流畅自然。



▍媒体查看器:沉浸式体验
打开任意照片或视频,进入沉浸式查看模式:
全屏展示:自动隐藏界面元素,专注内容本身
手势操作:左右滑动切换、双指缩放、长按保存
信息面板:显示照片的详细信息(拍摄时间、地点、大小等)
Live Photo 播放:长按播放动态效果,松手恢复静止


▍Live Photo 与更多细节
除了核心功能,Luminara 还支持:
Live Photo 完整支持:保留动态效果,原生支持导出Live Photo
三种视图模式:卡片视图、列表视图、时间轴视图,满足不同场景
多语言支持:中文、英文等语言切换
深色模式:适配 iOS 深色主题,夜间使用更舒适
图标更换:支持更换应用图标,个性化你的 Luminara
▍与系统相册的关系
很多人问我:Luminara 会取代系统相册吗?
我的答案是:不会,它们是互补的。
系统相册适合:
日常随手拍,快速查看
与 iCloud 同步,多设备访问
系统级分享,发送到其他 App
Luminara 适合:
需要隐私保护的照片:Face ID 解锁、后台模糊、独立存储空间,借手机时不再提心吊胆
创建多个独立相册:工作、旅行、家人、宠物……每个主题一个相册,清晰分类
按地点浏览照片:地图视图直观展示照片分布,重温旅行路线
与电脑传输文件:WiFi 传输功能,无需数据线,原画质批量导入导出
清理重复照片:智能检测相似照片,一键释放存储空间
完整备份与恢复:导出到文件夹保存到电脑,换机时快速还原所有数据
管理 Live Photo:完整保留动态效果,支持导出为视频或静态图片
你可以把 Luminara 当作「私密相册」,而不是系统相册的替代品。
▍Pro 版本与免费版
Luminara 采用免费 + Pro 订阅的模式:
免费版:
创建最多 3 个相册
导入最多 10 张照片/视频
基础浏览和管理功能
Pro 版(订阅制或终身买断):
无限相册数量
无限导入数量
重复照片检测
照片地图功能
更换app图标功能
免费版的功能已经足够体验核心功能,如果觉得好用再考虑升级。
福利
我给派U们准备了10个Luminara兑换码,想要的UU们可以评论“挖到宝了!Luminara 隐私相册!”,后续会将兑换码发放截图公布出来~
下载链接
你的照片,只属于你。
如果你也重视隐私,厌倦了借手机时的尴尬,不妨试试 Luminara。有任何问题或建议,欢迎在评论区留言,我会认真回复每一条反馈。
本文在少数派独家首发,转载请注明出处。
