Files
dzc 3ecac9a302 feat: Phase 4 收尾 + Phase 5 打包(首启向导/开机自启/URL scheme 闭环/mac dmg)
Phase 4 剩余三项:
- 首次引导向导(setup/first_run + ui/setup_wizard):服务自检(含 C# 助手共存
  提示)→ 打印机检测与 HiTi 驱动安装指引(官网链接/重新检测,mac 与 win 文案
  分支,允许无打印机完成)→ 开机自启开关 + scheme 注册;侧栏底部常驻设置区
  (自启开关 + 重新运行引导)
- 开机自启(setup/autostart):mac 写 LaunchAgent(RunAtLoad 一次性,不用
  KeepAlive——托盘退出不能被拉回);Windows 走 HKCU Run(reg 命令免 win32 依赖)
- URL scheme 闭环:单实例唤醒端口 38210(setup/single_instance)——zaxprint://
  唤起或重复双击启动第二进程时通知常驻实例弹窗后自退,跨平台一致(弃用
  app_links 的 mac 事件转发不确定性);Windows 启动时幂等注册 HKCU scheme;
  前端 cardPrinter.ts 加 launchAgent()(zaxprint://open),开卡抽屉离线时显示
  "启动打印助手"按钮,点击唤起后 1s×6 轮询自动上线(biz 前端改动待用户提交)

Phase 5:
- tool/package_macos.sh:构建 → ad-hoc 就地签名(--deep,勿加 --options=runtime:
  hardened runtime 库校验会因 ad-hoc 无 Team ID 拒载 framework,实测踩坑)→
  hdiutil dmg;实测产出 22MB dmg + 签名后冒烟通过
- windows/installer.iss:Inno Setup 安装包脚本(快捷方式/桌面图标/开机自启
  Tasks/zaxprint scheme 注册与卸载清理/HiTi SDK DLL 随 Release 目录打包)

依赖 +url_launcher +shared_preferences;13 测试全过、analyze 零问题。
2026-09-21 13:51:42 +08:00

38 lines
1.5 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:io';
import '../utils/command_runner.dart';
/// zaxprint:// URL scheme 注册:
/// - macOS:Info.plist CFBundleURLTypes 已声明(构建即生效),无需运行时处理
/// - Windows:写 HKCU\Software\Classes\zaxprint(用户级,免管理员),App 启动时 ensure
class UrlScheme {
static const scheme = 'zaxprint';
static bool get needsRuntimeRegister => Platform.isWindows;
/// Windows:确保 scheme 已注册到当前可执行文件(每次启动幂等调用,路径变了会刷新)。
static Future<void> ensureRegistered() async {
if (!Platform.isWindows) return;
final exe = Platform.resolvedExecutable;
final root = r'HKCU\Software\Classes' '\\$scheme';
await runCommand('reg', ['add', root, '/ve', '/t', 'REG_SZ', '/d', 'URL:资安信插件助手唤起', '/f']);
await runCommand('reg', ['add', root, '/v', 'URL Protocol', '/t', 'REG_SZ', '/d', '', '/f']);
await runCommand('reg', [
'add', r'HKCU\Software\Classes' '\\$scheme' r'\shell\open\command',
'/ve', '/t', 'REG_SZ', '/d', '"$exe" "%1"', '/f',
]);
}
/// Windows:注册是否指向当前可执行文件(向导自检展示用)。
static Future<bool> isRegisteredToSelf() async {
if (!Platform.isWindows) return true; // mac 由 Info.plist 保证
final exe = Platform.resolvedExecutable;
final out = await runCommand(
'reg',
['query', r'HKCU\Software\Classes' '\\$scheme' r'\shell\open\command', '/ve'],
tolerateExit: true,
);
return out.contains(exe);
}
}