SpringBoard 是 iOS 管理主屏幕的程序,在越狱比较流行的时候,SpringBoard 经常被用来修改美化桌面等等。但是随着 iOS 系统的完善,很多功能和 API 也都有了,越狱也越来越没有必要了,平时开发中也没怎么接触过 SpringBoard,最近在项目中遇到一个非常诡异的 bug,我们的 App 点击锁屏中的推送,然后解锁手机后,打开 App 会直接导致 SpringBoard 重启。

因为是点击推送导致的 bug,首先我 Google 了几乎所有和推送相关的网页,都没能找到答案。升级了 Push 的 SDK,也检查了 iOS11 的更新内容,没有发现和推送相关的变更。其他家的 App 都挺正常,看来应该不是 push 的问题。

其次我观察了启动时的内存,CPU 的使用情况,都比较正常,没有暴涨的情况。

由于是在冷启动的时候才能复现这个 bug,直接通过 Xcode Run 是没法打断点的。所以我在 Debug 中使用 Attach to process by PID or Name 来监听 App 启动,这样就可以打断点了。

虽然打了断点,但是有时候连 didFinishLaunchingWithOptions 这个方法也进不来。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}

有时候会崩到 didFinishLaunchingWithOptions 中设置 rootViewController 附近,将断点打到这里,一步一步调试,最后发现原来是一个过期方法的锅。

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait| UIInterfaceOrientationLandscapeLeft|UIInterfaceOrientationLandscapeRight];

这个方法在 iOS9.0 已经弃用了!看来后面得找个办法把项目中过期的方法都清理一遍了。