Невозможно скомпилировать расширение Siri в Swift 2.3

Я хочу интегрировать расширение Siri / Intent в свое приложение, в настоящее время основанное на Swift 2.3. Я использую сборку Xcode 8 beta 6.

Приложение не может даже скомпилировать, выдавая ошибки как


Тип IntentHandler не соответствует протоколу INSendMessageIntentHandling

Протокол требует функции 'handle (sendMessage: Завершение :)' с типом '(sendMessage: INSendMessageIntent, завершение: (INSendMessageIntentResponse) -> Void) -> Void'

Метод Objective-C 'handleWithSendMessage: завершение:' предоставленный методом 'дескриптор (sendMessage: Завершение :)' не соответствует селектору требования ('handleSendMessage: Завершение:')


Даже пример приложения от Apple UnicornChat не компилируется с теми же ошибками. Я изменил флаг SWIFT_VERSION на Да, чтобы поддерживать Swift 2.3.

Образец кода:

func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
        let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
        let response = INSendMessageIntentResponse(code: .Success, userActivity: userActivity)
        completion(response)
    }

Это не удается из-за указанной выше ошибки.

Кто-нибудь знает, как заставить Siri работать в Swift 2.3?


person Arnav Patra    schedule 31.08.2016    source источник
comment
Вы реализовали дескриптор функции (намерение sendMessage: ...? Если да, покажите нам это.   -  person Jeshua Lacock    schedule 01.09.2016
comment
@JeshuaLacock Пожалуйста, проверьте правку.   -  person Arnav Patra    schedule 01.09.2016


Ответы (3)


Итак, это помогло

https://forums.developer.apple.com/message/174455#174455

Нам нужно явно определить сигнатуры метода @objc с сигнатурами Swift. Как в следующих работах.

@objc (handleSendMessage:completion:)
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
 //..
}
person Arnav Patra    schedule 02.09.2016

По-видимому, Xcode 8 beta 6 был обновлен до Swift 3, и для обратного вызова необходимо добавить @escaping в метод:

func handle(sendMessage intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Swift.Void) {  
  //..  
}

Если методы делегата Siri были обновлены до Swift 3 (как, кажется, так), то я боюсь, что вам также придется использовать Swift 3 или более старую версию SDK.

person Jeshua Lacock    schedule 01.09.2016
comment
OP использует Swift 2.3. - person kometen; 02.09.2016
comment
Я это понимаю, но похоже, что методы делегата были переведены на Swift 3. - person Jeshua Lacock; 02.09.2016

При компиляции кода с помощью Swift 2.3 вам необходимо установить для Использовать устаревшую языковую версию Swift значение ДА для целей Siri и SiriUI.

Кроме того, когда создаются IntentHandler и IntentViewController, методы могли быть созданы в Swift 3 (как это случилось со мной). Поэтому преобразуйте классы в Swift 2.3 и используйте сигнатуры методов @objc вместе с делегатами.

Для IntentHandler

@objc (handleSendMessage:completion:)
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
}

@objc (handleSearchForMessages:completion:)
func handle(searchForMessages intent: INSearchForMessagesIntent, completion: (INSearchForMessagesIntentResponse) -> Void) {
}

@objc (handleSetMessageAttribute:completion:)
func handle(setMessageAttribute intent: INSetMessageAttributeIntent, completion: (INSetMessageAttributeIntentResponse) -> Void) {
}

Для IntentViewController

@objc (configureWithInteraction:context:completion:)
func configureWithInteraction(interaction: INInteraction!, context: INUIHostedViewContext, completion: ((CGSize) -> Void)!) {
}

Надеюсь, это помогло.

person cheeseRoot    schedule 30.11.2016