
无需证书、无需代理,基于NSURLProtocol吧无侵入拦截,搭配 Web 控制台和 Mac 应用,让 API 调试效率翻倍
前言
在日常 iOS 开发中,我们经常会遇到这样的场景:
后端接口还没写好,但前端需要联调 UI 某些异常场景(超时、5xx 错误)难以在真实环境中复现 测试阶段需要验证 App 对不同返回数据的处理逻辑 想要快速抓包查看 App 发出的网络请求,但不想配置代理和证书
通常我们会选择 Charles 或 Proxyman 这类工具,但它们需要配置代理、安装证书,流程繁琐,而且对 macOS 的开发者来说,还需要保持电脑和手机在同一网络环境下。
有没有一种更轻量的方式来解决这些问题?
NMocker 正是为了解决这些痛点而诞生的。
什么是 NMocker?
NMocker 是一款 iOS 网络拦截与 Mock 工具。它通过可视化无侵入拦截,拦截 App 内所有的 HTTP/HTTPS 请求,并提供 Web 控制台 和 原生 Mac 应用 两种调试方式,支持基于真实请求日志一键创建 Mock 规则。
简单来说:你只需要在 Debug 环境下集成 NMocker,启动服务后,就能在浏览器或 Mac 应用中实时查看所有网络请求,并一键生成模拟响应。
核心特性
🔀 无侵入拦截,可视化呈现
NMocker 的核心拦截能力让开发者可以在系统层面可视化地拦截、修改或模拟网络请求。
NMocker 通过可视化拦截方案,能够在不侵入业务代码的前提下,拦截 App 内所有通过 URLSession 和 URLConnection 发出的请求。
🌐 两种调试方式
NMocker 提供了两种调试方式,你可以根据场景灵活选择:
| Web 控制台 | ||
| Mac 应用 |
📋 基于日志的一键 Mock
传统 Mock 工具需要手动配置规则(路径、方法、响应数据)。NMocker 的做法更直观:
在控制台中查看实时请求日志 点击任意请求的 "Mock" 按钮 编辑响应数据并保存
后续匹配该路径和方法的请求将自动返回你设置的模拟数据。整个过程无需手动编写任何规则配置。
🎮 三种拦截模式
| Lazy | ||
| 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 ││ 可视化拦截器 │ 规则匹配 (LIFO) │├─────────────────────────────────────────────────────┤│ 存储层 ││ Keychain (规则持久化) │└─────────────────────────────────────────────────────┘
关键组件
1. 可视化拦截器
NMocker 的可视化拦截器会判断哪些请求需要拦截,并构建模拟响应或转发真实请求。
2. GCDWebServer 内嵌服务器
NMocker 使用 GCDWebServer 在 App 内启动轻量级 HTTP 服务器,提供 Web 控制台界面和 RESTful API。GCDWebServer 的优势在于:
自动处理 iOS 后台任务,防止 App 被系统挂起 支持异步响应和流式响应 轻量级,无额外依赖
3. SSE 实时通信
通过 Server-Sent Events 实现日志实时推送,相比 WebSocket 更轻量,且无需复杂的握手协议。
4. Mac 应用
原生 SwiftUI 应用,通过 libimobiledevice 支持 USB 直连,即使手机和电脑不在同一局域网也能使用。
如何集成?
通过 CocoaPods(推荐)
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. 可视化拦截的限制
可视化拦截虽然强大,但有一个众所周知的限制:无法拦截 WKWebView 中的请求。这是因为 WKWebView 运行在独立的进程中,不走 App 的 URL Loading System。
NMocker 主要面向 API 调试场景,针对的是 App 自身的网络请求。如果需要调试 WebView 内容,可以结合 WKNavigationDelegate 作为补充方案。
2. 多模式拦截策略
三种拦截模式的设计,让开发者可以根据场景灵活选择:
开发初期用 Eager 模式捕获所有请求 日常开发用 Adaptive 模式自动适应使用习惯 非调试时段用 Lazy 模式避免性能损耗
3. 跨平台控制台
Web 控制台基于 Vue 3 + TypeScript 构建,支持亮色/暗色模式自动适配,提供丰富的 JSON 编辑和查看功能。
Mac 应用则支持 USB 直连,无需依赖网络环境。
总结与展望
NMocker 的核心设计理念是 让网络调试更简单、更高效。通过可视化实现无侵入拦截,结合 Web 控制台和 Mac 应用,让开发者能够专注于业务逻辑,而不是在工具配置上浪费时间。
目前 NMocker 已经在 GitHub 开源,欢迎 Star 和贡献!
GitHub 仓库:https://github.com/CodansYC/NMocker
CocoaPods:https://cocoapods.org/pods/NMocker
*如果你对 NMocker 有任何建议或想法,欢迎在 GitHub 上提 Issue 或 PR!*
原创文章 · 作者:chao
欢迎转发,转载请联系作者
夜雨聆风