Unity3d防止按键劫持导致无法响应点击事件

起因
项目上线之后,接到一些玩家反馈,在登录界面点击没有响应,无法登陆的。小米,魅族等应用商店上的差评也大多集中于此:
Unity3d防止按键劫持导致无法响应点击事件_第1张图片
心里一万只草泥马在奔腾!!!

排查问题

首先,排查逻辑代码,找出是谁写的代码,大概会被拿去祭天吧!然而并没有,逻辑代码并没有问题。

然后,搜索相关的信息,也没什么有用的信息,直到无意中在Unity论坛中看到这篇文章: https://forum.unity.com/threads/5-6-1p2-breaks-touch-input.474030/
心态崩了,竟然是Unity3d的锅,如果最近有Unite,我觉得拿一只锅去参会!!!
Unity在某个版本为了解决按键劫持的问题,进行了一次改动:
(900191) - Android: Dropped obscured touch events to prevent tapjacking.
这个改动实在太不起眼,根本没有引起多少人的重视,然而影响却实在是爆炸!

当运行游戏时,一些全屏透明的app在后台运行,会被Unity3d判断为按键劫持,从而丢弃了按键事件。
典型的应用:
语音助手,如小米平台的小爱助手
调整屏幕亮度app,如google play下载量较大的Screen Dimmer

定位&解决
首先定位到unity3d的5.6.1升级到5.6.2解决了这个问题,由于表现是在unity3d逻辑之外就丢弃了按键事件,推测unity3d可能是在java层进行了修改。于是安装5.6.1和5.6.2并导出UnityPlayerActivity.java文件进行比对,差异比较中发现只有一个文件有差异:
Unity3d防止按键劫持导致无法响应点击事件_第2张图片

Unity3d防止按键劫持导致无法响应点击事件_第3张图片

Unity3d防止按键劫持导致无法响应点击事件_第4张图片

Unity3d防止按键劫持导致无法响应点击事件_第5张图片

如果drop按键事件就是这几行代码,那么这就是罪魁祸首了,王同学为了保险起见,在5.6.1版本下制作了unity安装包,并利用两份不同的UnityPlayerActivity.java,分别制作了安装包,安装到手机上,结果按钮依然无法点击。那么便证明了推断改动在java中是错误的,又做了无用功。

那么如何解决这个问题?只有升级版本这条路了。
1.开发组成员说以下三个版本及相应更新的版本已经移除了防止按键劫持的修改: Anti tapjack measures removed in: 5.5.4p2, 5.6.2p2, 2017.1.0f3  
由于我们使用的版本是5.4.5p4,而项目已经上线,上述的3个版本都至少跨越了一个大版本,我们并不敢轻易升级。后来无意中发现5.4.6f3也移除了防止按键移除的修改。
所以目前所知是四个版本及后续版本修复了该问题:5.4.6f3,5.5.4p2, 5.6.2p2, 2017.1.0f3 
2.去吐槽开发小哥吧!看帖子[ https://forum.unity.com/threads/5-6-1p2-breaks-touch-input.474030/]里外国人吐槽起来真是毫不留情

后记

这个问题本身很简单,排查起来却相当费时,如果其他团队能在上线前发现这个问题,处境就会主动地多,不会面临类似我们上线之后内心崩溃的状况。最后,希望大家都能做出好玩的游戏!




你可能感兴趣的:(Unity3d)