Created
June 29, 2018 16:50
-
-
Save azamsharp/ff487d2583d79013487557ab98113870 to your computer and use it in GitHub Desktop.
Intent Handler
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// IntentHandler.swift | |
// OrderCoffeeIntent | |
// | |
// Created by Mohammad Azam on 6/29/18. | |
// Copyright © 2018 Mohammad Azam. All rights reserved. | |
// | |
import Intents | |
// As an example, this class is set up to handle Message intents. | |
// You will want to replace this or add other intents as appropriate. | |
// The intents you wish to handle must be declared in the extension's Info.plist. | |
// You can test your example integration by saying things to Siri like: | |
// "Send a message using <myApp>" | |
// "<myApp> John saying hello" | |
// "Search for messages in <myApp>" | |
class IntentHandler2: INExtension, INSendMessageIntentHandling, INSearchForMessagesIntentHandling, INSetMessageAttributeIntentHandling { | |
override func handler(for intent: INIntent) -> Any { | |
// This is the default implementation. If you want different objects to handle different intents, | |
// you can override this and return the handler you want for that particular intent. | |
return self | |
} | |
// MARK: - INSendMessageIntentHandling | |
// Implement resolution methods to provide additional information about your intent (optional). | |
func resolveRecipients(for intent: INSendMessageIntent, with completion: @escaping ([INPersonResolutionResult]) -> Void) { | |
if let recipients = intent.recipients { | |
// If no recipients were provided we'll need to prompt for a value. | |
if recipients.count == 0 { | |
completion([INPersonResolutionResult.needsValue()]) | |
return | |
} | |
var resolutionResults = [INPersonResolutionResult]() | |
for recipient in recipients { | |
let matchingContacts = [recipient] // Implement your contact matching logic here to create an array of matching contacts | |
switch matchingContacts.count { | |
case 2 ... Int.max: | |
// We need Siri's help to ask user to pick one from the matches. | |
resolutionResults += [INPersonResolutionResult.disambiguation(with: matchingContacts)] | |
case 1: | |
// We have exactly one matching contact | |
resolutionResults += [INPersonResolutionResult.success(with: recipient)] | |
case 0: | |
// We have no contacts matching the description provided | |
resolutionResults += [INPersonResolutionResult.unsupported()] | |
default: | |
break | |
} | |
} | |
completion(resolutionResults) | |
} | |
} | |
func resolveContent(for intent: INSendMessageIntent, with completion: @escaping (INStringResolutionResult) -> Void) { | |
if let text = intent.content, !text.isEmpty { | |
completion(INStringResolutionResult.success(with: text)) | |
} else { | |
completion(INStringResolutionResult.needsValue()) | |
} | |
} | |
// Once resolution is completed, perform validation on the intent and provide confirmation (optional). | |
func confirm(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) { | |
// Verify user is authenticated and your app is ready to send a message. | |
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self)) | |
let response = INSendMessageIntentResponse(code: .ready, userActivity: userActivity) | |
completion(response) | |
} | |
// Handle the completed intent (required). | |
func handle(intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) { | |
// Implement your application logic to send a message here. | |
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self)) | |
let response = INSendMessageIntentResponse(code: .success, userActivity: userActivity) | |
completion(response) | |
} | |
// Implement handlers for each intent you wish to handle. As an example for messages, you may wish to also handle searchForMessages and setMessageAttributes. | |
// MARK: - INSearchForMessagesIntentHandling | |
func handle(intent: INSearchForMessagesIntent, completion: @escaping (INSearchForMessagesIntentResponse) -> Void) { | |
// Implement your application logic to find a message that matches the information in the intent. | |
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSearchForMessagesIntent.self)) | |
let response = INSearchForMessagesIntentResponse(code: .success, userActivity: userActivity) | |
// Initialize with found message's attributes | |
response.messages = [INMessage( | |
identifier: "identifier", | |
content: "I am so excited about SiriKit!", | |
dateSent: Date(), | |
sender: INPerson(personHandle: INPersonHandle(value: "[email protected]", type: .emailAddress), nameComponents: nil, displayName: "Sarah", image: nil, contactIdentifier: nil, customIdentifier: nil), | |
recipients: [INPerson(personHandle: INPersonHandle(value: "+1-415-555-5555", type: .phoneNumber), nameComponents: nil, displayName: "John", image: nil, contactIdentifier: nil, customIdentifier: nil)] | |
)] | |
completion(response) | |
} | |
// MARK: - INSetMessageAttributeIntentHandling | |
func handle(intent: INSetMessageAttributeIntent, completion: @escaping (INSetMessageAttributeIntentResponse) -> Void) { | |
// Implement your application logic to set the message attribute here. | |
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSetMessageAttributeIntent.self)) | |
let response = INSetMessageAttributeIntentResponse(code: .success, userActivity: userActivity) | |
completion(response) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment