目前无法连接其他 iOS 设备
我开始在真实的 iPhone 上与 whatsmeow 进行一致的配对失败。这种故障只在以下条件下才能重现: 客户端通过 gomobile 绑定到一个 xcframework,并在真实的 iPhone (arm64) 上运行。TLS 连接以默认的 whatsmeow 方式打开 - 通过 Go 的 crypto/tls (或通过 utls 而不进行进一步调整)。WebSocket 升级 HTTP 头是 coder/websocket + whatsmeow 本身注入的默认值 (没有 User-Agent、没有 Sec-Fetch-*、没有 Cookie)。重现过程 使用基于 whatsmeow 的应用程序在真实的 iPhone 上有一个空的商店。通过 GetQRChannel + Connect 生成一个 QR 码。使用官方 WhatsApp 应用程序在手机上扫描 QR 码。官方客户端返回"当前无法链接新设备"。等待一小时,重试 - 包括清除应用程序 + 重新安装、不同的 (今天未被触及) WhatsApp 帐户、在 Wi-Fi 和蜂窝之间切换。每次都出现相同的错误。同时在同一台 Mac 上在 Safari 中打开 web.whatsapp.com,并使用同一帐户扫描 QR 码 - 配对在第一次尝试中成功,没有错误。关键观察 以下更改不会解决问题: 将 whatsmeow 更新到最新提交或回滚到以前的版本 (测试了 pre-passkey 37913c82b711 和当前的 b572e5bcb92b)。交换传递给 PairPhone 的 PairClient 值 (Chrome / Safari / OtherWebClient - 三者行为相同)。设置 store.DeviceProps.RequireFullSync = true。在 DeviceProps 中覆盖 PlatformType 和 Os (尝试了 CHROME/SAFARI、Mac OS X / iOS 组合)。通过 Delete App 删除 identity_key 并重新安装。切换 Wi-Fi、蜂窝和不同的 IP 地址。使用一个今天没有配对尝试的干净的 WhatsApp 帐户。在 Info.plist 中添加 NSAppTransportSecurity 异常。请注意,只要 whatsmeow HTTP 客户端发送的请求与真实浏览器发送到 wss://web.whatsapp.com/ws/chat 的请求相同,模拟器和真实设备就能完全重现。唯一帮助的事情是使 WebSocket 升级请求与真实浏览器发送到 wss://web.whatsapp.com/ws/chat 的请求完全相同。我通过 mitmproxy 从真实的 Chrome / Safari 会话中捕获了完整的升级请求,并将其与我们的请求进行了比较。结果如下: 我们没有发送 Sec-WebSocket-Extensions: permessage-deflate (浏览器总是添加此项)。我们缺少 Accept: */*,Accept-Encoding: gzip、deflate、br、zstd、Priority: u=3、i。我们缺少 Cookie: wa_web_access_token=…; wa_ul=…; wa_web_lang_pref=en_US - 浏览器从 GET https://web.whatsapp.com 上的 Set-Cookie 中获取这些值。Sec-Fetch-Dest 为空而不是 websocket,Sec-Fetch-Site 为跨站点而不是同源。User-Agent 完全缺失,因此 Go 采用默认值 Go-http-client/1.1。在 HTTP 客户端中,我通过 SetPreLoginHTTPClient / SetWebsocketHTTPClient 执行了以下操作: 明确设置每个头以匹配 Safari 26.5 / Mac OS X 10_15_7…
内容来源: tulir/whatsmeow