您的代码没有任何问题。这是 Apple 内部的一条日志消息,您应该提交有关它的雷达。
有两个提示表明这可能是苹果的代码:
方法名称前的下划线_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
是一个约定,表明该方法是私有的/内部的,它被声明的类。(参见这个注释。)
有理由猜测 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的所有子类。事实证明,他们有很多清单:
我们拥有的两个方法名称(一个来自日志,一个来自设备上的程序计数器)表明这些操作在后台用于在系统中传递操作。
一些操作可能会发送到应用程序委托的回调,而其他操作则在内部处理。
这里发生的事情是有一个动作没有被正确处理,系统正在记录它。显然,我们不应该看到它。