84

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

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

4 回答 4

32

您的代码没有任何问题。这是 Apple 内部的一条日志消息,您应该提交有关它的雷达。

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

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

  2. 有理由猜测 in 的两个字母前缀FBSSceneSnapshotAction是 FrontBoard 的简写,根据 Rene Ritchie 在“ iOS 9 愿望清单:访客模式”中的说法,它是与启动应用程序相关的整个软件系列的一部分:

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

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

BS是 的简写BackBoard Settings,对此日志消息的分析表明这不是您所做的任何事情,您应该提交一份雷达文件,其中包含重现日志消息的步骤。

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

编辑:

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

场景

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

程序计数器

我尝试在日志中找到未处理的FBSceneSnapshotAction引用,但没有骰子。然后,我继承了 UIApplication,并覆盖了_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion. 现在我能够直接了解动作,但我们仍然不知道它是什么。

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

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

行动清单

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

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

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

于 2016-02-01T20:14:05.163 回答
12

AFAIK,上面的信息在屏幕快照期间与 iOS 相关(我想是双击主页多任务相关行为)。我深入调查了我的应用程序,似乎它没有任何副作用。你现在可以放心地忽略它。

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

于 2015-10-09T09:00:01.947 回答
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")
    }
}
于 2016-01-03T11:50:22.130 回答
1

我已经想通了,当您在 .h 或 .m 文件中声明了 IBAction 方法但您没有将其绑定到任何控件时,就会发生这种情况。

.m 示例:

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

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

于 2015-11-24T07:08:47.207 回答