我有一个用于成功创建和更新NSUserActivity
对象以提供Siri快捷方式和切换的项目。今天,我一段时间以来第一次返回到此代码,并惊讶地发现,如果我在设备上构建了调试版本,并且在Springboard上运行它,则崩溃,并显示了无法识别的选择器消息:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSUserActivity setSuggestedInvocationPhrase:]: unrecognized selector sent to instance 0x280083580'
此完全相同的二进制文件很好,当我运行它附加到调试器时。我不知所措地想知道问题是什么。我创建了一个简单的测试应用程序,它表现出相同的行为。这是一个演示问题的简单SwiftUI视图:
import SwiftUI
import Intents
struct ContentView: View {
var body: some View {
if testForSelector() {
return Text("You can call setSuggestedInvocationPhrase")
} else {
return Text("setSuggestedInvocationPhrase will crash if you call it.")
}
}
}
extension ContentView {
func testForSelector() -> Bool {
let activity = NSUserActivity(activityType: "Testing Activity")
return activity.responds(to: #selector(setter: INIntent.suggestedInvocationPhrase))
}
}
我认为这段代码应始终显示“您可以调用setSuggestedInvocationPhrase”,并且当我从调试器运行它时,它does。但是,如果我独立启动该应用程序,则会收到“ setSuggestedInvocationPhrase如果您调用它将崩溃”。代替。
其他人看到过这样的东西吗?如果是这样,在硬件上升级到Xcode 11.4和/或iOS 13.4之后,它是否开始发生?现在,我已经可以在iPod Touch,iPhone 11 Pro Max和iPhone 8的模拟器中重现此图像。
目前,我正在通过在设置短语之前显式检查respondsToSelector
来解决此问题,但是从长远来看,这不是一个很好的解决方案。
我提交了“反馈助理”请求,Apple Engineering回复了我。我没有在目标中显式链接Intents.framework
。 without它used可以不使用而工作,但是现在失败了。我不确定为什么附加调试器会插入Intents
,但无论如何显然我应该显式链接它并解决了此问题。