为什么会有这个需求呢?起因就是微信,旧版本有更新时,会弹个弹窗,询问要不要更新,拒绝掉就可以保持版本。但新版本变坏了,设置里有个禁止自动更新的开关,即便是关掉,当有新版本时,它还是会自动后台下载,在某次不经意间的重启后,它就自动替换旧版本,完成了更新,不给你选择的机会。
发现这个现象后,我就开始关注这些应用的更新操作,发现Arc浏览器也是如出一辙,自动更新这个开关形同虚设,在这些应用看来,就算天塌了,我该更新也要更新。
但是大多新版本对我而言,都没什么吸引力,无非是增加了一些功能,优化了一些使用体验,也可能呢移除了一些我正在使用的功能。如果我真的需要,我会手动更新的,这个应用装到了我的设备上,那就该我说了算。
一番查证,发现了 2 个思路可以禁止自动更新的操作:
1. 思路1
自动更新前,它会先把新的安装包,一般都是个app结尾的文件提前下载到缓存目录,路径如下:
1 | /Users/用户名/Library/Caches/应用包名/ |
只要将这个目录的写权限禁止掉,那么就无法下载了,继而无法安装。
1 | chmod -R 500 /Users/用户名/Library/Caches/应用包名/ |
在修改权限后,Arc 浏览器会提示我升级失败,遇到问题,说明奏效了,因为它无法下载。但是微信却没有任何提示,本就是后台偷偷摸摸在做,出了错不提示也正常。
但这种方式有个特点,重启之后,Cache目录会清空,应用启动后,会重建对应的应用包名的目录,然后权限就重置了,如果需要的话,还需重新设置一下权限。
2. 思路2
每个应用对应的app文件,本质就是个文件夹,可以右击选择查看包内容。升级时,是将新的app文件,直接替换旧的,这个方式是给app文件改标记,增加不可以修改,这样就无法替换了,比如,禁止微信更新:
1 | sudo chflags -R uchg /Applications/WeChat.app |
这个操作比chmod的权限更高一些,执行前需要彻底关闭应用,同时还需要给执行命令的终端窗口开启完全磁盘访问的权限,不然可能无法访问到app内的文件,导致修改失败。
执行完之后,可以查看是否成功,如果输出结果中有uchg标记,表示成功,同时,当再次打开app后,会发现dock中的应用图标左下角多了一个锁的小图标。
1 | ls -lO /Applications/WeChat.app |
如果想接触这个标记,可以通过下面的命令,验证方式同上。
1 | sudo chflags -R nouchg /Applications/WeChat.app |
3. 追加
真的很难明白,新版本到底有什么好,竟让它如何迫切想要升级,搞不懂。
即便是锁定了版本,它还是每次一启动就会下载新版本的 dmg 安装文件,下载完就弹窗提示安装升级,关掉之后,过一会又会弹,不胜其烦。
临时解决方式就是,将弹窗最小化,这样当它又想弹的时候,发现上一次的还在,它就不弹了。
当然,还有一种解决方式:禁止下载。观察了一会,看看哪个链接在占满下载带宽,就很容易找到了它的下载域名,将其禁掉之后,发现就不下载了。
禁掉还有个好处:节省流量和带宽,既节省它的也节省自己的。因为每次启动都会下载一遍,就算上一次已经下载好了,也会直接删掉,然后重新下载。
所以每次启动都会看到下载带宽被拉满了在跑,现在的安装文件已经快 600MB 了,它也真是不心疼 CDN 流量,一个用户一天启动10次,就会跑将近 6GB 的流量,这么多用户不知道要跑多少流量。
目前我这里的下载域名是:dldir1v6.qq.com,直接加到 REJECT 的规则里就可以,这个可能会变,不过也没关系,当发现失效了,就把新的也加上就好了。
最后再补充点,上面提到过,一般应用会把安装包下载到:
1 | /Users/用户名/Library/Caches/应用包名/ |
但是微信不太一般,下载完成之后竟然没在这里面找到,翻了半天,终于找到它把蛋下哪去了,原来是沙盒里,藏的还挺深:
1 | /Users/用户名/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/应用包名/ |