通过手机或网页远程锁定你的 Mac 屏幕
MacLock 是一个轻量级的远程锁屏解决方案,由三个组件组成:
- macOS 客户端 - 常驻菜单栏的 Swift 应用
- 中继服务器 - Java Spring Boot 后端服务
- 移动端控制器 - 简洁的 Web 页面
- 一键远程锁定 Mac 屏幕
- 菜单栏常驻,无 Dock 图标干扰
- 支持开机自启动
- 断线自动重连(5秒间隔)
- 实时连接状态显示
- 跨平台控制(手机浏览器、PC 浏览器均可)
┌─────────────┐ HTTP POST ┌─────────────┐ SSE Push ┌─────────────┐
│ 手机/Web │ ───────────────▶ │ 服务端 │ ───────────────▶ │ Mac App │
│ (控制端) │ /api/lock │ (中继) │ lock event │ (被控端) │
└─────────────┘ └─────────────┘ └─────────────┘
通信流程:
- Mac 客户端启动后通过 SSE (Server-Sent Events) 连接到服务端
- 用户在手机/网页点击锁屏按钮,发送 HTTP POST 请求到服务端
- 服务端通过 SSE 推送
lock事件到所有已连接的 Mac 客户端 - Mac 客户端收到事件后执行锁屏操作
环境要求: Java 8+, Maven 3.6+
cd server
mvn clean package
java -jar target/maclock-server-1.0.0.jar服务端默认运行在 http://localhost:8080
环境要求: macOS 14+, Xcode 15+ (或 Swift 5.9+)
cd app/MacLock
swift build
.build/debug/MacLock或使用 Xcode 打开项目直接运行。
- 点击菜单栏的锁图标
- 选择「设置服务器」
- 输入服务器地址(如
http://192.168.1.100:8080) - 点击「连接」
在手机浏览器中打开 mobile/index.html(需要先修改其中的 SERVER_URL 为你的服务器地址),或直接访问:
http://你的服务器地址:8080/mobile/index.html
提示:可以将服务端的
mobile/index.html部署为静态资源,方便手机访问。
mac_lock/
├── app/MacLock/ # Swift macOS 客户端
│ ├── MacLock/
│ │ ├── MacLockApp.swift # 应用入口 + 菜单栏管理
│ │ ├── SettingsWindow.swift # 设置界面
│ │ ├── LockScreenService.swift # 锁屏实现 (AppleScript)
│ │ ├── SSEClient.swift # SSE 客户端
│ │ ├── LaunchAtLoginManager.swift # 开机启动管理
│ │ ├── Info.plist # 应用配置
│ │ └── MacLock.entitlements # 权限配置
│ └── Package.swift # Swift Package 配置
│
├── server/ # Java Spring Boot 服务端
│ ├── src/main/java/com/maclock/
│ │ ├── MacLockApplication.java # Spring Boot 入口
│ │ ├── controller/
│ │ │ └── LockController.java # REST API 控制器
│ │ └── service/
│ │ └── SseService.java # SSE 广播服务
│ └── pom.xml # Maven 配置
│
└── mobile/ # 移动端 Web 控制页面
└── index.html # 单页面控制界面
GET /api/sse/connect?clientId={clientId}
Mac 客户端调用,建立 SSE 长连接。
事件类型:
connected- 连接成功lock- 锁屏指令
POST /api/lock
响应示例:
{
"success": true,
"message": "锁屏指令已发送",
"clients": 1
}GET /api/status
响应示例:
{
"clients": 1
}- 锁屏方式: 通过 AppleScript 模拟
Ctrl+Cmd+Q快捷键 - UI 框架: SwiftUI + AppKit (NSPanel)
- 网络通信: URLSession 实现 SSE 客户端
- 开机启动: SMAppService (macOS 13+) / SMLoginItemSetEnabled
- 菜单栏: NSStatusItem
- 框架: Spring Boot 2.7
- SSE 实现: SseEmitter
- 心跳检测: 每 5 秒发送 ping,自动清理失效连接
- 依赖: Hutool (工具库), Lombok
- 纯静态页面: 无需构建,直接使用
- 响应式设计: 适配手机屏幕
- Fetch API: 发送锁屏请求
-
内网部署(推荐)
- 将服务端部署在家庭/办公网络的服务器上
- Mac 和手机连接同一网络即可使用
-
公网部署
- 需要有公网 IP 或使用内网穿透工具
- 建议配置 HTTPS 和访问认证
FROM openjdk:8-jre-slim
COPY target/maclock-server-1.0.0.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]docker build -t maclock-server .
docker run -d -p 8080:8080 maclock-server- 本项目设计用于个人/家庭内网环境
- 如需公网部署,强烈建议:
- 添加访问认证机制
- 使用 HTTPS
- 限制 IP 访问范围
- 锁屏功能需要 macOS 的辅助功能权限(首次使用会弹出授权请求)
A: 首次运行时,macOS 会请求「辅助功能」权限。请在「系统设置 → 隐私与安全性 → 辅助功能」中允许 MacLock。
A: 检查以下几点:
- 服务端是否正常运行
- 服务器地址是否正确(包含
http://前缀) - 防火墙是否阻止了 8080 端口
A: 在设置界面勾选「开机时自动启动」选项。
- 添加密码/Token 认证
- 支持多 Mac 设备管理
- iOS/Android 原生 App
- 支持更多远程操作(休眠、关机等)
- Web 管理后台
欢迎提交 Issue 和 Pull Request!
Made with ❤️ for Mac users