| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| AppPorts2.0.0.dmg | 2026-10-24 | 12.8 MB | |
| README.md | 2026-10-24 | 40.7 kB | |
| v2.0.0 source code.tar.gz | 2026-10-24 | 12.2 MB | |
| v2.0.0 source code.zip | 2026-10-24 | 12.5 MB | |
| Totals: 4 Items | 37.4 MB | 0 | |
AppPorts v2.0.0 Build 50 更新说明(in English) · 直链下载 · 赞助
感谢
感谢 trah01 为这次更新投入的时间和精力。从后台任务中心、微信账号媒体拆分迁移、加密数据卷,到启动入口、异常恢复、目录大小缓存和诊断导出,他把许多实际使用中会遇到的困难,一项项变成了具体的改进。这些贡献可以在提交记录里找到,也会出现在用户等待迁移、处理失败、重新连接磁盘的那些时刻。
也谢谢每一位反馈问题、分享经验、提交代码和支持项目的朋友,是你们让 AppPorts 有机会继续往前走。
总结
1.9.3 主要解决的是大应用「搬得太慢」;2.0.0 继续处理迁移的整个过程:等待时能做什么、出了问题怎么继续、哪些数据可以单独搬,以及什么时候可以拔盘。
这次加入了独立的后台任务中心。迁移可以收起到后台,切换页面后仍能查看进度,也可以暂停、继续和取消;需要处理的任务有了更明确的恢复入口。微信可以按账号只迁移媒体目录,把数据库和配置留在本机;加密 APFS 外置盘也可以用于挂载迁移,并为新数据卷单独设置密码。
长任务的显示和性能也一起调整:总体估算与当前目录阶段分开,准备数据卷时不再提前跳到切换阶段;数据扫描和符合条件的小文件复制采用有上限的并发,合并同一次操作中重复的内容核验,同时保留切换、清理和中断恢复所需的检查。
此外,AppPorts 现在可以请求系统弹出外置硬盘,弹出按钮位于「应用」页面右侧的「外部应用库」标题栏,在「选择文件夹」和刷新按钮之间。并暂停这块盘的自动挂载;原生 macOS 启动入口在关联数据迁移期间会提示等待。应用列表、目录筛选、大小缓存、诊断导出和 22 种界面语言也得到补齐和改进。
升级提示
请打开一次新版,让启动入口和后台组件有机会更新。 已有原生 macOS 启动入口会通过扫描和刷新升级;启动保护需要新版入口配合,尚未刷新的旧入口不能提供同样的保护。升级不会自动把旧式符号链接迁移转换成 APFS 挂载迁移。
有未完成任务或旧副本残留时,请在新版中继续处理。 新版可读取受支持的旧记录,但新增恢复状态保存后,旧版可能无法识别新的记录格式。不要把降级当作异常恢复的方法,也不要只删除任务列表来代替处理真实的恢复记录。
加密盘用户可以使用新的挂载迁移流程。 新数据卷独立设密码,不会自动继承外置盘原来的密码。密码面板提供保存到本机钥匙串的选项;不保存时,重新登录或连接后可能需要手动解锁。请妥善保管密码,AppPorts 不能恢复遗忘的加密密码。
微信拆分迁移默认关闭,需要主动开启。 在「应用数据」中选中对应微信,开启「微信账号拆分迁移」,再从账号行选择全部迁移或拆分迁移。已经采用其中一种方式的账号,需要完整还原已有迁移后才能切换方式。
从 AppPorts 弹出磁盘后,自动挂载会保持暂停,直到设备重新连接。 如果你在 Finder 的提示里取消了弹出,但希望恢复自动挂载,也需要先正常处理仍在使用磁盘的应用,再将设备拔下重新插入。
新功能
后台任务中心:迁移可以收起来,进度仍然找得到
顶部工具栏新增「任务中心」,集中显示应用迁移、数据迁移和目录操作的任务。正在执行的任务可以点击「加入后台」收起详情,之后继续浏览其他页面,再从任务中心回到进度详情。
- 支持查看任务状态、总体进度、当前目录和耗时。
- 支持选择一个或多个任务,统一暂停、继续或取消。
- 支持最多三个任务并行,冲突的操作会自动排队。
- 暂停在读取和复制的检查点生效;入口切换等关键步骤不会被立即停在一半。
- 取消会等待正在执行的工作结束并完成必要的恢复收尾,再释放任务占用。
「加入后台」表示 AppPorts 仍在运行时继续执行。 退出应用后不会靠任务历史继续复制;重新打开时,未结束的历史任务显示为需要处理,真实恢复依据仍是迁移记录。
任务历史保留:清空列表与删除数据分开
任务中心可以清空已完成记录。设置中新增「退出后清理已完成的任务列表」,默认开启;关闭后,可以在下次打开 AppPorts 时继续查看成功任务的历史。
清空任务历史只清空展示记录。已经迁移的数据、尚未清理的旧副本和恢复记录,仍由各自的迁移流程管理。
微信账号拆分迁移:媒体放外盘,数据库和配置留本机
新增以微信账号为单位的迁移选择面板,先计算整个账号及媒体目录大小,再选择:
- 全部迁移:迁移整个账号目录。
- 拆分迁移:只迁移账号下的
msg和business两个媒体目录,数据库、配置及其他未列入范围的内容保持原位。
拆分后,界面将两个成员聚合成一个账号入口,便于查看和还原。底层仍分别记录每个目录的迁移状态:一个成员完成、另一个中断时,会保留实际结果并允许继续缺失成员,已有完成成员不必重复迁移。
多开微信按实际应用和容器身份判断,避免将另一个微信实例的数据套进默认容器的迁移规则。关闭拆分选项后,已经迁移的成员和还原入口仍然可见。
这两个目录的迁移并非一次不可分割的提交。 中断时可能只有一个完成;外置盘未连接时,文字消息是否仍可使用,也取决于微信版本和实际数据布局,不能仅凭数据库留在本地就保证离线可用。
加密 APFS 数据卷:单独设置密码,可选择自动解锁
挂载迁移不再一律拒绝加密 APFS 外置盘。选择这样的目标后,AppPorts 会引导设置新数据卷密码,并核对新卷的身份、加密及解锁状态,确认后才开始复制。
- 新数据卷有独立密码,外置盘现有密码和文件保持原状。
- 微信拆分迁移创建的多个数据卷,共用这次输入的密码设置。
- 密码面板支持确认密码,并可选择「保存到本机钥匙串,连接外置盘后自动解锁」。
- 未持久保存的密码可在近期操作中复用;正在执行的操作会持有凭据直到结束,避免长任务因缓存到期中断。
- 后台没有可用密码时,显示等待解锁,不反复弹出认证框;界面提供解锁后继续的入口。
密码通过标准输入交给系统磁盘工具,不写入迁移记录、命令参数或日志。保存到钥匙串的密码仅限本机使用,钥匙串锁定或不可读时仍需用户处理。
在 AppPorts 中弹出外置硬盘
弹出按钮位于「应用」页面右侧的「外部应用库」标题栏,在「选择文件夹」和刷新按钮之间。 点击弹出图标,在菜单中选择「弹出外置硬盘」。
操作会先暂停该盘的自动挂载,再请求 Finder 执行整盘弹出,由系统显示占用提示。
AppPorts 会继续观察设备和挂载状态,分别显示磁盘尚未弹出、所有卷已卸载但设备仍连接、磁盘已离线或当前无法确认等结果。某些硬盘盒在卷已卸载后仍保持物理连接,现在会提示拔下后重新插入,不把它误判为仍有卷挂载。
弹出失败、部分卷卸载或系统仍在等待时,自动挂载保持暂停;仍有卷挂载时可重试弹出。重新连接同一设备后,AppPorts 识别新的物理连接并解除对应暂停。仅重新挂载某个卷,不能代替这个重连接步骤。
首次使用可能需要授权 AppPorts 控制 Finder。操作不会强制卸载磁盘,也不会自动强退正在使用磁盘的应用。
数据迁移期间,原生启动入口提示等待
当关联应用数据正在迁移或迁回时,通过更新后的 AppPorts 原生 macOS 启动入口打开应用,会看到「正在迁移或迁回应用数据,请等待完成后再打开」的提示。打开文件和 URL 的转发也经过同一检查。
保护从任务实际开始执行时生效,排队期间不阻止打开;复制暂停时仍保留,取消后则等恢复收尾返回再释放。迁移本身不因此修改真实应用的代码或签名。
保护范围是经过新版 AppPorts 原生启动入口的请求。 直接打开外盘应用、修复后的 Dock 图标直接指向的真实应用、尚未更新的旧入口和 iOS 包装应用入口,仍可能绕过它。迁移前和切换前的运行检查继续保留,使用时仍应退出关联应用。
更明确的异常处理选择
数据异常面板现在可以查看待处理原因和保留路径,并按现场提供重试、检查权限、打开旧副本、稍后处理,以及「保留副本并结束清理」。
数据已完成切换时,可以明确选择保留旧副本:自动清理和对应提醒会停止,文件继续占空间,之后仍可从异常面板重新尝试清理。尚未完成数据切换的记录,不能用这个选项跳过恢复。
应用迁移异常另提供「忽略错误结束任务」和「忽略错误强制回迁」,均需确认:
- 结束任务:将迁移记录归档为未完成,保留文件并解除该记录的占用。
- 强制回迁:将外盘应用复制到本地,保留外盘原件和已有本地副本;此路径不做内容校验,结果仍标记为未经验证,需要自行检查。
强制处理是用户主动接受的恢复选择,不能保证应用完整或正常运行,也不会自动合并不同副本。
修复
Xcode 等受保护应用复制完成后,仍因权限无法切换或清理 — 某些由管理员安装的应用属于 root,普通进程能复制,却不能完成位置交换或删除旧副本。现在实际遇到对应权限阻碍时,前台操作可调用系统管理员授权框,仅提升所需的交换和已验证清理步骤。取消授权会保留副本;后台重试不会反复弹密码框,也不要求用户递归修改应用所有者。
本地启动入口过早退出,无法可靠反馈真实应用是否打开 — 原生启动器现在等待系统转发结果,再结束自己的事件循环,并处理打开、重开、文件和 URL 请求。重复的启动兜底不会再次发起同一初始请求;目标缺失或系统启动失败会显示错误。
迁移中断后,失败候选卷因原目录的新写入长期残留 — 对能够证明从未启用、且归属明确的失败迁移卷,收尾不再要求当前原目录仍等于迁移前的旧内容。应用恢复后的新数据留在原目录,候选卷按身份、引用和使用状态检查后处理。已经启用的卷、还原暂存和未知孤儿卷继续保留原有保护。
拔盘再插回后,失败卷被系统挂到普通位置,后续清理无法接续 — 恢复现在识别符合条件的系统自动挂载位置,重新核对卷身份和归属,再接回原有恢复流程;设备号变化不再单独阻断。不会仅凭卷名删除磁盘内容。
数据任务重试成功后,旧任务仍显示需要处理 — 支持关联的显式数据任务重试继续使用原任务行,重置本次进度、计时和控制状态。过期弹窗和重复回调不能再次启动同一次失败操作;后台只完成旧副本清理时,也不会把原先失败的迁移误写成成功。
旧副本无法清理时,后台反复整树核验,持续读盘 — 自动清理按失败时间逐步延长重试间隔,后续最多每日一次;用户主动重试可跳过等待间隔,仍需通过内容和身份检查。应用入口恢复优先,不因旧副本退避而停止正常接回;用户选择稍后处理或保留副本的语义继续生效。
一条无关损坏记录阻塞另一个应用的合法重试 — 指定应用事务重试改为严格读取自己的记录,无关损坏记录继续留在诊断中。选中的记录损坏或磁盘仍处于弹出暂停时,照常拒绝执行。
准备数据卷时,总体进度提前跳到后半段 — 临时挂载和准备阶段的核验现在计入准备范围,实际复制和正式入口切换分别在各自边界推进。微信多目录任务的总体百分比与当前目录步骤分开显示,不再根据合算百分比误点亮阶段。
校验、切换、收尾标签来回跳动 — 正式入口切换在最终证明完成后单独观察;切换和清理内部的辅助核验仍归属当前步骤。独立恢复或仅处理旧副本时,也能显示对应的实际阶段。
应用数据仍在扫描,却提前显示「无本地应用」 — 扫描期间显示加载状态,区分尚未完成、路径无法确认和真正没有内容,减少误导性的空列表提示。
应用数据分栏在空列表时下沉,目录结构开关展示过多无关项目 — 分栏子视图纵向撑满;「显示锁定目录结构」只补回可操作项目上方的必要祖先。新增独立的「显示不支持迁移目录」,需要查看全部不可迁移项目时再开启。
重新连接外盘后,挂载已恢复,应用列表却仍为空或显示孤立入口 — 同时监听卷挂载和卸载事件,重新建立当前目录监控并刷新本地、外部列表;忙碌时延后刷新,避免沿用上一次挂载会话的失效监控。
并发复制后,正常退出的回归检查仍按逐文件串行判断 — 更新退出回归,同时覆盖串行和四路复制,检查退出回复前已保存恢复记录、在途工作已结束、后续文件未开始、原件保留且候选不再变化。
性能改进
完整数据扫描采用有界并发读取。 严格数据路径在同一目录内最多同时读取四个普通文件,仍逐项完成内容散列、属性和身份核对。目录递归、资源叉及其他特殊条目保留各自的处理方式,结果按原有顺序归并。
符合条件的微小文件可以四路复制。 仅对同目录中不超过 16 KiB、没有硬链接组和资源叉的普通文件启用。较大文件、目录、链接和特殊条目继续走原路径;出错或取消时先收齐正在执行的工作,再进入恢复或清理。
合并同一次操作中的重复内容核验。 正常数据迁移将目标读回放到切换前的完整检查,并减少上层重复元数据处理。准备基线仍先保存,源和目标通过检查后才能切换;中断后的恢复仍需要重新取得内容证明。
以下为仓库记录的同一构建对照测试:每组 6,000 个文件,采用串行/四路/四路/串行顺序,保留相同预读、同步和完整核验条件,表中为外盘复制阶段的中位数。
| 合成数据集 | 串行复制 | 四路复制 |
|---|---|---|
| 6,000 × 4 KiB | 1.532 秒 | 1.041 秒 |
| 6,000 × 16 KiB | 1.735 秒 | 1.023 秒 |
这些数字说明特定微小文件场景的收益,不能作为整个 2.0.0 比 1.9.3 快多少的结论。 扫描、建卷、同步、完整核验和清理仍占时间;真实微信大目录的往返已做独立内容及元数据核对,但最后一轮没有同构建串行对照,不据此承诺整体提速比例。盘速、硬盘盒、缓存和文件分布都会影响结果。
界面与行为变化
顶部导航更直接。 「应用」「工具目录」「应用数据」「目录迁移」现在直接出现在顶部;任务中心集中在同一工具栏,页面相关操作随当前页面切换。
应用筛选与大小缓存更易使用。 搜索和排序独立布局,新增「隐藏已迁移应用」,方便集中查看还留在本机的应用。应用、工具目录和自定义目录可复用持久大小缓存,显示上次缓存时间,并提供「刷新缓存」主动重新计算;手动刷新也会绕过对应的内存大小缓存。
滚动和选择更稳定。 应用图标使用异步读取和有上限的缓存,锁定状态检查移到后台,减少列表绘制时的同步磁盘访问;标签采用稳定身份,选择高亮改为更轻的背景和描边,并保留原生列表的键盘与多选行为。
目录统计更明确。 应用数据总量与当前显示目录大小分别展示;父子目录去重,已迁到外盘的数据不重复计入本地可释放量。部分目录无法读取时显示统计不完整,旧副本仍保留时也说明清理完成后才会释放空间。
挂载数据更容易从 Finder 找到。 在所选外部目录的「应用数据目录」下,按应用整理受管数据的 Finder 替身;挂载点变化时仍可通过卷身份定位。应用名中的 .app 后缀不再让数据文件夹被 Finder 当作应用包,用户替换过的快捷文件不会被直接覆盖或删除。
诊断导出先选择内容和保存位置。 新对话框可选择是否附带应用清单,默认不勾选;压缩与写入在后台执行,生成成功后才替换目标文件,失败时保留原有导出。完成后在 Finder 中显示结果,已有日志脱敏继续执行。
新增文案补齐 22 种界面语言。 覆盖任务中心、异常处理、加密密码、磁盘弹出和启动保护等提示;独立原生启动器的提示从同一语言目录生成,并按系统首选语言选择。长译文的按钮和弹窗布局也作了调整。
README 文档入口同步到当前网站。 快速入门、macOS 27 修复、兼容性说明和赞助链接更新为现有路径,减少旧链接打不开的问题。
已知限制
- 挂载迁移仍是实验性功能,需要 APFS 外置盘和完全磁盘访问权限。
- 微信拆分迁移后,未连接外置盘时能否使用文字消息取决于微信版本。
- 启动保护只覆盖新版 AppPorts 原生入口,迁移期间仍应退出关联应用。
- 强制回迁不进行内容校验,完成后请自行确认应用是否正常。
⚠️ “AppPorts”已损坏,无法打开
如果从 AppPorts 官方发布渠道下载后遇到此提示,可能与 macOS 的应用隔离检查有关。
确认下载来源后,将 AppPorts 放入「应用程序」文件夹,再在终端运行:
:::shell
xattr -rd com.apple.quarantine /Applications/AppPorts.app
如果无法打开的是迁移后的其他应用,请先检查外置盘连接、数据卷是否挂载或等待解锁,以及应用签名状态。旧版重签名相关问题,请按 macOS 27 升级与修复指南处理。
迁移使用提示
- 开始前退出关联应用;任务加入后台后,也不要在其他入口重新打开正在迁移数据的应用。
- 微信拆分迁移先查看账号和媒体大小,确认选择的账号及迁移方式;切换方式前完整还原已有成员。
- 创建加密数据卷时记录好密码,按需要选择是否保存到本机钥匙串。
- 遇到需要处理的任务,先确认磁盘连接、解锁状态和权限,再从异常面板重试;选择保留旧副本后,请记得它仍占用空间。
- 拔盘前退出相关应用,等待迁移任务结束,再使用 AppPorts 或系统弹出;AppPorts 提示设备仍连接时,按提示完成重新连接。
- 反馈问题时,可附上任务状态、错误提示和「日志 → 导出诊断包」生成的文件。是否附带应用清单由你选择;分享前可先检查内容。
- 重要数据请保留独立备份,迁移副本和异常处理中保留的材料不能替代备份。
English Release Notes
Thanks
Thank you to trah01 for the time and effort he put into this update. From the background task center, per-account WeChat media migration and encrypted data volumes to launchers, recovery, directory-size caching and diagnostic export, he turned many difficulties encountered in everyday use into concrete improvements. His contributions are recorded in the commits and will also be felt when users wait for a transfer, work through a failure or reconnect a drive.
Thank you as well to everyone who reports problems, shares experience, contributes code or supports the project. You help AppPorts keep moving forward.
Summary
1.9.3 focused on slow transfers of large apps. 2.0.0 extends that work across the migration process: what you can do while waiting, how to continue after a failure, what data can move separately and when to disconnect a drive.
An independent task center now lets you put transfers in the background, change pages, return to progress details and pause, resume or cancel tasks. WeChat accounts can move only their media directories, leaving databases and configuration locally. Mount migration can also use encrypted APFS storage, with a separate password for each new data volume.
Overall estimates and current-directory steps are now displayed separately. Data scanning and eligible small-file copying use bounded concurrency, and repeated verification within the same operation has been reduced while retaining the checks needed for switching, cleanup and recovery.
AppPorts can now ask the system to eject an external drive and pause automatic mounting for that drive. The eject button is in the right-hand External App Library header on the Apps page, between Choose Folder and the refresh button. Native macOS portals also ask users to wait while the associated app's data is being transferred. App lists, directory filters, size caches, diagnostic export and support for 22 interface languages have also been improved.
Upgrade Notes
Open the new version once so launchers and background components can update. Existing native macOS portals are refreshed through scanning. Launch protection requires an updated portal; older portals cannot provide it. Upgrading does not convert classic symlink migrations into APFS mount migrations.
Continue unfinished work in the new version. Supported older records remain readable, but records saved with new recovery state may not be understood by older versions. Downgrading is not a recovery procedure, and deleting task history does not resolve the underlying transaction.
Encrypted storage now has a supported mount-migration flow. New data volumes need their own password and do not inherit the external drive's password. The password sheet offers local Keychain storage; without it, manual unlocking may be needed after login or reconnection. AppPorts cannot recover a forgotten encryption password.
WeChat split migration is disabled by default. Select the relevant WeChat app in App Data, enable the account split option, then choose whole-account or split migration from the account row. Restore existing migrated data completely before changing modes.
Ejecting through AppPorts pauses automatic mounting until the device is reconnected. Cancelling Finder's eject prompt does not clear that pause. To resume, deal with any apps still using the drive, then disconnect and reconnect the device normally.
New Features
Background task center
The toolbar now has a Task Center for app transfers, data migration and directory operations. “Run in Background” closes the detail view while AppPorts continues the work; you can browse another page and return to the task later.
- View status, overall progress, the current directory and elapsed time.
- Select one or more tasks to pause, resume or cancel together.
- Run up to three tasks in parallel; conflicting operations queue automatically.
- Pausing takes effect at reading and copying checkpoints; critical entry switches are not stopped halfway through.
- Cancellation waits for active work and necessary recovery to finish before releasing resources.
Background execution requires AppPorts to remain running. Task history does not keep copying after exit. On reopening, unfinished history entries need attention; durable migration records remain the authority for recovery.
Optional task-history retention
Completed task history can be cleared from the task center. Settings now includes “Clear completed tasks on exit,” enabled by default. Turn it off to retain successful-task history across launches.
Clearing history only removes display records. Migrated files, retained copies and recovery records continue to be managed by their transfer workflows.
Per-account WeChat media migration
A new account sheet measures the whole account and media directories before offering:
- Whole migration: move the entire account directory.
- Split migration: move only its
msgandbusinessmedia directories, leaving databases, configuration and other unlisted content locally.
The two members appear as one account operation, but keep separate recovery records. If one completes and the other is interrupted, the actual partial result remains visible and the missing member can be continued without moving the completed one again.
Multiple WeChat instances use their actual app and container identity. Disabling split mode does not hide existing migrated members or their restore controls.
The two members are not committed atomically together. Offline text-message availability depends on the WeChat version and data layout; keeping databases locally does not guarantee it.
Encrypted APFS data volumes
Mount migration no longer rejects an encrypted APFS destination outright. AppPorts asks for a password for the new data volume and verifies its identity, encryption and unlocked state before copying.
- New volumes have a separate password; existing drive files and its password stay as they are.
- Multiple volumes created by one WeChat split operation share the password settings entered for that operation.
- Confirm the new password and optionally save it to this Mac's Keychain for automatic unlocking after reconnection.
- Credentials can be reused briefly in memory, while an active operation retains them until it finishes.
- Background work waits for unlocking when credentials are unavailable, without repeatedly opening authentication dialogs. The interface offers an unlock-and-continue action.
Passwords are passed to the system disk utility through standard input, not command arguments, migration records or logs. Saved credentials are local to this Mac; a locked or unavailable Keychain still requires user action.
External-drive ejection from AppPorts
The eject button is in the right-hand External App Library header on the Apps page, between Choose Folder and the refresh button. Click the eject icon and select “Eject External Drive” from its menu.
AppPorts first pauses automatic mounting for the drive, then asks Finder to eject the whole disk. Finder provides the system's in-use prompt.
AppPorts independently observes the result: the disk may still be mounted, all volumes may be unmounted while the device stays connected, the disk may be offline, or its state may be unknown. Enclosures that remain connected after unmounting now receive a reconnect instruction.
The pause stays in effect after failures, partial unmounts or a pending prompt. Ejection can be retried while volumes remain mounted. A new physical connection of the same device clears its pause; remounting one volume on the original connection does not.
The first request may require permission to control Finder. AppPorts does not force-unmount the drive or force-quit apps using it.
Launch protection during app-data transfers
An updated native macOS portal checks whether its app's data is being migrated or restored before forwarding a launch, file or URL request. If so, it asks you to wait.
Protection starts when execution begins, remains during a copying pause and is released after cancellation recovery finishes. A queued task does not block launching. This protection does not modify the real app's code or signature.
Only requests through updated AppPorts native macOS portals are covered. Directly opening the real external app, a repaired Dock pin pointing to that app, an older portal or an iOS wrapper can bypass it. Runtime checks remain in place; keep the associated app closed during migration.
Explicit recovery choices
Data recovery shows the reason and retained paths, with retry, permission checks, open-old-copy, defer and keep-copy actions where appropriate.
Once data has switched, you can keep the old copy and stop automatic cleanup and its reminders. The copy continues occupying space and can be retried later. This option cannot skip recovery before the data switch is complete.
App-transfer recovery also offers two confirmed overrides:
- Ignore errors and end the task: archive its record as incomplete, retain files and release its reservation.
- Ignore errors and force restore: copy the external app locally while retaining the external original and existing local copy. This path does not verify content and remains marked unverified.
These are explicit recovery choices, not proof that an app is complete or runnable. Different copies are not automatically merged.
Fixes
Protected apps such as Xcode could copy successfully but fail during switching or cleanup. A foreground operation can now request system administrator authorization when the relevant operation is blocked by root ownership. Elevation is limited to the required exchange and verified cleanup; cancelling retains the copies. Background retries do not repeatedly prompt, and recursive ownership changes are not required.
Local launchers exited before knowing whether forwarding succeeded. Native launchers now wait for system completion, handle open, reopen, file and URL events, avoid duplicate initial fallback launches and report missing targets or launch errors.
Failed candidate volumes could remain indefinitely after new writes to the restored source. A candidate proven never to have been activated, with exclusive ownership, can be cleaned without requiring today's source to match its old contents. New source data stays in place; activated volumes, restore staging and unknown orphan volumes keep their existing protections.
System automounting after reconnection could prevent failed-volume recovery. Eligible candidates are checked by identity and ownership before rejoining recovery. A changed device number alone no longer blocks the flow, and a volume name alone never authorizes deletion.
A successful data-task retry left the original row needing attention. Linked explicit retries reuse the original task row and reset progress, timing and controls. Stale dialogs and duplicate callbacks cannot restart the same failed execution. Background cleanup alone does not turn a failed migration into a successful one.
Unfinishable cleanup repeatedly reread whole trees. Automatic retries now back off from their failure time, eventually to at most once per day. Manual retry bypasses the interval, not content or identity checks. Entry recovery and normal remounting remain prioritised; keep/defer choices remain respected.
An unrelated corrupt record blocked a valid app retry. A targeted retry strictly reads its own transaction. Unrelated corrupt records stay available for diagnostics; a corrupt selected record or an ejection pause still blocks execution.
Preparing a data volume advanced progress into later stages too soon. Temporary mounting and preparation checks now stay in the preparation range. Overall estimates and current-directory steps are separate, including grouped WeChat operations.
Verification, switching and cleanup labels jumped back and forth. The actual entry switch is observed after final proof; auxiliary checks within switching or cleanup stay in that step. Independent recovery and cleanup-only work also report their proper stages.
App Data showed “no local apps” while scanning. Loading, unresolved paths and genuinely empty results are now distinguished.
Empty App Data panes sank vertically, and locked-structure display included unrelated entries. Panes fill their available height. Locked structure only restores necessary ancestors of actionable entries; a separate option shows all unsupported directories.
Apps stayed missing or appeared orphaned after drive reconnection. Mount and unmount events rebuild directory monitoring and refresh both app lists, deferring refresh while busy rather than retaining a stale monitoring session.
Normal-exit regression checks still assumed serial copying. Tests now cover serial and four-way copying, checking durable recovery before the exit reply, completion of in-flight work, no later-file start, retained originals and a candidate that stops changing.
Performance Improvements
Bounded concurrent data scanning. Strict data scans read up to four ordinary files within a directory while retaining full digests, attributes and identity checks. Directory recursion, resource forks and special nodes keep their appropriate handling; results retain their original order.
Four-way copying for eligible tiny files. Eligibility is limited to ordinary files no larger than 16 KiB without a hard-link group or resource fork. Larger files, directories, links and special nodes keep their existing path. Failure or cancellation joins active work before recovery or cleanup.
Less repeated verification within one operation. Normal data transfers defer destination readback to the complete pre-switch check and reduce duplicate metadata work. Preparation proof is still saved first; source and destination must pass before switching. Interrupted recovery obtains fresh proof.
The repository records a same-build comparison with 6,000 files per set, run serial/four-way/four-way/serial under the same pre-read, flush and full-verification conditions. These are median external-drive copying times:
| Synthetic dataset | Serial copying | Four-way copying |
|---|---|---|
| 6,000 × 4 KiB | 1.532 s | 1.041 s |
| 6,000 × 16 KiB | 1.735 s | 1.023 s |
These numbers describe eligible tiny-file copying, not an overall 2.0.0-versus-1.9.3 speedup. Scanning, volume creation, flushing, verification and cleanup still take time. Real large WeChat round trips received independent content and metadata checks, but the final run lacked a same-build serial comparison and does not establish a whole-task speedup. Drives, enclosures, caching and file distribution affect results.
Interface and Behaviour Changes
Direct top navigation. Apps, Tool Directories, App Data and Directory Migration are available at the top, alongside the task center and page-specific controls.
Filtering and persistent size caches. Search and sorting have their own layout, with a new hide-migrated-apps control. Apps, tool directories and custom directories can reuse saved sizes, show the last cache time and offer an explicit refresh that also bypasses the relevant in-memory size cache.
Smoother scrolling and clearer selection. App icons load asynchronously through a bounded cache; lock-state checks run off the drawing path. Stable badge identities, lighter selection backgrounds and borders retain native keyboard and multi-selection behaviour.
Clearer directory statistics. Total app data and currently displayed directory sizes are separate. Parent/child data is deduplicated, external data is excluded from local reclaimable space, partial reads are marked incomplete and retained originals are identified as space only freed after cleanup.
Finder access to mounted data. Managed aliases are organised by app under the selected external root's app-data directory and retain volume identity. An .app suffix no longer makes that folder appear as an app bundle; user-replaced shortcut files are not blindly overwritten or deleted.
Diagnostic export options. Choose the destination and whether to include the app inventory, which is off by default. Compression and writing run in the background; successful generation replaces the target, while failure preserves the previous export. Finder reveals the result and existing log redaction continues.
New text across 22 interface languages. Task, recovery, password, ejection and launch-protection messages are covered. Native launcher text comes from the same language catalog and follows system language preferences; layouts accommodate longer translations.
Current README documentation links. Quick start, macOS 27 repair, compatibility and sponsorship links now use the current site's paths.
Known Limitations
- Mount migration remains experimental and requires an APFS external drive and Full Disk Access.
- Offline text-message availability after WeChat split migration depends on the WeChat version.
- Launch protection covers updated native AppPorts portals only; keep the associated app closed during migration.
- A forced restore does not verify content. Check that the app works afterwards.
⚠️ “AppPorts” is damaged and can't be opened
If this happens after downloading from an official AppPorts release channel, macOS quarantine checks may be involved.
After confirming the source, place AppPorts in Applications and run:
:::shell
xattr -rd com.apple.quarantine /Applications/AppPorts.app
If a migrated app cannot open, first check the drive connection, data-volume mounting or unlocking and its signature. For older re-signing problems, follow the macOS 27 upgrade and repair guide.
Migration Notes
- Quit the associated app first and keep it closed, including when the task is running in the background.
- Check the selected WeChat account and measured sizes before choosing a mode. Fully restore existing members before changing modes.
- Keep the data-volume password and choose local Keychain storage according to your needs.
- For tasks needing attention, check connection, unlocking and permissions before retrying. Retained old copies still use space.
- Wait for tasks to finish and quit apps using the drive before ejecting. Follow AppPorts' reconnect instruction when the device remains connected.
- Reports can include task status, the error and a package from Logs → Export Diagnostics. You choose whether to include the app inventory and can inspect the package before sharing.
- Keep an independent backup of important data; migrated and retained recovery copies do not replace one.
遇到问题或有新的建议,欢迎通过 GitHub Issues 反馈。 / Share problems or suggestions through GitHub Issues.
贡献与改动记录 / Contributions and Changes
- trah01:后台任务中心、微信账号拆分迁移、加密数据卷、异常恢复、启动转发、缓存与界面等多项贡献,已合入 PR [#86]。 / Background tasks, WeChat split migration, encrypted volumes, recovery, launching, caches and interface improvements, merged in PR [#86].
- 后续改动继续完善失败卷收尾、旧记录兼容、任务重试、磁盘弹出、启动保护、严格数据复制性能、进度阶段、本地化和文档入口。 / Follow-up work refines failed-volume cleanup, record compatibility, retries, ejection, launch protection, strict-data performance, progress, localisation and documentation links.
What's Changed
- 修正bug,调整UI,引入后台任务、微信拆分与加密卷恢复等多项功能,具体见commit by @trah01 in https://github.com/wzh4869/AppPorts/pull/86
New Contributors
- @trah01 made their first contribution in https://github.com/wzh4869/AppPorts/pull/86
Full Changelog: https://github.com/wzh4869/AppPorts/compare/1.9.3...2.0.0