-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[UIKit Bug] App 处于后台时修改 UIAppearance 里 UIImage 类型的属性很大几率导致第三方键盘 crash #1281
Comments
我也遇到了这个问题,我屏蔽了[在后台切换主题]的代码之后就没有用户反馈过了。不知是不是同样的问题。 |
连接真机,通过系统控制台可得知在出现 bug 现象时,第三方输入法会收到内存警告,在没使用 QMUI 的 App 之间互相切换不会引起这个内存警告,证明是 QMUI 里的某些代码引起该问题。 自己创建一个 Custom Keyboard Extension,按照 issue 的重现步骤操作后,我们的输入法确实遇到了系统内存限制的报错(上限 66MB,不同的 iOS 版本、iPhone 设备,该上限不同,所以老旧机器更容易触发该现象)。 在不断重复的测试过程中可看到,宿主应用(Host App,也即当前正在使用键盘的 App)更新 UIAppearance 的行为会通信给第三方键盘: 进而对 UIAppearance 中 UIImage 类型的对象进行反序列化: 通过在第三方键盘 Target 里 hook 而且按地址过滤后可看到其中有大量重复的 image 操作,这现象明显是异常的。 以 QMUI Demo 为例,通过这些图片的 结合上述的 crash 堆栈,尝试将上面截图里的①注释掉,发现问题得到解决。 将 backgroundImage 以 UINavigationBar.appearance 的方式使用是一个常规的操作,本身应该没问题,而问题出现在切换 App 时,此时 QMUI 会重新应用配置表,再走一次 UIAppearance 的更新,猜测可能是时机问题引起的。于是新建一个空项目,在 到这里该 Bug 可以定性为系统 Bug:在 App 处于后台时修改 UIAppearance 里的 UIImage 类型的属性,会导致第三方键盘在短时间内异常进行大量 UIImage 的反序列化操作,最终触达系统对输入法分配的内存上限,输入法 crash。 进一步测试可知几个信息点:
至此该系统 Bug 的解决方式就很清晰了:在设置 UIAppearance 前判断当前 App 是否在后台(建议监听 UIApplicationDidFinishLaunchingNotification、UIApplicationWillEnterForegroundNotification 等通知,而非判断 UIApplicationState,因为当 App 启动时走到某些类的 +load 方法时,UIApplicationState 为 Active,但走到 AppDelegate 的 didFinishLaunching 时又变成 Inactive 了),是则不设置。 |
已发布 4.3.0 修复该问题。 |
Bug 表现
crash.mov
预期的表现
不管进行多少次 App 间的切换,都不应该导致第三方输入法频繁被杀掉。
其他信息
The text was updated successfully, but these errors were encountered: