IOS9情节串连图板什么是未处理的动作(handleNonLaunchSpectictions) ?

我注意到在使用情节串连图板时,在 iOS9上运行我的应用程序时,控制台中出现了以下错误。我用的是 xCode7。我需要担心这个吗?

-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> {
handler = remote;
info = <BSSettings: 0x176a5d90> {
(1) = 5;
};
}
11538 次浏览

AFAIK,上面的信息是在屏幕快照时与 iOS 相关的(我认为是双击主页多任务相关的行为)。我深入调查了我的申请,似乎没有得到任何副作用。你可以暂时无视它。

您可以使用以下 主旨简单类别来测试对上述函数的调用:

我已经弄明白了,它将发生当您有 IBAction 方法声明在。或者。M 文件,但没有将其绑定到任何控件。

例如:

- (IBAction)click:(id)sender{
}

但没有将此方法分配给故事板中的任何控件。

还没有找到它为什么会发生在我的应用程序中,但至少你可以捕捉到异常,如果你想保持这从弹出在您的日志窗格。这不是一个解决方案,但是通过检查 catch 中传递的任何参数,它可以让您更深入地了解为什么会发生这种情况。

Swift 2版本:

import UIKit


extension UIApplication {
func _handleNonLaunchSpecificActions(arg1: AnyObject, forScene arg2: AnyObject, withTransitionContext arg3: AnyObject, completion completionHandler: () -> Void) {
//whatever you want to do in this catch
print("handleNonLaunchSpecificActions catched")
}
}

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

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

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

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

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

我不知道 BSSettings中的 BS前缀是用来干什么的,但是

BSBackBoard Settings的简写,对这个日志消息的分析将表明它不是您所做的任何事情,并且您应该将一个带有重现日志消息步骤的雷达归档。

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

编辑:

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

Scene

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

Program Counter

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

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

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

Action List

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

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

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