你的代码没有任何问题。这是 Apple 内部的日志消息,您应该对此进行雷达归档。
有两个提示表明这是probably苹果的代码:
下划线开头的方法名称_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
是一个约定,表明该方法是声明它的类的私有/内部方法。(请参阅这条评论 https://stackoverflow.com/questions/822487/how-does-an-underscore-in-front-of-a-variable-in-a-cocoa-objective-c-class-work#comment632212_822995.)
可以合理猜测中的两个字母前缀FBSSceneSnapshotAction
是 FrontBoard 的简写,根据 Rene Ritchie 在“iOS 9 愿望清单:访客模式” http://www.imore.com/ios-9-wish-list-guest-mode是与启动应用程序相关的整个软件系列的一部分:
在 iOS 8 中,Apple 将其系统管理器 SpringBoard 重构为几个更小、更集中的组件。除了已经分离出来处理后台任务的 BackBoard 之外,他们还添加了用于前台任务的 Frontboard。他们还添加了 PreBoard,以在安全、加密的条件下处理锁定屏幕。 [...]
我不知道是什么BS
前缀在BSSettings
是用于,但对此日志消息的分析将表明这不是您所做的任何事情,并且您应该提交一个包含重现日志消息步骤的雷达。
如果你想尝试获取堆栈跟踪,你可以实现链接到此处的类别 https://stackoverflow.com/a/33034072/224988。有些人会认为覆盖私有 API 是一个坏主意,但在这种情况下,临时注入来获取堆栈跟踪不会太有害。
EDIT:
但是,我们仍然想知道这个动作是什么。所以我打了一个断点-[UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion]
并开始打印寄存器值并找到一个名为FBSceneImpl
其中包含有关我的应用程序的大量信息:
我们能够找出接下来调用的是哪个私有方法(存储在程序计数器,寄存器 15 中)。
我尝试找到未处理的FBSceneSnapshotAction
日志中引用了,但没有骰子。然后,我将 UIApplication 子类化,并覆盖_handleNonLaunchSpecificActions:forScene:withTransitionContext:completion
。现在我可以直接了解该动作,但我们仍然不知道它是什么。
然后,我再次查看了 FBSceneSnapshotAction。原来它有一个超类叫做BSAction
.
然后我写了a tool https://github.com/mosheberman/introspector如同运行时浏览器 https://github.com/nst/RuntimeBrowser并查找 BSAction 的所有子类。事实证明,它们的列表相当多:
我们拥有的两个方法名称(一个来自日志,一个来自设备上的程序计数器)表明这些操作在幕后用于在系统中传递操作。
某些操作可能会发送到应用程序委托的回调,而其他操作则在内部处理。
这里发生的情况是,有一个操作未正确处理,并且系统正在注意到它。显然我们不应该看到它。