微信「快捷发图」功能到底发生什么事?
共 2965字,需浏览 6分钟
·
2021-10-10 21:47
微信昨天上了热搜,起因是有用户开启了iOS 15 的隐私新特性“记录App活动”,对所有App的隐私读取行为进行7天的监控,并使用App Privacy Insights对记录进行读取。
监控发现,微信在用户未主动激活App的情况下,在后台数次读取用户相册,每次读取时间长达1分钟。
对此,微信官方也给出了回应:
iOS系统为App开发者提供相册更新通知标准能力,相册发生内容更新时会通知到App,提醒App可以提前做准备,App的该准备行为会被记录成读取系统相册。
微信称,当用户授权微信可以读取“系统相册权限”后,为便于用户在微信聊天中按“+”时可以快捷发图,微信使用了该系统能力,使用户发送图片体验更快速流畅。上述行为均仅在手机本地完成,最新版本中微信将取消对该系统能力的使用,优化快捷发图功能。
那么问题来了,微信到底是在后台悄悄读取相册,还是确实如官方回复所说,只是iOS的机制导致?经过仔细研究,以及对相关技术专家的请教,得出以下结论。
简单来讲,该事件可用三句话解答。
1、整个热搜事件,指的都是微信"快捷发图”功能;
2、本次事件其实是iOS的系统机制造成的误解,iOS自己的接口提示App做相册更新预观察,而这个行为被iOS记录成App主动读取相册;
3、这是本地完成的动作,也没有必要上传。
关于更具体的细节问题,我们也进行了四个部分的全面分析。
1
热搜中提到的“微信相册功能”
指的到底是什么?
1
热搜中提到的“微信相册功能”
指的到底是什么?
这是微信里的“快捷发图”功能,指的是刚截的图,或者刚编辑好的图片,进入微信对话框按”+”时,右下角会出现“你可能要发送的照片”。
点击”+”即可弹出“你可能要发送的照片” ↑
2
微信有没有借此机会,
侵犯用户隐私呢?
2
微信有没有借此机会,
侵犯用户隐私呢?
依据现有证据来看,并不存在侵犯隐私的问题。
首先在微信的官方回复里提到了“上述行为均仅在手机本地完成”,意味着微信没收集、没上传、没使用。
其次,没必要。
也有博主也做了分析:
现在的摄像头像素越来越高了,屏幕分别率也越来越高了,意味着手机相机拍照和截屏的图片所占空间越来越大,再乘上数亿的活跃用户的量级…… 我看了下我刚清理过的相册,约30MB,因为很久没换手机,空间吃紧,所以我这个相册绝对是很少很少的了,按这个大小乘以微信12.5亿的月活,大概是3.5PB,这几乎是一个最小值,因为相册几百MB甚至上G的大有人在。 也就是说,至少需要数十PB的存储来干这件事,还冒着违反刚实行的数据安全法,侵犯用户隐私被巨额罚款的风险,以及企业的声誉风险,为了什么?
其实要验证也很简单,要扫描相册,有两种做法,一是直接上传,在云端分析,这会产生巨大的流量;二是本地分析上传,这会产生极大的耗电量。
经实验,拍了十几张照片放进相册,然后保持微信在前台。
吃了个饭,微信使用的流量和CPU使用时间都没有明显增加,使用一上午的微信,CPU才用了10分钟,基本都是发图或者放视频这些操作才会用到CPU渲染。
3
为什么微信会多次“访问相册”,
甚至夜间也会?
3
为什么微信会多次“访问相册”,
甚至夜间也会?
在这里,首先必须解释微信回应里提到的“相册更新通知”能力是什么?根据iOS官方文档(文档详见阅读原文),在照片相关处理接口里,专门有一节提到这个接口的能力。
简单来说,PHPhotoLibraryChangeObserver协议能让我们知道照片相册库中的改变。Photos会发送系统图片改变的消息,APP可以遵守PHPhotoLibraryChangeObserver协议,并通过 PHPhotoLibrary的registerChangeObserver方法将对象注册为观察者,实时接收照片改变的消息。
所以,确实是“iOS提供了这个相册更新通知的能力”没错,相册发生内容更新的时候会通知到 App,让App可以识别到改变的图片,实现原来需要扫描整个相册才能实现的功能。
但关键在于,这个“观察-通知”的行为在iOS 15里,被识别成了读取相册,就像是App一直在扫描相册一样。也就是说,iOS 15的隐私新特性“记录App活动”,把iOS自己的接口行为记录成了读取相册。而微信和淘宝、QQ都一样采用了这个iOS接口。
有了这个接口能力,就很好解释为什么微信会多次“访问相册”,甚至包括夜间也会。这就像iOS系统承担一个管家的能力,会不定时地对微信发出指令,提醒微信可以做一些预准备工作。
这里举个例子,比如你晚上12:00退出微信,12:05分拍了个照或者截了个图,然后就睡觉去了。半夜iOS可能会在cpu空闲期间,比如12:30唤醒微信,微信此时可以有几十秒的后台运行时间(这种后台唤醒机制叫background fetch,时机系统定,App无法控制);另一方面,由于微信订阅了相册更新通知事件,系统会回调微信说相册有更新,同时记录微信在12:30访问了相册。
实际上,这个cpu空闲时间唤醒微信的能力,和是否夜间无关,24小时都有可能触发,但一般大概率在夜间,因为你休息了,cpu才会比较空闲。
这个的优点就是,就是相当于你休息了,但是微信并没有休息。微信收到ios系统的指令,就像收到你的某个好友发来消息一样,就会立马开始投入准备工作。这就尽量保障了用户想要使用微信时可以更快速,用户体验更流畅。当然,这个也带来了一些弊端,就是可能有耗电耗流量的问题。
4
微信采用这个接口的目的是什么?
4
微信采用这个接口的目的是什么?
就是用在了上述的“+”号发图的微信聊天场景里。图什么呢?图的就是为了使用户发送图片体验更快速流畅。
从开发者角度看,这个功能是挺好用的,不用进入相册再选,直接通过这里就可以发出去。这样一个简单的小功能,在iOS里要自行实现起来可不容易。
按照最普通的逻辑,用户点了“+号之后,需要发送最近一张图,APP需要去扫描一轮相册,判别图片的新增顺序,找到最新一张图。部分开发者表示,在iOS系统里,这个“扫描”及“判别”的流程都比较久,性能不太稳定,比如iOS系统里,如果用户相册簿或照片数量过多,例如有些人会与家人之间共享照片簿,就会导致用户体验比较卡顿。
所以,微信通过另一种方式来保证“快捷发图功能的体验,即调用iOS提供的PHPhotoLibraryChangeObserver接口,通过提前观察用户相册是否发生变化,实现提前准备。
我们回过头来看iOS提供的这个PHPhotoLibraryChangeObserver,名字就是Observer,它就是一个观察者,通过观察相册是否发生改变,来实时快速通知App。
这里再做个简单的比喻,我关了一群小白鼠在笼子里,需要知道什么时候会有小白鼠去抓喂食器,但我们总不能一直盯着,这样太费电太麻烦。所以我在喂食器上绑了个铃铛,由铃铛来提醒我。
iOS观察者模式的作用,就类似这个铃铛,它会告知APP笼子里是否有小白鼠抓喂食器。这样APP能及时知道相册里有更新并做好准备,但实际上APP没有,也不需要一直盯着相册。
那些用推荐引擎改变世界的人
AI 人才越来越不值钱了吗?
解决中国“卡脖子”问题:研究求解器的少数者