错误: iOS9中的_handleNonLaunchSpectActions

我在 iOS9上得到了以下错误:

    -[UIApplication_handleNonLaunchSpecificActions:
forScene:
withTransitionContext:
completion:] unhandled action ->
<FBSSceneSnapshotAction: 0x150b2aef0>
{
handler          = remote;
info = <BSSettings: 0x15333f650>
{
(1) = 5;
};
}

有没有其他人碰到过这个错误或者它的含义? 出了什么问题?

11478 次浏览

你的代码没有任何问题。这是苹果内部的一条日志信息,你应该提交一份关于它的雷达文件。

有两个迹象表明这是 可能吧苹果的代码:

  1. 方法名称 _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion前面的下划线是一个约定,表明该方法是声明它的类的私有/内部方法。(见 此评论)

  2. 我们有理由猜测,FBSSceneSnapshotAction中的两个字母前缀是 FrontBoard 的缩写,根据 Rene Ritchie 在“ IOS9愿望清单: 客户模式”是与启动应用程序相关的整个软件家族的一部分:

在 iOS8中,苹果将其系统管理器 SpringBoard 重构为几个更小、更集中的组件。除了已经剥离出来用于处理后台任务的 BackBoard 之外,他们还增加了 Frontboard 用于处理前台任务。他们还添加了 PreBoard,以便在安全、加密的条件下处理锁屏。[...]

我不知道 BSSettings中的 BS前缀是用来干什么的,但是对这个日志消息的分析将表明它不是您所做的任何事情,并且您应该提交一个带有步骤的雷达来重现日志消息。

如果想尝试获取堆栈跟踪,可以实现 链接到这里的分类。有些人可能会认为重写私有 API 是一个坏主意,但在这种情况下,临时注入以获取堆栈跟踪不会太有害。

编辑:

但是,我们仍然想知道这个行动是什么。因此,我在 -[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]上设置了一个断点,并开始打印寄存器值,发现了一个名为 FBSceneImpl的类,其中包含了关于我的应用程序的大量信息:

Scene

我们能够找出接下来调用哪个私有方法(存储在程序计数器的寄存器15中)

Program Counter

我试图找到日志中引用的未处理的 FBSceneSnapshotAction,但没有结果。然后,我对 UIApplication 进行了子类化,并覆盖了 _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion。现在我能够直接看到那个动作,但是,我们仍然不知道那是什么。

然后,我再次查看了 FBSceneSnapshotAction,发现它有一个名为 BSAction的超类。

然后我编写了类似于 RuntimeBrowser一个工具,并查找了 BSAction 的所有子类。事实证明,他们的名单很长:

Action List

我们有两个方法名(一个来自日志,一个来自设备上的程序计数器) ,它们表明这些操作用于在系统中传递操作。

一些操作可能被发送到应用程序委托的回调,而其他操作则在内部处理。

这里发生的情况是,有一个操作没有得到正确处理,系统正在记录它。显然我们不该看到的。