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

In Xcode 11.4/iOS 13.4 I'm finding that NSUserActivity doesn't always respond to setSuggestedInvocationPhrase

我有一个项目用于成功创建和更新 NSUserActivity 对象以提供 Siri 快捷方式和 Handoff。今天我有一段时间第一次回到这段代码,有点惊讶地发现如果我在设备上有一个调试版本并且我从 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))  
    }  
}

我认为这段代码应该始终显示 "You can call setSuggestedInvocationPhrase" 并且当我从调试器 运行 时它 确实 。但是,如果我独立启动应用程序,我会得到 "setSuggestedInvocationPhrase will crash if you call it."。

有没有人见过这样的事情?如果是这样,它是在硬件上升级到 Xcode 11.4 and/or 到 iOS 13.4 后开始出现的吗?我现在已经能够在 iPod Touch、iPhone 11 Pro Max 和 iPhone 8.

的模拟器中重现这一点

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

我提交了反馈助理请求,Apple 工程部门回复了我。我没有在目标中明确 linked Intents.framework。它曾经没有它也能工作,但现在失败了。我不确定为什么附加调试器会引入 Intents,但无论如何很明显我 应该 明确地 link 它并解决了这个问题。