[{"data":1,"prerenderedAt":445},["ShallowReactive",2],{"navigation_docs":3,"-blog-lockify":173,"-blog-lockify-surround":440},[4,22,29,36,107,138,145,161],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"博客","i-lucide-pen-line","\u002Fblog","0.blog",[10,12,17],{"title":5,"path":7,"stem":11,"icon":6},"0.blog\u002Findex",{"title":13,"path":14,"stem":15,"icon":16},"创建基于 UIKit 的原生 iOS 项目","\u002Fblog\u002Fcreate-uikit-ios-project","0.blog\u002F01.create-uikit-ios-project","i-lucide-app-window",{"title":18,"path":19,"stem":20,"icon":21},"Lockify：把账号和密码留在自己的手机里","\u002Fblog\u002Flockify","0.blog\u002F02.lockify","i-lucide-lock",{"title":23,"path":24,"stem":25,"children":26,"icon":28},"年度总结","\u002Fannual-review","1.annual-review\u002Findex",[27],{"title":23,"path":24,"stem":25,"icon":28},"i-lucide-git-commit",{"title":30,"path":31,"stem":32,"children":33,"icon":35},"故事","\u002Fstories","2.stories\u002Findex",[34],{"title":30,"path":31,"stem":32,"icon":35},"i-lucide-feather",{"title":37,"icon":38,"path":39,"stem":40,"children":41},"Android","i-simple-icons-android","\u002Fandroid","3.android",[42,44,49],{"title":37,"path":39,"stem":43,"icon":38},"3.android\u002Findex",{"title":45,"path":46,"stem":47,"icon":48},"初探Navigation","\u002Fandroid\u002Fcompose-navigation","3.android\u002F01.compose-navigation","i-lucide-route",{"title":50,"icon":51,"path":52,"stem":53,"children":54},"安卓代码加固","i-lucide-shield","\u002Fandroid\u002Fhidden-hardening","3.android\u002F02.hidden-hardening\u002Findex",[55,58,62,67,72,77,82,87,92,97,102],{"title":56,"path":52,"stem":53,"icon":57},"安卓代码加固：总览","i-lucide-map",{"title":59,"path":60,"stem":61,"icon":21},"安卓代码加固（1）：加密DEX","\u002Fandroid\u002Fhidden-hardening\u002Fencrypt-dex","3.android\u002F02.hidden-hardening\u002F01.encrypt-dex",{"title":63,"path":64,"stem":65,"icon":66},"安卓代码加固（2）：Native解密","\u002Fandroid\u002Fhidden-hardening\u002Fnative-decrypt","3.android\u002F02.hidden-hardening\u002F02.native-decrypt","i-lucide-cpu",{"title":68,"path":69,"stem":70,"icon":71},"安卓代码加固（3）：内存加载","\u002Fandroid\u002Fhidden-hardening\u002Fmemory-load","3.android\u002F02.hidden-hardening\u002F03.memory-load","i-lucide-memory-stick",{"title":73,"path":74,"stem":75,"icon":76},"安卓代码加固（4）：指令分发","\u002Fandroid\u002Fhidden-hardening\u002Fopcode-dispatch","3.android\u002F02.hidden-hardening\u002F04.opcode-dispatch","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"安卓代码加固（5）：XOR混淆","\u002Fandroid\u002Fhidden-hardening\u002Fxor-obfuscate","3.android\u002F02.hidden-hardening\u002F05.xor-obfuscate","i-lucide-shuffle",{"title":83,"path":84,"stem":85,"icon":86},"安卓代码加固（6）：密钥外置","\u002Fandroid\u002Fhidden-hardening\u002Fkey-external","3.android\u002F02.hidden-hardening\u002F06.key-external","i-lucide-key",{"title":88,"path":89,"stem":90,"icon":91},"安卓代码加固（7）：依赖隔离","\u002Fandroid\u002Fhidden-hardening\u002Fdep-isolate","3.android\u002F02.hidden-hardening\u002F07.dep-isolate","i-lucide-layers",{"title":93,"path":94,"stem":95,"icon":96},"安卓代码加固（8）：构建校验","\u002Fandroid\u002Fhidden-hardening\u002Fbuild-verify","3.android\u002F02.hidden-hardening\u002F08.build-verify","i-lucide-shield-check",{"title":98,"path":99,"stem":100,"icon":101},"安卓代码加固（9）：防录屏","\u002Fandroid\u002Fhidden-hardening\u002Fflag-secure","3.android\u002F02.hidden-hardening\u002F09.flag-secure","i-lucide-eye-off",{"title":103,"path":104,"stem":105,"icon":106},"安卓代码加固（10）：ABI门禁","\u002Fandroid\u002Fhidden-hardening\u002Fabi-gate","3.android\u002F02.hidden-hardening\u002F10.abi-gate","i-lucide-git-compare",{"title":108,"icon":109,"path":110,"stem":111,"children":112},"iOS","i-simple-icons-apple","\u002Fios","4.ios",[113,115,120,125,129,133],{"title":108,"path":110,"stem":114,"icon":109},"4.ios\u002Findex",{"title":116,"path":117,"stem":118,"icon":119},"iOS面试题1","\u002Fios\u002Fios-interview1","4.ios\u002F01.ios-interview1","i-lucide-sparkles",{"title":121,"path":122,"stem":123,"icon":124},"设置启动图","\u002Fios\u002Fset-launch-screen","4.ios\u002F02.set-launch-screen","i-lucide-image",{"title":126,"path":127,"stem":128,"icon":48},"路由管理","\u002Fios\u002Frouting","4.ios\u002F03.routing",{"title":130,"path":131,"stem":132,"icon":91},"状态管理","\u002Fios\u002Fstate-management","4.ios\u002F04.state-management",{"title":134,"path":135,"stem":136,"icon":137},"事件传递","\u002Fios\u002Fevent-delivery","4.ios\u002F05.event-delivery","i-lucide-pointer",{"title":139,"path":140,"stem":141,"children":142,"icon":144},"Flutter","\u002Fflutter","5.flutter\u002Findex",[143],{"title":139,"path":140,"stem":141,"icon":144},"i-simple-icons-flutter",{"title":146,"icon":147,"path":148,"stem":149,"children":150,"page":160},"面试","i-lucide-graduation-cap","\u002Finterview","6.interview",[151,156],{"title":152,"path":153,"stem":154,"icon":155},"Flutter面试题1","\u002Finterview\u002Fflutter-interview1","6.interview\u002F01.flutter-interview1","i-lucide-boxes",{"title":157,"path":158,"stem":159,"icon":66},"Flutter面试题2","\u002Finterview\u002Fflutter-interview2","6.interview\u002F02.flutter-interview2",false,{"title":162,"icon":163,"path":164,"stem":165,"children":166},"算法学习","i-lucide-binary","\u002Falgorithm","7.algorithm",[167,169],{"title":162,"path":164,"stem":168,"icon":163},"7.algorithm\u002Findex",{"title":170,"path":171,"stem":172},"算法基础1：复杂度分析","\u002Falgorithm\u002Ftime-space-complexity","7.algorithm\u002F01.time-space-complexity",{"id":174,"title":18,"body":175,"description":416,"extension":417,"links":418,"meta":429,"navigation":435,"path":19,"seo":436,"stem":20,"__hash__":439},"docs\u002F0.blog\u002F02.lockify.md",{"type":176,"value":177,"toc":401},"minimark",[178,189,202,236,240,243,246,249,252,255,292,295,298,301,305,308,314,317,320,323,326,329,332,335,338,341,344,350,354,357,366,369,378,381,395,398],[179,180,181,188],"p",{},[182,183,187],"a",{"href":184,"rel":185},"https:\u002F\u002Fgithub.com\u002FArturoYi\u002FLockify",[186],"nofollow","Lockify"," 是我写的一款密码保存应用。登录信息、银行卡、证件和笔记都放在你正在用的那台手机里。没有账号，数据不上云，也不收集使用记录。",[179,190,191,192,196,197,201],{},"当前版本是 ",[193,194,195],"strong",{},"1.0.0","。Android 可以直接装发布包，源码和后续变更都在 GitHub 上。站点的 ",[182,198,200],{"href":199},"\u002Fdemos?cat=flutter","Flutter 示例"," 里也能直接打开仓库。",[203,204,205,213,228],"ul",{},[206,207,208,209],"li",{},"仓库：",[182,210,212],{"href":184,"rel":211},[186],"github.com\u002FArturoYi\u002FLockify",[206,214,215,216,221,222,227],{},"安装包：",[182,217,220],{"href":218,"rel":219},"https:\u002F\u002Fgithub.com\u002FArturoYi\u002FLockify\u002Freleases\u002Fdownload\u002Fv1.0.0\u002FLockify-1.0.0.apk",[186],"Lockify-1.0.0.apk","（约 63 MB，",[182,223,226],{"href":224,"rel":225},"https:\u002F\u002Fgithub.com\u002FArturoYi\u002FLockify\u002Freleases\u002Ftag\u002Fv1.0.0",[186],"发布页","）",[206,229,230,231],{},"变更记录：",[182,232,235],{"href":233,"rel":234},"https:\u002F\u002Fgithub.com\u002FArturoYi\u002FLockify\u002Fblob\u002Fmain\u002FCHANGELOG.md",[186],"CHANGELOG",[237,238,239],"h2",{"id":239},"项目初衷",[179,241,242],{},"我需要一个能把账号、密码、银行卡、证件和笔记放进手机的工具。常见的密码管理器大多要注册、要同步，这些东西我不想交出去。",[179,244,245],{},"另一半原因是想把 Flutter 走一遍：界面、状态、本地存储，一直到能发出去的安装包。所以代码以能用、能看懂为主。它不是给公司做的保险柜，也没有做过第三方安全审计。如果你要的是零知识云同步，或者审计过的商业方案，这里不是那个产品。",[237,247,248],{"id":248},"它做了什么",[179,250,251],{},"数据只写在当前设备上。敏感字段会在本机用 AES-256-GCM 加密，再存进本地数据库。",[179,253,254],{},"1.0.0 已经能日常使用：",[203,256,257,263,269,275,286],{},[206,258,259,262],{},[193,260,261],{},"条目","。网站登录、应用登录、银行卡、证件、安全笔记。登录条目可以记用户名、密码、网址或应用名、备注，也可以记 TOTP 两步验证，详情页能显示并复制动态码。银行卡和证件覆盖常见种类。条目可以放进个人、工作、家庭，也可以标成收藏，还能加自定义字段。内置密码生成器，并会提示密码强度。",[206,264,265,268],{},[193,266,267],{},"查找","。首页搜索，按类型或收藏筛选，下拉刷新，上拉继续加载。详情页可以复制用户名、密码和动态码。",[206,270,271,274],{},[193,272,273],{},"锁定","。优先用生物识别或系统认证；没有的话用 6 位应用 PIN。退到后台时会遮住界面内容。",[206,276,277,280,281,285],{},[193,278,279],{},"备份","。导出、导入 ",[282,283,284],"code",{},".blbak"," 文件。两台手机靠近后，也可以用蓝牙把保险柜迁过去，不经过云。",[206,287,288,291],{},[193,289,290],{},"外观","。简体中文、繁体中文、英语、阿拉伯语（从右到左），也可以跟随系统。浅色、深色、跟随系统，以及多套配色。",[179,293,294],{},"卸载应用，或者手机丢了，我没有办法帮你把数据找回来。设备和备份都要自己留着。",[179,296,297],{},"下一版（1.0.1）打算给银行卡和证件补照片。只收图片，保存后写在本机，备份和迁移会一起带走。另外还在计划里的有：跟着 Flutter 版本做适配，以及在同一局域网里把保险柜迁到另一台装了 Lockify 的设备。文件备份会继续留着。",[237,299,300],{"id":300},"怎么使用",[302,303,304],"h3",{"id":304},"安装",[179,306,307],{},"目前发布的是 Android 安装包：",[179,309,310],{},[182,311,313],{"href":218,"rel":312},[186],"下载 Lockify-1.0.0.apk",[179,315,316],{},"包里包含 arm、arm64 和 x64。下载后到系统设置里允许安装未知来源应用。这一版安装包用的是 debug 签名，方便自己分发。以后如果换成正式签名，需要先卸载再装；卸载会清掉本机数据，换包之前先把备份导出。",[179,318,319],{},"这一版没有单独的 iOS 安装包。iOS 工程在仓库里，要用的话得自己编译。",[302,321,322],{"id":322},"记一条",[179,324,325],{},"打开应用后新增条目，按要记的东西选类型：网站或应用登录、银行卡、证件、安全笔记。登录类填用户名和密码。需要两步验证时，把 TOTP 密钥记进去，之后在详情页看动态码。",[179,327,328],{},"条目可以归到个人、工作或家庭，常用的标成收藏。想换一组密码时，用内置生成器造一个，再看一眼强度提示。",[302,330,331],{"id":331},"找和复制",[179,333,334],{},"首页可以直接搜，也可以只看某一类，或只看收藏。打开详情后，用户名、密码和动态码都能复制。",[302,336,337],{"id":337},"锁上应用",[179,339,340],{},"可以打开应用锁定。手机支持生物识别或系统认证时优先用那个，否则设一个 6 位 PIN。切到别的应用再回来，需要重新验证。退到后台时，界面内容会被遮住，避免在多任务里被人看到。",[302,342,343],{"id":343},"备份和换机",[179,345,346,347,349],{},"定期把保险柜导出成 ",[282,348,284],{},"，把文件放到你自己信得过的地方。换手机时，在新设备上导入这个文件。两台都装了 Lockify、又能互相靠近时，也可以用蓝牙直接迁，不用先把备份传到网上。",[351,352,353],"warning",{},"备份文件和手机本身一样敏感。不要把它发到聊天软件，也不要上传到公开网盘。卸载或清除应用数据之前，先确认备份能在另一台设备上导入。",[237,355,356],{"id":356},"协议和反馈",[179,358,359,360,365],{},"项目以 ",[182,361,364],{"href":362,"rel":363},"https:\u002F\u002Fgithub.com\u002FArturoYi\u002FLockify\u002Fblob\u002Fmain\u002FLICENSE",[186],"MIT License"," 发布。你可以自由使用、复制、修改、合并、发布和再分发，包括用在闭源项目里，只要保留版权和许可声明。",[179,367,368],{},"软件按现状提供。我不保证它没有缺陷，也不对数据丢失、泄露或误操作负责。Flutter、ObjectBox 等依赖各有自己的协议。",[179,370,371,372,377],{},"用的过程中如果崩溃、显示错乱，或者数据和你存进去的对不上，请到 ",[182,373,376],{"href":374,"rel":375},"https:\u002F\u002Fgithub.com\u002FArturoYi\u002FLockify\u002Fissues",[186],"Issues"," 开一条。这是个人项目，回复可能慢，也不是每条都能修。",[179,379,380],{},"写的时候请带上：",[203,382,383,386,389,392],{},[206,384,385],{},"系统和机型，例如 Android 15 \u002F Pixel，或 iOS 18 \u002F iPhone",[206,387,388],{},"应用版本号，在设置页底部",[206,390,391],{},"你做了什么、实际看到什么、你本来期望什么",[206,393,394],{},"能稳定复现最好；偶发的话，写一下发生前在做什么",[351,396,397],{},"不要在 Issue 里贴真实密码、卡号、证件号、密钥或完整备份。用假数据复现就够了。",[179,399,400],{},"功能建议也可以开 Issue。短期不会大改，不保证每条都会做。",{"title":402,"searchDepth":403,"depth":403,"links":404},"",2,[405,406,407,415],{"id":239,"depth":403,"text":239},{"id":248,"depth":403,"text":248},{"id":300,"depth":403,"text":300,"children":408},[409,411,412,413,414],{"id":304,"depth":410,"text":304},3,{"id":322,"depth":410,"text":322},{"id":331,"depth":410,"text":331},{"id":337,"depth":410,"text":337},{"id":343,"depth":410,"text":343},{"id":356,"depth":403,"text":356},"一款纯本地的密码保存应用。数据只写在当前设备上，不设账号、不上云、不收集使用数据。","md",[419,423,426],{"label":420,"icon":421,"to":184,"target":422},"GitHub","i-simple-icons-github","_blank",{"label":424,"icon":425,"to":218,"target":422},"下载 Android 安装包","i-lucide-download",{"label":427,"icon":428,"to":374,"target":422},"反馈问题","i-lucide-circle-alert",{"date":430,"categories":431,"tags":433},"2026-09-28",[432],"flutter",[139,187,434],"本地存储",{"icon":21},{"title":437,"description":438},"Lockify：本机密码保存应用","Lockify 用来在手机里保存登录、银行卡、证件和笔记。本文说明它为什么做、能做什么、怎么安装使用，以及协议和反馈方式。","pLWHA5sbVx94P3KWdfS4sXIe5fkHcD5G1owQMFUXsHU",[441,443],{"title":13,"path":14,"stem":15,"description":442,"icon":16,"children":-1},"现在新建项目默认已经是 SwiftUI，但我还是习惯用 UIKit，所以把步骤记在这里。",{"title":23,"path":24,"stem":25,"description":444,"icon":28,"children":-1},"每年总结一下，为了放心去忘记。",1790767042878]