У меня есть проект, который успешно создавал и обновлял 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 вызовет sh, если вы его вызовете». вместо этого.
Кто-нибудь еще видел что-нибудь подобное? Если так, это начало происходить после того, как вы обновились до Xcode 11.4 и / или до iOS 13.4 на оборудовании? Теперь я могу воспроизвести это на iPod Touch, iPhone 11 Pro Max, и на симуляторе на iPhone 8.
В настоящее время я работаю над этим явно проверка на respondsToSelector
перед установкой фразы, но это не очень хорошее решение в долгосрочной перспективе.