iloader 侧载工具能力水位审计5 条关键链路逐一开盒缺口与补丁路径全记录【免费下载链接】iloaderUser friendly sideloader项目地址: https://gitcode.com/GitHub_Trending/iloa/iloaderiloader 是开源 iOS 侧载工具的图形界面实现负责 Apple ID 登录、IPA 安装、SideStore 部署与配对文件投放。本文以 v2.4.1commit e05c91d的 Rust 后端 src-tauri/src/ 与 React 前端 src/ 为唯一主线对照 iOS 侧载工具的品类基准做一份可逐条复核的能力水位审计。证据边界只读上述两个目录CONTRIBUTING.md 仅用于范围声明仓库内没有的 docs、测试与基准不作引用。读完后你能做到三件事区分三档图例与证据分级的口径、在仓库中定位每个标记落到的文件与函数、知道补齐某条能力要改哪个文件哪个函数、是否必须跨仓库。度量口径怎么评、评什么、不评什么标记含义常见误读✅通路端到端可用后端与 UI 均有源码证据这不是无已知缺陷只代表通路存在有通路但关键语义未实现这不是差一点完成而是能用但缺核心行为❌无对应实现层这不是计划中除非代码注释自证有意不做证据分级三档各一句话已验证事实——代码可直接证实无歧义注释口径——代码注释里给出的数值或说法未经实测引用时标注注释口径未测量——无基准、无数据明说缺口在哪本文不给数字。范围声明审计对象是 v2.4.1package.json 与 Cargo.toml 版本字段一致在 commit e05c91d 的现状。CONTRIBUTING.md 第一行声明项目正在大改版UI 重构与新支持平台故本文只审计当前 tag 现状不把计划中当结论。文档来源声明仓库内没有 docs 目录也没有 hardware-parity、gaps 一类的现成审计文档本文是逐文件走读后的重建非对某份文档的转述。测试与基准同样缺失src-tauri/ 无#[test]、无 benchessrc/ 无*.test.*正确性结论全部是代码可读证的推断不是运行事实。链路一usbmuxd 设备枚举链路能力项品类基准预期本项目现状源码锚点设备枚举列出已连接设备✅ 并行拉取名称与版本list_devices在 src-tauri/src/device.rs版本/连接类型采集每设备取 iOS 版本✅ lockdown 取两字段list_devices在 src-tauri/src/device.rs设备断连自动重连线断后自动恢复❌ 零监听仅手动刷新get_usbmuxd在 src-tauri/src/device.rs枚举失败处理定位到单台设备❌ 只弹一条 toastloadDevices在 src/Device.tsx这一行的 ❌ 写在 src-tauri/src/device.rs 里整条链路没有任何监听调用断连后只有一条错误映射let devs usbmuxd.get_devices().await.map_err(|e| { AppError::Usbmuxd(Failed to list devices from usbmuxd.into(), e.to_string()) })?;这段证明了设备枚举失败只映射为一次性的 AppError无重选逻辑。缺口断言缺的是设备变更监听这一个具体行为。src-tauri/src/ 全部源码中没有任何 usbmuxd 事件订阅设备掉线后 UI 停在旧状态恢复只靠前端手动刷新CtrlRsrc/App.tsx 的refreshDevicesRef。这是没有实现层不是有意不做——代码注释里也没有说明。补丁入口改 src-tauri/src/device.rs在list_devices旁增加设备变更订阅并回调重选usbmuxd 协议与事件暴露由外部 idevice crate0.1.68提供本仓库只做胶水协议层改动去上游仓库属 owner 决策。链路二iOS 版本分叉与配对文件生成链路能力项品类基准预期本项目现状源码锚点按版本选择配对链路17.4 分叉✅ 后端双链路并存pairing_file在 src-tauri/src/pairing.rs版本比较函数真实版本解析✅ major/minor 元组比较is_ios_version_below在 src-tauri/src/pairing.rs按版本裁剪错误建议建议随版本过滤 正则剥标记getSuggestionBlock在 src/errors.tsx配对文件按设备缓存按 udid 缓存✅ 含失效重生成with_pairing_storage在 src-tauri/src/pairing.rs删除缓存后 host label 轮换换标识重配对✅ 生成新 labeldelete_stored_rppairing在 src-tauri/src/pairing.rs这一行的 写在 src/errors.tsx 里分叉是显式的.map((s) s .replace(/^\[platform::.*?\]/, ) // TODO: actually check ios version .replace(/\[ios::.*?\]/g, ) .trim(), );这段证明了错误建议的版本过滤未实现现状是正则剥掉标记后继续展示。缺口断言后端is_ios_version_below是实有的 只落在前端错误建议这一侧——有按版本裁剪的通路标记体系已建好缺的是读取真实版本、按版本保留或剔除建议的核心行为。补丁入口改 src/errors.tsx 的getSuggestionBlock数据源就是 src-tauri/src/device.rs 里DeviceInfo的version字段纯前端改动不涉上游。链路三keyring 存储与明文降级链路能力项品类基准预期本项目现状源码锚点密码/Anisette 状态存储系统钥匙串✅ 默认 keyringcreate_sideloading_storage在 src-tauri/src/secure_storage.rskeyring 不可用降级安全降级 明文文件仅 warncreate_sideloading_storage在 src-tauri/src/secure_storage.rs存储后端运行期重建状态翻转时重建✅ 检测翻转并重建with_pairing_storage在 src-tauri/src/pairing.rs降级事实对用户可见设置页提示❌ 仅一个强制关闭开关overrideKeyring在 src/pages/Settings.tsx跨机迁移备份/恢复❌ 无迁移机制—这一行的 写在 src-tauri/src/secure_storage.rs 里降级是显式的if keyring_available() { Ok(Box::new(KeyringStorage::new(iloader.to_string()))) } else { warn!( Keyring is not available, falling back to filesystem storage for sideloading data. This is insecure! ); Ok(Box::new(FsStorage::new( app.path().app_data_dir().map_err(|e| { AppError::Misc(format!(Failed to get app data directory: {:?}, e)) })?, ))) }这段证明了keyring 检测失败时静默降级为应用数据目录下的明文文件唯一提示是一条 warn。缺口断言有通路但缺两个核心行为——降级路径不加密且降级事实不通知前端用户只能看到 src/pages/Settings.tsx 里一个overrideKeyring开关看不到凭据实际落在哪。补丁入口改 src-tauri/src/secure_storage.rs 的降级分支加本地加密或把当前后端经命令暴露给设置页FsStorage/KeyringStorage实现在上游 isideload crate0.5.2本仓库只做调度与展示属 owner 决策。链路四Apple 登录链与 Anisette 服务器列表能力项品类基准预期本项目现状源码锚点Apple ID 登录含 2FA主流程✅ 120 秒验证码超时login在 src-tauri/src/account.rsAnisette 服务器列表动态发现 前端硬编码 4 个anisetteServers在 src/pages/Settings.tsx客户端指纹由服务端下发 写死 macOS 27.0 覆盖login在 src-tauri/src/account.rsTeam 选择多 Team 切换❌ TODO 空壳login在 src-tauri/src/account.rsAnisette 失败自动回退自动换源❌ 只能手动换源reset_anisette_state在 src-tauri/src/account.rs这一行的 写在 src/pages/Settings.tsx 顶部注释自己承认了现状// TODO: Fetch anisette list from server // Old android servers // let anisetteServers [ // [ani.sidestore.io, SideStore (.io)], // ... ]; // new mac/windows servers let anisetteServers [ [mac-ani.jkcoxson.com, Jkcoxson], [ani.iloader.app, iloader], [new.ani.sidestore.io, SideStore (.io)], [ani3.stikstore.app, StikStore], // works ~50% of the time, and doesnt work with SMS 2FA // [ani.jkcoxson.com, Jkcoxson (Windows)], ];这段证明了列表是静态数组被注释掉的 Windows 服务器标注works ~50% of the time属估算未经实测本文不采信为事实。缺口断言动态发现这一层缺的是从服务端拉取列表并做可用性回退两个具体行为Team 选择则连实现层都没有只有// TODO: Team Selection一行注释属没有实现层而非有意不做。补丁入口改 src/pages/Settings.tsx 把列表改为拉取客户端指纹临时覆盖在 src-tauri/src/account.rs 的login里等服务端上报 client info 后移除Team 选择在 isideload 的会话层本仓库只做胶水跨仓库属 owner 决策。链路五IPA 安装进度回报链路能力项品类基准预期本项目现状源码锚点任意 IPA 导入选文件即装✅ 委托 isideloadsideload在 src-tauri/src/sideload.rsIPA 传输进度回报百分比/速率 回调传 Nonesideload在 src-tauri/src/sideload.rsSideStore 三步编排分阶段反馈✅ download/install/pairinginstall_sidestore_operation在 src-tauri/src/sideload.rs安装包缓存不重复下载❌ TODO 自证未做install_sidestore_operation在 src-tauri/src/sideload.rs失败步骤单步重试从断点继续❌ 失败即整体报错Operation在 src-tauri/src/operation.rs这一行的 写在 src-tauri/src/sideload.rs 里缺口是一个参数let special sideloader .get_mut() .install_app( provider, app_path.into(), true, None::fn(f32) - std::future::Ready(), Some(device.pairing), ) .await?;这段证明了install_app 的进度回调位置整个让给了 NoneUI 拿不到百分比。缺口断言有通路但缺进度值上行这一个核心行为。src/components/operations.ts 里 sideload 操作只有install一个步骤对照 SideStore 的 download/install/pairing 三步IPA 导入在 UI 上只能看到安装中一个状态下载侧download()先response.bytes()整体读进内存再写盘无流式、无进度上方// TODO: Cache check version to avoid re-downloading自证缓存未做。补丁入口改 src-tauri/src/sideload.rs 把None换成Some回调进度值经 src-tauri/src/operation.rs 的OperationUpdate新增载荷上行前端 src/components/operations.ts 同步加字段isideload 的install_app已预留回调签名本仓库只做传值。缺口拓扑先补哪个后补哪个先补哪个由依赖顺序决定不是由表格行数决定usbmuxd(宿主前提, alpha blocker) - usbmuxd 枚举(list_devices) - [A] Apple 登录链(isideload/idevice) - Sideloader 安装 - [B] 选中设备 配对文件(pairing.rs) - 投放配对文件usbmuxd 是硬前提宿主没有 usbmuxd整条链断在get_usbmuxd属 alpha blocker。CONTRIBUTING.md 写明核心侧载功能认证、签名在外部 isideload 仓库修 A 链深层问题要跨仓库属 owner 决策。普通缺口按依赖排iOS 版本检测链路二/五同形、Anisette 动态列表链路四、IPA 进度回报链路五、Team 选择链路四isideload 侧跨仓库。锚点等级对应源码改动v2.4.1Cargo.toml 与 package.json 一致—全量现状基线17.4 门src-tauri/src/pairing.rs 注释 rppairing is 17.4minorRPPairing 缓存与 host label 轮换Anisette 临时覆盖src-tauri/src/account.rs 注释 temporarytrivial写死 macOS 27.0 客户端指纹// TODO: Fetch anisette list from serversrc/pages/Settings.tsxtrivial静态列表未接入动态发现仓库无 revision history 文档上表是代码内可追溯的全部。复现与排查命令与失败链排序bun i这条验证前端依赖可解析脚本名取自 package.json。bunx tauri dev这条验证 Tauri 命令注册是否可通对应 src-tauri/src/lib.rsgenerate_handler里的 22 个命令。cargo build --manifest-path src-tauri/Cargo.toml这条验证 Rust 后端独立编译。git clone https://gitcode.com/GitHub_Trending/iloa/iloader仅在你需要本地克隆时执行一次。日志入口设置页快捷键 CtrlLmacOS 为 CmdL见 src/pages/Settings.tsx 的按键处理打开 View Logs文件日志按天轮转、保留 2 份src-tauri/src/lib.rs 的RollingFileAppender路径为%APPDATA%、~/Library/Application Support、~/.local/share下的me.nabdev.iloader/logs/identifier 取自 tauri.conf.json。按源码失败链排序的排查清单usbmuxd宿主 usbmuxd 未安装或未运行或设备物理未连接 → Windows 装 iTunes 或 Microsoft Store 的 Apple DevicesmacOS 自带Linux 确认 usbmuxd 在跑再查物理连接 → 这是 src-tauri/src/device.rsget_usbmuxd的第一条断链。device_coms / remote_pairing / lockdown_pairing设备未点信任这台电脑或 17.4 设备首次配对未完成 → 解锁设备到主屏接受信任弹窗确认设置了指纹密码用 USB 而非无线 → 建议文案见 src/locales/en.json 的trust与pairing键。keyring / storagekeyring 不可用已降级为明文文件 → 检查设置页 Dont use keyring 开关与系统钥匙串可用性 → 注意降级后不会自动回迁需重启应用并恢复 keyring 才会重建存储后端src-tauri/src/pairing.rswith_pairing_storage。anisette服务器不可达 → 换设置页服务器或点 Reset Anisette Statesrc-tauri/src/account.rsreset_anisette_state清本地状态再试 → 这是全链路唯一没有自动回退的环节。not_enough_app_ids / max_apps免费账户 App ID 或设备注册数耗尽 → Apple 侧限制工具无法绕过只能删除旧 App ID 或旧设备注册。account_lockedApple 锁号-20209需走 Apple 解锁流程underage1102年龄不符无解法。引用须知别被 ✅ 的密度误导。本仓库的 ✅ 集中在协议编排层——设备枚举、配对文件生成、错误分类、步骤状态机都是真的真正的拖累在宿主前提usbmuxd、外部依赖anisette 服务器可用性、isideload/idevice 协议层与明确注释的 TODOTeam 选择、iOS 版本过滤、安装包缓存。判断能不能用要看这三层而不是数表格里的对勾。未测量不等于不行。仓库没有测试套件与基准本文所有正确性结论都是代码可读证的推断不是运行事实唯一的量化口径注释里 anisette 服务器 ~50% 可用率属估算未经实测本文不采信为事实。引用时请把这两种表述分开。本文的价值在于每一行都能落点到一个文件、一个函数、一条注释src-tauri/src/pairing.rs 的 17.4 门、src-tauri/src/secure_storage.rs 的降级 warn、src/errors.tsx 的 TODO。下一个审计者不需要相信本文只需要打开这些位置。【免费下载链接】iloaderUser friendly sideloader项目地址: https://gitcode.com/GitHub_Trending/iloa/iloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?