NMocker:一款轻量级 iOS App 网络抓包与 Mock 工具
无需证书、无需代理,基于 URLProtocol 无侵入拦截,搭配 Web 控制台和 Mac 应用,让 API 调试效率翻倍
前言
在日常 iOS 开发中,我们经常会遇到这样的场景:
- 后端接口还没写好,但前端需要联调 UI
- 某些异常场景(超时、5xx 错误)难以在真实环境中复现
- 测试阶段需要验证 App 对不同返回数据的处理逻辑
- 想要快速抓包查看 App 发出的网络请求,但不想配置代理和证书
通常我们会选择 Charles 或 Proxyman 这类工具,但它们需要配置代理、安装证书,流程繁琐,而且对 macOS 的开发者来说,还需要保持电脑和手机在同一网络环境下。
有没有一种更轻量的方式来解决这些问题?
NMocker 正是为了解决这些痛点而诞生的。
什么是 NMocker?
NMocker 是一款 iOS 网络拦截与 Mock 工具。它通过注入 URLProtocol,无侵入地拦截 App 内所有的 HTTP/HTTPS 请求,并提供 Web 控制台 和 原生 Mac 应用 两种调试方式,支持基于真实请求日志一键创建 Mock 规则。
简单来说:你只需要在 Debug 环境下集成 NMocker,启动服务后,就能在浏览器或 Mac 应用中实时查看所有网络请求,并一键生成模拟响应。
核心特性
🔀 无侵入拦截,基于 URLProtocol
NMocker 的核心拦截能力基于苹果官方提供的 URLProtocol 实现。URLProtocol 是 URL Loading System 的一部分,允许开发者在系统层面拦截、修改或模拟网络请求。
NSURLProtocol是一个抽象类,你可以创建子类来处理特定 URL Scheme 的数据加载。注册后,URL 加载系统会在请求发出时优先交由你的协议对象处理。—— Apple 官方文档
NMocker 通过注册自定义 URLProtocol,能够在不侵入业务代码的前提下,拦截 App 内所有通过 URLSession 和 URLConnection 发出的请求。
🌐 两种调试方式
NMocker 提供了两种调试方式,你可以根据场景灵活选择:
| 方式 | 优点 | 适用场景 |
|---|---|---|
| Web 控制台 | 无需安装,浏览器即可访问 | 快速调试、临时查看 |
| Mac 应用 | 支持 USB 连接 | 日常开发、无网络环境 |
📋 基于日志的一键 Mock
传统 Mock 工具需要手动配置规则(路径、方法、响应数据)。NMocker 的做法更直观:
- 在控制台中查看实时请求日志
- 点击任意请求的 "Mock" 按钮
- 编辑响应数据并保存
后续匹配该路径和方法的请求将自动返回你设置的模拟数据。整个过程无需手动编写任何规则配置。
🎮 三种拦截模式
| 模式 | 行为 | 适用场景 |
|---|---|---|
| Lazy | 仅当 Web 控制台连接时拦截 | 日常开发,减少干扰 |
| Adaptive | 根据历史使用习惯智能启动窗口 | 默认推荐,平衡效率与体验 |
| Eager | 服务启动即拦截所有请求 | 深度调试 |
📡 实时请求日志
通过 Server-Sent Events (SSE) 技术,NMocker 将拦截到的请求详情(Headers、Body、响应数据)实时推送到控制台,无需刷新页面即可查看最新请求。
💾 规则持久化
Mock 规则通过 Keychain 持久化存储,App 重启后规则依然有效,无需重复配置。
效果预览
网络请求日志
Mock
Mac版
技术架构
NMocker 的整体架构分为四个核心层次:
┌─────────────────────────────────────────────────────┐
│ 控制台层 │
│ Web 控制台 (Vue 3) │ Mac 应用 (SwiftUI) │
├─────────────────────────────────────────────────────┤
│ 服务层 │
│ GCDWebServer (内嵌 HTTP 服务器) │
│ SSE 实时推送 │
├─────────────────────────────────────────────────────┤
│ 核心层 │
│ InterceptionManager │ MockRuleEngine │
│ URLProtocol 拦截器 │ 规则匹配 (LIFO) │
├─────────────────────────────────────────────────────┤
│ 存储层 │
│ Keychain (规则持久化) │
└─────────────────────────────────────────────────────┘
关键组件
1. URLProtocol 拦截器
NMocker 的自定义 `URLProtocol` 子类通过 `canInitWithRequest:` 决定哪些请求需要拦截,在 `startLoading` 中构建模拟响应或转发真实请求。
2. GCDWebServer 内嵌服务器
NMocker 使用 [GCDWebServer](https://github.com/swisspol/GCDWebServer) 在 App 内启动轻量级 HTTP 服务器,提供 Web 控制台界面和 RESTful API。GCDWebServer 的优势在于:
- 自动处理 iOS 后台任务,防止 App 被系统挂起
- 支持异步响应和流式响应
- 轻量级,无额外依赖
3. SSE 实时通信
通过 Server-Sent Events 实现日志实时推送,相比 WebSocket 更轻量,且无需复杂的握手协议。
4. Mac 应用
原生 SwiftUI 应用,通过 **libimobiledevice** 支持 USB 直连,即使手机和电脑不在同一局域网也能使用。
---
如何集成?
通过 CocoaPods(推荐)
```ruby
pod 'NMocker', :configurations => ['Debug']
通过 Swift Package Manager
在 Xcode 中通过 File → Add Package Dependencies… 添加:
https://github.com/CodansYC/NMocker.git
基本使用
import NMocker
// 启动服务(默认 .adaptive 模式)
NMocker.shared.start()
// 获取控制台地址
if let url = NMocker.shared.serverURL {
print("请在浏览器中打开: \(url)")
}
// 停止服务
NMocker.shared.stop()
技术亮点与挑战
1. URLProtocol 的限制
URLProtocol 虽然强大,但有一个众所周知的限制:无法拦截 WKWebView 中的请求。这是因为 WKWebView 运行在独立的进程中,不走 App 的 URL Loading System。
NMocker 主要面向 API 调试场景,针对的是 App 自身的网络请求。如果需要调试 WebView 内容,可以结合 WKNavigationDelegate 作为补充方案。
2. 多模式拦截策略
三种拦截模式的设计,让开发者可以根据场景灵活选择:
- 开发初期用 Eager 模式捕获所有请求
- 日常开发用 Adaptive 模式自动适应使用习惯
- 非调试时段用 Lazy 模式避免性能损耗
3. 跨平台控制台
Web 控制台基于 Vue 3 + TypeScript 构建,支持亮色/暗色模式自动适配,提供丰富的 JSON 编辑和查看功能。
Mac 应用则支持 USB 直连,无需依赖网络环境。
总结与展望
NMocker 的核心设计理念是 让网络调试更简单、更高效。通过 URLProtocol 实现无侵入拦截,结合 Web 控制台和 Mac 应用,让开发者能够专注于业务逻辑,而不是在工具配置上浪费时间。
目前 NMocker 已经在 GitHub 开源,欢迎 Star 和贡献!
GitHub 仓库:github.com/CodansYC/NM…
CocoaPods:cocoapods.org/pods/NMocke…
如果你对 NMocker 有任何建议或想法,欢迎在 GitHub 上提 Issue 或 PR!