3

現在 Swift 2.3 に基づいている自分のアプリに Siri/Intent 拡張機能を統合したいと考えています。Xcode 8 ベータ 6 ビルドを使用しています。

アプリはコンパイルに失敗し、次のようなエラーが発生します


タイプ「IntentHandler」はプロトコル「INSendMessageIntentHandling」に準拠していません

プロトコルには、型が '(sendMessage: INSendMessageIntent, 完了: (INSendMessageIntentResponse) -> Void) -> Void' の関数 'handle(sendMessage:completion:)' が必要です

メソッド 'handle(sendMessage:completion:)' によって提供される Objective-C メソッド 'handleWithSendMessage:completion:' は、要件のセレクター ('handleSendMessage:completion:') と一致しません。


Apple のサンプル アプリである UnicornChat でさえ、同じエラーでコンパイルに失敗します。Swift 2.3 をサポートするために、 SWIFT_VERSIONフラグをYesに変更しました。

サンプルコード:

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

これは上記のエラーで失敗します。

Swift 2.3 で Siri を機能させる方法を知っている人はいますか?

4

3 に答える 3

6

それで、これは役に立ちました

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

@objc メソッド シグネチャを Swift シグネチャで明示的に定義する必要があります。以下の作品のように。

@objc (handleSendMessage:completion:)
func handle(sendMessage intent: INSendMessageIntent, completion: (INSendMessageIntentResponse) -> Void) {
 //..
}
于 2016-09-02T17:29:20.943 に答える
1

どうやら Xcode 8 ベータ 6 は Swift 3 に更新されており、コールバックにはメソッドに @escaping を追加する必要があります。

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

Siri のデリゲート メソッドが Swift 3 に更新された場合 (そのようです)、残念ながら Swift 3 または古いバージョンの SDK を使用する必要があります。

于 2016-09-01T21:26:09.823 に答える
0

コードを Swift 2.3 でコンパイルする際、Siri および SiriUI ターゲットに対してUse Legacy Swift Language VersionYESに設定する必要があります。

また、IntentHandlerIntentViewControllerが作成されると、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)!) {
}

これが役に立ったことを願っています。

于 2016-11-30T19:08:56.490 に答える