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()])
}
}
Sie beide sind optional, hat nicht geholfen. – EternalLight
@EternalLight hat das überprüft? https://forums.developer.apple.com/thread/62250 – JuicyFruit
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