{"repo":"Shitsuten/pocket-browser","free":true,"listed":false,"github":"https://github.com/Shitsuten/pocket-browser","clone":"git clone https://github.com/Shitsuten/pocket-browser.git","description":"Protected remote debugging bridge for an existing iOS WKWebView","language":"Swift","stars":27,"topics":["ai-agent","automation","ios","nodejs","remote-control","swift","websocket","wkwebview","claude","web-automation"],"license":"GPL-3.0","category":"mobile-apps","readme_excerpt":"pocket-browser · 口袋里的浏览器 把手机 app 里已经存在的 WKWebView ，接成一条受保护的远程调试/自动化通道。 指令从服务器发出，手机里的网页执行打开链接、运行 JS、截图、读取 DOM 等动作，结果原路传回。你的 app 仍然负责 WebView、登录态、数据存储和 UI；pocket-browser 只负责把“控制端”和“手机里的 WebView”连起来。 它解决什么问题 用无头浏览器（Playwright/Puppeteer）调试移动端页面、已登录页面或强依赖真实 WebKit 行为的页面时，经常会撞上两堵墙： - 环境偏差 ：数据中心 IP、桌面 UA、无头运行时和真实 iPhone 上的 WebKit 行为不一致。 - 常开成本 ：要么养一台一直开着的机器，要么在自己电脑上挂个隧道，电脑一睡，链路就断。 pocket-browser 换了个思路： 执行端就用你随身的手机 。 - 真机、真 Safari 内核（WKWebView）、真移动 UA、真实网络环境。 - 你登录过的站点，cookie 就在这个 WebView 里，不需要在服务器上重新处理登录态。 - 手机本来就随身带、随时在线，不用额外养机器。 架构 - server （ server/server.mjs ）：一个很薄的中转。手机通过 WebSocket 连上来注册（只保留最新一个连接）；控制端通过 HTTP POST /pocket/cmd 下指令，server 把指令转发给手机，等结果回来再返回。约 100 行，无状态。 - 手机 app （ ios/PocketClient.swift ）：把你已有的 WKWebView 交给 WebSocket 客户端。收到指令 → 在 WebView 上执行 → 回传结果。参考实现一个类、一行接入。 适合接入什么样的 app pocket-browser 不是一个完整浏览器壳，也不要求你新建 WebView。最适合的场景是：你的 app 里本来就有一个 Browser 页面，只缺一条受控的远程调试通道。 严格说， 任何你能持有引用并在主线程操作的 WKWebView 都可以接入 ： - 如果它只是登录页、帮助页、Web 内容页，pocket-browser 也能对当前页面执行 js/html/screenshot 。 - 如果你想远程打开任意 URL、保留历史、管理 cookies、运行脚本、处理下载和弹窗，那就需要 app 侧本来有一个更完整的 Browser 壳。 - pocket-browser 不负责创建 tabs、地址栏、cookie UI、下载 UI 或指纹配置；这些应该留在你的 app/browser 模块里。 如果你还没有内置浏览器，可以先看这个参考实现：satyricon-browser — 一个 iOS SwiftUI app 内 WKWebView 浏览器模块的实现教学，包含持久 cookie、bookmarklets、下载、历史、设置页和基础隐私加固。 接入时建议： - 复用当前正在显示的 WKWebView ，不要为了远程控制另起一个隐藏 WebView。 - 如果你希望保留登录态，用 WKWebsiteDataStore.default() ；如果你希望一次性会话，用 non-persistent data store。 - token 放 Keychain 或你自己的 secret storage，不要写进 Swift 源码。 - 连接动作做成显式开关或调试设置项，不要在页","default_branch":null,"files":null,"tree":[],"storefront":"/r/Shitsuten","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/Shitsuten/pocket-browser/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}