首页 > 解决方案 > 在 Xcode 11.4/iOS 13.4 我发现 NSUserActivity 并不总是响应 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))  
    }  
}

我认为这段代码应该总是显示“你可以调用 setSuggestedInvocationPhrase”,当我从调试器运行它时它会显示。但是,如果我独立启动应用程序,我会得到“如果你调用它,setSuggestedInvocationPhrase 将会崩溃”。反而。

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

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

标签: iossirikitnsuseractivityintents-extension

解决方案


我提交了一个反馈助理请求,Apple Engineering 回复了我。我没有Intents.framework在目标中明确链接。过去没有它,它可以工作,但现在它失败了。我不确定为什么附加调试器会拉入Intents,但无论如何我应该明确地链接它并解决这个问题。


推荐阅读