BrowserState.db中last_viewied_time字段解析(再次探讨)
在最近几周,又有几位检验人员联系我讨论这个问题。显然仍存在一些困惑,因此我认为应该做一个简要更新来澄清。
正如我之前所述,BrowserState中的last_viewed_time是标签页获得焦点的时间。数据库中显示的URL和标题与该标签页中最近访问的页面相关。
不同iOS版本在记录写入时间上存在差异,但时间戳的含义似乎是一致的。
iOS 14及以下版本测试
iOS 12、13、14在创建标签页时都会立即创建BrowserState记录,并在导航发生时持续更新URL和标题字段。当标签页获得或失去焦点时,时间戳会更新。
测试过程:
- 我在9:21打开一个标签页并搜索"9:21"。BrowserState记录立即创建。时间戳和URL/标题都显示9:21
- 在9:22,我搜索"922"并再次检查数据库
- 可以看到标题已更新,但last_viewed_time仍保持9:21
- 然后我完全关闭Safari,在9:23重新打开并搜索"923"。检查数据库显示更新的时间戳和标题
- 关闭标签页并再次检查数据库显示数据完全没有变化
iOS 15及以上版本测试
在iOS 15、16、17和18 Beta中,记录不会立即在BrowserState数据库中创建,因此永远不需要更新。似乎所有内容都存储在RAM中,只有在标签页关闭时才写入数据库。但同样,last_viewed_time是标签页获得焦点的时间。
测试过程:
- 我在10:23创建标签页并搜索"1023"。检查数据库,没有记录
- 在10:24,我关闭标签页并重新检查数据库
- 在10:25我创建新标签页并搜索"1025"
- 在10:26,我使用同一标签页搜索"1026"
- 然后我关闭标签页并检查数据库
如您所见,last_viewed_time仍然反映标签页获得焦点的时间,URL和标题与最近访问的页面相关。
标签页焦点?
标签页获得焦点可能有几种不同原因:
- 标签页被创建并因此获得焦点
- Safari被关闭(不是后台运行)并重新打开。重新打开导致标签页获得焦点
- 在标签页之间切换。被带入视图的标签页获得焦点。被移出视图的标签页会更新(但这只有在标签页在没有再次获得焦点的情况下关闭时才会反映)
- 关闭标签页 - 这里有个重要说明。被关闭的标签页不会更新。但是,关闭一个标签页的过程会导致另一个标签页获得焦点,因此获得焦点的标签页会更新
场景分析
这可能导致一些值得单独查看的有趣场景。
场景1 假设我在10:00打开标签页并搜索"1000"。last_viewed_time继承标签页获得焦点的时间(在这种情况下是标签页创建时),即10:00。 然后我将Safari最小化一小时,在11:00重新打开。最小化/最大化不影响焦点,因此没有时间戳更新。 我可以关闭标签页,记录将显示last_viewed_time为10:00和"1000"的搜索,使其看起来准确。
场景2 与之前设置类似。在10:00打开标签页并搜索"1000"。然后我关闭Safari,一小时后打开。 从关闭状态打开Safari确实会更新时间戳。因此时间戳现在显示11:00。我关闭标签页,记录以11:00的时间戳和"1000"的搜索词写入。这显然不准确,使得"1000"的搜索看起来是在11:00进行的。
场景3 仍然保持相同的设置,在10:00打开标签页并搜索"1000"。 这次,我保持Safari打开一小时,每分钟进行一次新搜索。因此我在10:01搜索"1001",10:02搜索"1002",依此类推。 在11:00我进行最后一次搜索"1100"并关闭标签页。 在整个小时内,同一标签页一直处于焦点状态,因此时间戳从未更新。 数据库中的记录将显示last_viewed_time为10:00和最近访问的URL"1100"。这也不准确,使得我搜索"1100"看起来是在10:00进行的。
场景4 最后,坚持相同的前提,我在10:00打开标签页并搜索"1000"。我将Safari最小化一小时。在11:00我最大化Safari并搜索"1100"。同样,由于最小化/最大化不会导致重新获得焦点,last_viewed_time保持10:00但URL显示最近的值"1100"。这与场景3有相同结果,使得我搜索"1100"看起来是在10:00进行的。
时间线
我还将以时间线形式呈现数据,希望能进一步澄清。 此表试图显示last_viewed_time、URL和标题在内存和/或数据库中的状态(取决于iOS版本)。
| 时间 | 操作 | 标签页焦点事件 | 导航事件 | 结果 |
|---|---|---|---|---|
| 10:00 | 打开标签页。搜索"1000" | 是 | 是 | last_viewed_time: 10:00 URL: 与"1000"搜索相关 Title: “1000” 这很容易被误解为last_viewed_time与URL之间的关联。但这只是巧合。 |
| 10:05 | 在同一标签页搜索"1005" | 否 | 是 | last_viewed_time: 10:00 URL: 与"1005"搜索相关 Title: “1005” 这可能被误解为"1005"搜索发生在10:00。 |
| 10:10 | 最小化Safari | 否 | 否 | last_viewed_time: 10:00 URL: 与"1005"搜索相关 Title: “1005” 无变化。 |
| 10:15 | 最大化Safari | 否 | 否 | last_viewed_time: 10:00 URL: 与"1005"搜索相关 Title: “1005” 无变化。 |
| 10:20 | 搜索"1020" | 否 | 是 | last_viewed_time: 10:00 URL: 与"1020"搜索相关 Title: “1020” 这可能被误解为"1020"搜索发生在10:00。 |
| 10:25 | 关闭Safari | 否 | 否 | last_viewed_time: 10:00 URL: 与"1020"搜索相关 Title: “1020” 无变化。 |
| 10:30 | 打开Safari | 是 | 否 | last_viewed_time: 10:30 URL: 与"1020"搜索相关 Title: “1020” 这可能被误解为"1020"搜索发生在10:30。 |
| 10:35 | 打开新标签页(标签页2) 搜索"1035" |
是 | 是 | 标签页1:last_viewed_time: 10:30 URL: 与"1020"搜索相关 Title: “1020” 标签页2:last_viewed_time: 10:35 URL: 与"1035"搜索相关 Title: “1035” 创建新标签页但不影响原始标签页。 |
| 10:40 | 关闭标签页2 导致标签页1重新获得焦点 |
是 | 否 | last_viewed_time: 10:40 URL: 与"1020"搜索相关 Title: “1020” 原始标签页的last_viewed_time更新,这可能被误解为"1020"搜索发生在10:40。 |
| 10:45 | 搜索"1045" | 否 | 是 | last_viewed_time: 10:40 URL: 与"1045"搜索相关 Title: “1045” 这可能被误解为"1045"搜索发生在10:40。 |
希望上述场景和表格能够证明,在某些情况下:
- last_viewed_time比URL和标题字段的内容更新(如10:30和10:40的情况)
- last_viewed_time比URL和标题字段的内容更旧(如10:05、10:20和10:45的情况)
本质上,last_viewed_time值可能在实际URL访问时间之前或之后。这使得这个时间戳完全不可靠。
总结
这个数据记录的好处是它非常容易自行测试。BrowserState.db包含在加密的iTunes备份中,因此您甚至不需要高级提取工具。