iOS9故事板什么是未处理的动作(handleNonLaunchSpecificActions)?
我注意到在使用故事板时在iOS 9上运行我的应用程序时,在控制台中popup以下错误。 我正在使用xCode7。 这是我需要关心的吗?
-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action -> <FBSSceneSnapshotAction: 0x176bfb20> { handler = remote; info = <BSSettings: 0x176a5d90> { (1) = 5; }; }
你的代码没有问题。 这是苹果内部的日志消息,你应该提供一个关于它的信息。
有两个提示显示这可能是苹果的代码:
-
_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
方法名称的下划线_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
是一个约定,表示该方法对于声明的类是私有的/内部的。(请参阅此注释 。 -
猜测
FBSSceneSnapshotAction
中的双字母前缀是FBSSceneSnapshotAction
的简写是合理的,根据Rene Ritchie在“ iOS 9愿望清单:访客模式”中所述,是与启动应用相关的整个软件家族的一部分:
在iOS 8中,苹果公司将其系统pipe理器SpringBoard重组为几个更小,更集中的组件。 除了已经分离出来处理后台任务的BackBoard之外,他们还为前台任务添加了Frontboard。 他们还增加了PreBoard来处理安全,encryption条件下的锁屏。 […]
我不知道 BSSettings
的BS
前缀是什么,但是
BS
是BackBoard Settings
缩写,对这个日志消息的分析表明它不是你所做的任何事情,你应该向雷达提供步骤来重现日志消息。
如果你想尝试抓取一个堆栈跟踪,你可以实现链接到这里的类别 。 有人会认为重写私有API是一个坏主意,但在这种情况下,暂时注入来获取堆栈跟踪不会太有害。
编辑:
但是,我们仍然想知道这个动作是什么。 所以我把一个断点放在-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]
并开始打印出寄存器的值,并find一个名为FBSceneImpl
的类,它包含了大量有关我的应用程序的信息:
我们可以找出下一个被调用的私有方法(存储在程序计数器,指令指针,寄存器15中)
我试图find日志中引用的未处理的FBSceneSnapshotAction
,但没有骰子。 然后,我分类UIApplication,并覆盖_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
。 现在我可以直接得到这个动作,但是我们仍然不知道它是什么。
然后,我再次查看了FBSceneSnapshotAction。 原来它有一个名为BSAction
的超类。
然后我写了一个类似于RuntimeBrowser 的工具 ,查找了BSAction的所有子类。 事实certificate,有相当多的列表:
我们拥有的两个方法名称(一个来自日志,另一个来自设备上的程序计数器)表明这些操作在引擎盖下用于在系统周围传递操作。
有些操作可能发送到应用程序委托的callback,而其他操作是内部处理的。
这里发生的是有一个处理不正确的操作,系统正在注意它。 显然,我们不应该看到它。
AFAIK,上面的信息是在快照屏幕(我想为双击家庭多任务相关行为)iOS相关的。我深入调查了我的应用程序,似乎没有得到任何一方的行为。 现在你可以放心地忽略它。
您可以使用下面的要点简单的类别来testing自己对上述函数的调用:
我已经想通了,当你在.h或.m文件中声明了IBAction方法时,会发生这种情况,但是你没有将它绑定到任何控件上。
.m例子:
- (IBAction)click:(id)sender{ }
但是并未将此方法分配给故事板中的任何控件。
还没有find为什么它发生在我的应用程序,但至less你可以捕捉exception,如果你想保持这popup在你的日志窗格。 这不是一个解决scheme,但它可能会让你更清楚地知道为什么它会通过检查传入的任何参数来检查。
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") } }