当前位置 > 首页 > 案例分析 > 【分享】微信真的在后台频繁读取用户相册吗?

【分享】微信真的在后台频繁读取用户相册吗?

来源:中国数据分析行业网 | 时间:2021-10-11 | 作者:数据委

(以下文章来源于一个数据玩家的自我修养 ,作者GClover)

 

《数据安全法》和《个人信息保护法》落地以后,用户隐私越来越被大家所重视。这不,最近微信又上了热搜,起因是有用户开启了iOS 15 的隐私新特性“记录App活动”,对所有App的隐私读取行为进行7天的监控,并使用App Privacy Insights对记录进行读取。

 

 

监控发现,微信在用户未主动激活App的情况下,在后台数次读取用户相册,每次读取时间长达1分钟。

对此,微信官方也给出了回应:

 

iOS系统为App开发者提供相册更新通知标准能力,相册发生内容更新时会通知到App,提醒App可以提前做准备,App的该准备行为会被记录成读取系统相册。

 

微信称,当用户授权微信可以读取“系统相册权限”的前提后,为便于用户在微信聊天中按“+”时可以快速发图,微信使用了该系统能力,使用户发送图片体验更快速流畅。上述行为均仅在手机本地完成,新版本中我们将取消对该系统能力的使用,优化快速发图功能。

 

那么问题来了,微信到底是在后台悄悄读取相册,还是确实如官方回复所说,只是iOS的机制导致?

 

先说结论:
  • 本次事件其实是ios的系统机制造成的乌龙,iOS自己的接口,提示app做相册更新预观察,而这个行为被iOS记录成读取相册;
  • 从测试结果来看,至少证明微信回应的是真实情况;
  • 照片和聊天记录一样,存储在本地,要上传花费的代价太大,而且必然留下痕迹。

 

 

 

接下来我们一一拆解。首先,来验证一下微信官方说的这个“相册更新通知”能力是什么。

 

 

根据iOS官方文档:

https://developer.apple.com/documentation/photokit/phphotolibrary/observing_changes_in_the_photo_library/

在照片相关处理接口里专门有这一节:

这个接口干嘛用的呢,简单来说:

PHPhotoLibraryChangeObserver协议能让我们知道照片相册库中的改变。Photos会发送系统图片改变的消息,我们可以遵守PHPhotoLibraryChangeObserver协议,并通过 PHPhotoLibrary的registerChangeObserver方法将对象注册为观察者,时时接收照片改变的消息。

 

 

所以,确实是“iOS提供了这个相册更新通知的能力”没错,相册发生内容更新的时候会通知到 App,让App可以识别到改变的图片,实现原来需要扫描整个相册才能实现的功能。

 

 

关键在于,这个观察-通知的行为在iOS15里,被识别成了读取相册,就像是App一直在扫描相册一样。也就是说,iOS 15的隐私新特性“记录App活动”,把iOS自己的接口行为记录成了读取相册。

 

举个例子,比如用户晚上12:00退出微信,12:05分截了个图,或者拍了个照,然后就睡觉去了。半夜iOS可能会在cpu空闲期间,比如12:30唤醒微信,微信此时可以有几十秒的后台运行时间(这种后台唤醒机制叫background fetch,时机系统定,App无法控制);由于微信订阅了相册更新通知事件,系统会回调微信说相册有更新,同时记录微信在12:30访问了相册。

这个例子大体上还原了上述事件的整个过程。

抛开iOS自己的这个乌龙不说,微信为什么要用到这个能力呢?主要是为了实现这个功能:

 

刚截的图,或者刚编辑好的图片,进入微信对话框按”+”时,右下角会出现“你可能要发送的照片”,这个功能挺好用,至少对我来说,80%以上的发送图片,不用进入相册再选,直接通过这里就可以发出去。

 

然而这样一个简单的小功能,要实现起来可不容易。

 

打个比方,我要知道相册什么时候变化,也就是说,你有一张新产生或者编辑的图片,需要发送,难道我过一段时间就去扫描一遍相册,和上一个试点的相册清单比较一下吗?

 

这种方式,既要存储上次的相册信息,还要设置一个合理的扫描期限,设置多少才算好呢?

 

为了解决这类问题,软件开发里有一种设计模式叫做观察者模式。

 

举个栗子,我关了一群小白鼠在笼子里,但是笼子不太牢靠,有可能会被咬坏,那我就得加固。我想知道哪个笼子坏了,难道要定期巡视一遍吗,那不得累死,觉也睡不成了。

 

观察者模式,就是帮你雇佣一只猫,由猫来监视(观察)所有的笼子,当笼子被咬坏的时候,大叫一声通知你。

 

我们回过头来看iOS提供的这个PHPhotoLibraryChangeObserver,名字就是Observer,它就是一个观察者,通过观察相册是否发生改变,来实时的通知App。

 

有了这个接口,就可以很简单的实现上述功能了。

 

看到这里有人要说了,就算是使用了这个接口产生了这些相册读取记录,这也不能证明,微信没有趁着调用这个接口的时候,顺便扫描用户相册啊。

 

先来说说微信做这个事情有没有必要。

 

现在的摄像头像素越来越高了,屏幕分别率也越来越高了,意味着手机相机拍照和截屏的图片所占空间越来越大,再乘上数亿的活跃用户的量级……

 

我看了下我刚清理过的相册,约30MB,因为很久没换手机,空间吃紧,所以我这个相册是很少很少的了,按这个大小乘以微信12.5亿的月活,大概是3.5PB,这几乎是一个最小值,因为相册几百MB甚至上G的大有人在。

 

也就是说,至少需要数十PB的存储来干这件事,还冒着违反刚实行的数据安全法,侵犯用户隐私被巨额罚款的风险,以及企业的声誉风险,为了什么?多分析一些图片,卖点广告?

 

其实要验证也很简单,要扫描相册,有两种做法,一是直接上传,在云端分析,这会产生巨大的流量;二是本地分析上传,这会产生很大的耗电量。

 

我自己实验了一下,拍了十几张照片放进相册,然后保持微信在前台。

 

吃了个饭,微信使用的流量和CPU使用时间都没有明显增加,我用了一上午微信,CPU才用了10分钟,基本都是发图或者放视频这些操作才会用到CPU渲染。

 

大家如果还有所怀疑,也可以自己实验一下。从我自己的测试结果来看,我认为微信没有扫描相册并上传。

 

 

虽然微信不会读取相册全部内容,但是不代表其他App不会读取,我们的相册,信息量还是非常丰富的。

 

各类的自拍且不说,注册各类平台时,通过OCR扫描的身份证、银行卡照片,几乎都会留在相册里,除非你主动清除。

 

 

所以,经常清理相册还是相当有必要的,相册内容被获取的危害,可以参考数据玩家以前的文章。

 

至于哪些App会扫相册,大家可以按照上文中提到的方法实验一下,以自行实验的结果为准,独立思考,独立判断。