2017-04-01 6 views
3

Ich verwende INStartAudioCallIntentHandling in swift 2.3 und ich bekomme diese Fehlermeldung:Typ 'IntentHandler' entspricht nicht Protokoll 'INStartAudioCallIntentHandling'

Type ‘IntentHandler’ does not conform to protocol ‘INStartAudioCallIntentHandling’ 

ich Xcode 8.2.1 verwenden bin. Ich habe die func handle(startAudioCall intent: INStartAudioCallIntent, completion: (INStartAudioCallIntentResponse) -> Void) Methode in die Klasse.Warum bekomme ich diesen Fehler. Bitte hilf mir.

Antwort

0

sollten Sie wahrscheinlich auch hinzufügen

func confirm(start​Audio​Call:​ INStart​Audio​Call​Intent, completion:​ (INStart​Audio​Call​Intent​Response) -> Void) 

und

func resolve​Contacts(for​Start​Audio​Call:​ INStart​Audio​Call​Intent, with:​ ([INPerson​Resolution​Result]) -> Void) 

Verwenden Sie die Methoden der INSTART Audio Anruf Intent Handhabung Protokoll Entschlossenheit, bestätigen und Anfragen bearbeiten um einen Nur-Audio-Anruf mit den angegebenen Benutzern zu starten. Übernehmen Sie dieses Protokoll in einem Objekt Ihrer Intents Erweiterung, die in der Lage ist, die Anrufinformationen zu validieren.

source

+0

Sie beide sind optional, hat nicht geholfen. – EternalLight

+0

@EternalLight hat das überprüft? https://forums.developer.apple.com/thread/62250 – JuicyFruit

+0

Ja, gerade lesen. Sie sagen, das Problem ist mit @ escaping-Attribut in Swift 3. Closures sind standardmäßig in Swift 2.3 entkommen und es sollte einfach funktionieren, aber es tut es nicht. – EternalLight

0

Swift 3.1 Lösung.

Wir geben diese Benutzeraktivität mit Info weiter, die vom Anzeigenamen des Kontakts kommt. Ich muss sagen, wen ich anrufen werde.

Ich habe dieses einfache Array, das eine Darstellung einer Scheindatenbank ist. Vielleicht haben Sie in Ihrer Anwendung eine Art Liste von Benutzern, die alle ihre Kontaktinformationen enthält, und Sie können diese Kontakte mit den Informationen vergleichen, die in resolveContacts übergeben wurden. Der Benutzer sagt, dass er Dave anrufen will, ich stelle sicher, dass das in der Datenbank ist und wenn es so ist, rufe ich Dave an. Und um den Anruf zu tätigen, benötigen Sie eine INPerson, die eine PersonHandle benötigt, die im Grunde eine eindeutige Kennung für einen Menschen ist.

Sie können entweder eine E-Mail oder eine Telefonnummer verwenden. Ich habe mich entschieden, mit einer Telefonnummer hier zu gehen. Wenn es den passenden Namen hat, erstellt es dieses INPersonHandle, übergibt es als eine Person mit dieser Telefonnummer und welchem ​​Namen, wenn es meinen vorhandenen Kontakten entspricht, und dann sage ich, dass der Abschluss mit dieser Person erfolgreich ist. Wenn es keinen übereinstimmenden Kontakt gibt, verweisen wir zurück auf den Benutzer, der sagt, dass wir einen Wert benötigen.

import Intents 

class IntentHandler: INExtension,INStartAudioCallIntentHandling { 
    override func handler(for intent: INIntent) -> Any? { 
     return self 
    } 
    func handle(startAudioCall intent: INStartAudioCallIntent, completion: @escaping (INStartAudioCallIntentResponse) -> Void) { 
     print("handle") 
     let ua = NSUserActivity(activityType: "Call") 
     let person:String = intent.contacts![0].displayName 
     ua.userInfo = ["person":person] 
     completion(INStartAudioCallIntentResponse(code: .continueInApp, userActivity: ua)) 
    } 

    func confirm(startAudioCall intent: INStartAudioCallIntent, completion: @escaping (INStartAudioCallIntentResponse) -> Void) { 
     completion(INStartAudioCallIntentResponse(code: .ready, userActivity: nil)) 
    } 

    func resolveContacts(forStartAudioCall intent: INStartAudioCallIntent, with completion: @escaping ([INPersonResolutionResult]) -> Void) { 
     print("resolveContacts") 
     let contacts:[String] = ["Dave","James","Herman"] 
     for contact in contacts { 
      if intent.contacts?[0].spokenPhrase?.uppercased() == contact.uppercased() { 
       let personHandle:INPersonHandle = INPersonHandle(value: "1-555-555-5555", type: .phoneNumber) 
       let person:INPerson = INPerson(personHandle: personHandle, nameComponents: nil, displayName: contact, image: nil, contactIdentifier: nil, customIdentifier: nil) 
       completion([INPersonResolutionResult.success(with: person)]) 
       return 
      } 
     } 
     completion([INPersonResolutionResult.needsValue()]) 
    } 

} 
Verwandte Themen