iOS9故事板是什么未处理的动作(handleNonLaunchSpecificActions)?


84

当我使用情节提要在iOS 9上运行我的应用程序时,我注意到控制台中弹出以下错误。我正在使用xCode7。这是我需要关注的事情吗?

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

苹果说iOS 9是关于稳定性的,所以我想你应该不用担心;-) PS我也有同样的问题,还有其他一些开发者stackoverflow.com/questions/32344082/…–
罗马

11
不知道它是否与情节提要相关,我也可以在非Storyboard应用程序中看到它。
koen 2015年

版本中是否还有其他警告?也许这是一个微不足道的警告?
Joe Susnick

我不使用情节提要,也收到此警告。当您使用CMD + L锁定模拟器,然后“滑动解锁”以返回应用程序时,它会弹出。
SDW

查看设备日志,可能与自动关闭设备屏幕有关。该行SpringBoard[54] <Warning>: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off.记录在引用的错误消息之前。
基督教徒

Answers:


32

您的代码没有错。这是Apple内部的一条日志消息,您应该对此进行归档。

有两个提示表明这可能是Apple的代码:

  1. 方法名称前的下划线_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion是一个约定,表示该方法在声明其的类中是私有的/内部的。(请参阅此注释。)

  2. 可以合理地猜测其中的两个字母前缀FBSSceneSnapshotAction是FrontBoard的简写,据Rene Ritchie在“ iOS 9愿望清单:访客模式”中所说,它是与启动应用程序有关的整个软件家族的一部分:

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

我不知道BS前缀BSSettings是什么意思,但是

BS是的简写BackBoard Settings,对该日志消息的分析将表明您没有做任何事情,您应该向雷达提交带有重现日志消息的步骤的步骤。

如果要尝试获取堆栈跟踪,可以实现链接到here的类别。有人会争辩说,重写私有API是一个坏主意,但是在这种情况下,临时注入来获取堆栈跟踪不会太有害。

编辑:

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

现场

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

程序计数器

我尝试FBSceneSnapshotAction在日志中找到未处理的引用,但没有骰子。然后,我将UIApplication子类化,并覆盖_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion。现在我可以直接采取行动了,但是,我们仍然不知道这是什么。

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

然后,我编写了一个类似于RuntimeBrowser的工具,并查询了BSAction的所有子类。事实证明,其中有很多列表:

行动清单

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

有些动作可能会发送到应用程序委托的回调中,而其他动作则在内部进行处理。

这里发生的是,有一个动作未正确处理,系统注意到了。显然,我们不应该看到它。


很好的调查,但是这里有一些有趣的事情,在使用私有Apple API时,我得到了确切的OP错误。我猜因为我正在使用私有API,所以我可能会获得苹果工程师的控制台日志。
OhadM'2

1
@Moshe苹果公司为您的调查支付了多少费用?但是他们可能对此不感兴趣。:p
codelearner

“提起诉讼”是什么意思?
Paul Masri-Stone

这意味着要使用Apple的错误报告器工具提交错误报告。
Moshe

12

AFAIK,以上信息与屏幕快照期间的iOS有关(我想是双击家庭多任务相关的行为)。我对我的应用程序进行了深入调查,似乎它没有任何副作用。您可以暂时忽略它。

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


1

我已经弄清楚了,当您在.h或.m文件中声明了IBAction方法但没有将其绑定到任何控件时,它将发生。

.m示例:

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

但未将此方法分配给情节提要中的任何控件。


我的应用程序中不是这种情况-我没有任何未绑定的IBAction,我也收到此消息。我的应用程序是Swift应用程序。
henrikstroem

1

还没有找出为什么它会在我的应用程序中发生,但是,如果您想避免在日志窗格中弹出该异常,至少可以捕获该异常。这不是一个解决方案,但是它可以通过检查在catch中传递的任何参数来为您提供更多原因,以了解为什么要进行嵌套。

迅捷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")
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.