iOS 下,自定义协议导致的数据追踪失效。
问题描述
使用 Tauri@v2 开发的 iOS 应用。在使用 Firebase,GTM 等工具进行数据追踪时,出现数据时有时无的情况。
问题排查
已知情况:
- 数据追踪并非完全失效,而是时有时无。
- 应用开发采用 Tauri@v2 框架,Tauri 采用 WebView 来展示静态的 HTML 页面。
- 应用采用了热更新机制,即在启动时请求线上网站地址,若有新版本,则切换本地地址到线上地址。
- 在几次版本更新前,数据追踪正常有效,但版本更新后,数据追踪开始逐渐失效,直到下一个版本更新前,逐渐恢复。
- 应用整体功能,工作流程正常。
- 对数据追踪进行了判断,若数据追踪无法发送,则无法进行下一步流程,但流程正常进行,证明数据追踪有发送成功。
排查过程:
- 首先排查 GTM 是否正常加载生效,并对 DataLayer 对象进行轮询,若其中未包含相关事件,则不会进行下一步流程,但流程正常进行,证明 GTM 工作正常。
- GTM 工作正常,则需要排查是否发送成功。经过网络抓包,发现数据追踪的请求正常发送,且状态码 200,证明数据追踪服务器正常接收了该请求并返回响应。
- 在抓包过程中,发现携带参数中存在
tauri://localhost地址。经查询,这是 Tauri 及大多数使用 HTML 为页面的跨平台框架所采用的方案。- 简单来说,这些跨平台框架本质上是一个套壳的浏览器,但是它们不直接访问 HTTP,而是访问本地的 HTML 文件。
- 但本地文件不存在真实的网络地址,而采用
file://协议则会触发各类安全问题。 - 因此各框架不约而同的采用了自定义协议的方式,让 WebView 认为协议是安全的,并拦截协议来展示本地资源。
- 查询已有数据追踪数据,发现大部分数据来源均为线上地址,而不是本地
tauri://localhost地址。怀疑是本地自定义协议问题。 - 经查询,确认是自定义协议问题,在 Electron,Capacitor 等同样采用 Web 技术进行跨平台开发的框架均有此问题提出。原因是 GA 这些是基于标准的 HTTP/HTTPS 协议设计并开发的,尽管可以正常收发请求响应,但在最终处理时,将非标准的协议过滤了。谷歌官方的 IssueTracker 中已有提及此问题。
问题总结
因使用的 Tauri 框架采用的是自定义协议来展示 HTML 页面,使得 GA 等数据追踪工具在收集数据时将其过滤掉了。
而因为应用采用了热更新机制,使得本该需要通过自定义协议 tauri://localhost 访问的页面,通过标准的 HTTPS 协议访问了,GA 等数据追踪工具因此正常工作。这也是为什么在更新前后的数据追踪会时有时无的原因。
问题修复
有三种方案,分别如下:
- 因为是自定义协议的问题,那就不使用自定义协议,整体切换到线上 HTTPS 协议。
- 覆盖相关数据追踪的 SDK 初始化逻辑,将本地协议替换为标准协议,但某些 SDK 内部可能存在严格校验机制,使得覆盖无效。
- 使用谷歌官方提供的 Measurement Protocol 做一层中间层,首先将事件发送到后台,在由后台发送至 GA。
iOS 下,自定义协议导致的数据追踪失效。
https://www.inksha.com/archives/ios-xia-zi-ding-yi-xie-yi-dao-zhi-de-shu-ju-zhui-zong-shi-xiao