iOS9故事板啥是未处理动作(handleNonLaunchSpecificActions)?

Posted

技术标签:

【中文标题】iOS9故事板啥是未处理动作(handleNonLaunchSpecificActions)?【英文标题】:iOS9 storyboard what is unhandled action (handleNonLaunchSpecificActions)?iOS9故事板什么是未处理动作(handleNonLaunchSpecificActions)? 【发布时间】:2015-12-15 22:59:57 【问题描述】:

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

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

【问题讨论】:

Apple 说 iOS 9 是关于稳定性的,所以我想你不应该担心 ;-) P.S.我也有同样的问题,其他一些开发者也有***.com/questions/32344082/… 不确定它是否与 Storyboard 相关,我在我的非 Storyboard 应用中也看到了。 构建中是否还有其他警告?也许这是一个看似微不足道的警告? 我没有使用故事板,也收到了这个警告。当您使用 CMD + L 锁定模拟器然后“滑动解锁”以返回应用程序时,它会弹出。 查看设备日志,可能与自动关闭设备屏幕有关。 SpringBoard[54] &lt;Warning&gt;: [MPUSystemMediaControls] Disabling lock screen media controls updates for screen turning off. 行记录在引用的错误消息之前。 【参考方案1】:

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

您可以使用以下gist simple category 来测试自己对上述函数的调用:

【讨论】:

【参考方案2】:

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

.m 示例:

- (IBAction)click:(id)sender

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

【讨论】:

在我的应用程序中不是这种情况 - 我没有任何未绑定的 IBAction,我也收到此消息。不过,我的应用是 Swift 应用。【参考方案3】:

还没有找出为什么它会在我的应用程序中发生,但至少你可以捕捉到异常,如果你想防止它在你的日志窗格中弹出。这不是一个解决方案,但通过检查在 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")
    

【讨论】:

【参考方案4】:

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

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

    方法名称前导的下划线_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion 是一种约定,表示该方法是私有的/在其声明的类中是内部的。(参见this comment。)

    有理由猜测FBSSceneSnapshotAction 中的两个字母前缀是 FrontBoard 的简写,根据 Rene Ritchie 在“iOS 9 wish-list: Guest Mode" 是与启动应用程序相关的整个软件系列的一部分:

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

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

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

如果你想尝试获取堆栈跟踪,你可以实现the category linked to here。有些人会争辩说,覆盖私有 API 是个坏主意,但在这种情况下,临时注入来获取堆栈跟踪不会太有害。

编辑:

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

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

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

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

然后我写了类似于RuntimeBrowser 的a tool 并查找了BSAction 的所有子类。事实证明,它们的列表相当多:

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

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

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

【讨论】:

很好的调查,但这里有一些有趣的事情,我在使用私有 Apple API 时遇到了确切的 OP 错误。我想既然我使用的是私有 API,那么我可能会为 Apple 工程师获取控制台日志。 @Moshe Apple 为他们的调查向您支付了多少钱?但他们可能对此不感兴趣。 :p “提交有关它的雷达”是什么意思? 表示用苹果的bug报告工具提交bug报告。

以上是关于iOS9故事板啥是未处理动作(handleNonLaunchSpecificActions)?的主要内容,如果未能解决你的问题,请参考以下文章

没有 Xib 和故事板的旧应用程序。使ios9兼容

iOS 9:在故事板/xib 中设置了手势识别器,以添加到多个视图(不起作用)

啥是佩奇

“啥是佩奇”——163vip邮箱帮您配齐

作者那多發布播客《罪案手記》,全是未經披露的確實案例

在强化学习中 啥是 softmax action ?