在Xcode 11.4 / iOS 13.4中,我发现NSUserActivity并不总是响应setSuggestedInvocationPhrase。



我有一个项目,用于成功创建和更新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",当我从调试器运行它时,它会显示。但如果我独立启动应用程序,我会得到"setSuggestedInvocationPhrase将崩溃,如果你调用它。"。

其他人见过这样的东西吗?如果是,它是在您在硬件上升级到Xcode 11.4和/或iOS 13.4后开始发生的吗?我现在已经能够在iPod Touch、iPhone 11 Pro Max和iPhone 8的模拟器中重现这一点。

目前,我正在通过在设置短语之前明确检查respondsToSelector来解决这个问题,但从长远来看,这不是一个很好的解决方案。

我提交了一个Feedback Assistant请求,Apple Engineering回复了我。我没有在目标中明确链接Intents.framework。它曾经在没有它的情况下工作,但现在它失败了。我不知道为什么附加调试器会拉入Intents,但无论如何,很明显,我应该显式链接它,它解决了这个问题。

相关内容

最新更新