// // IntentHandler.m // HDLSceneSiri // // Created by ι™ˆε˜‰δΉ on 2021/11/25. // #import "IntentHandler.h" #import "HDLRunSceneIntent.h" #import "HDLSceneHandler.h" // 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 " // " John saying hello" // "Search for messages in " @interface IntentHandler () @end @implementation IntentHandler - (id)handlerForIntent:(INIntent *)intent { // 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. if (@available(iOS 12.0, *)) { if ([intent isKindOfClass:[HDLRunSceneIntent class]]) { return [[HDLSceneHandler alloc] init]; } } return self; } #pragma mark - INSendMessageIntentHandling // Implement resolution methods to provide additional information about your intent (optional). - (void)resolveRecipientsForSendMessage:(INSendMessageIntent *)intent with:(void (^)(NSArray *resolutionResults))completion { NSArray *recipients = intent.recipients; // If no recipients were provided we'll need to prompt for a value. if (recipients.count == 0) { completion(@[[INSendMessageRecipientResolutionResult needsValue]]); return; } NSMutableArray *resolutionResults = [NSMutableArray array]; for (INPerson *recipient in recipients) { NSArray *matchingContacts = @[recipient]; // Implement your contact matching logic here to create an array of matching contacts if (matchingContacts.count > 1) { // We need Siri's help to ask user to pick one from the matches. [resolutionResults addObject:[INSendMessageRecipientResolutionResult disambiguationWithPeopleToDisambiguate:matchingContacts]]; } else if (matchingContacts.count == 1) { // We have exactly one matching contact [resolutionResults addObject:[INSendMessageRecipientResolutionResult successWithResolvedPerson:recipient]]; } else { // We have no contacts matching the description provided [resolutionResults addObject:[INSendMessageRecipientResolutionResult unsupported]]; } } completion(resolutionResults); } - (void)resolveContentForSendMessage:(INSendMessageIntent *)intent withCompletion:(void (^)(INStringResolutionResult *resolutionResult))completion { NSString *text = intent.content; if (text && ![text isEqualToString:@""]) { completion([INStringResolutionResult successWithResolvedString:text]); } else { completion([INStringResolutionResult needsValue]); } } // Once resolution is completed, perform validation on the intent and provide confirmation (optional). - (void)confirmSendMessage:(INSendMessageIntent *)intent completion:(void (^)(INSendMessageIntentResponse *response))completion { // Verify user is authenticated and your app is ready to send a message. NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INSendMessageIntent class])]; INSendMessageIntentResponse *response = [[INSendMessageIntentResponse alloc] initWithCode:INSendMessageIntentResponseCodeReady userActivity:userActivity]; completion(response); } // Handle the completed intent (required). - (void)handleSendMessage:(INSendMessageIntent *)intent completion:(void (^)(INSendMessageIntentResponse *response))completion { // Implement your application logic to send a message here. NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INSendMessageIntent class])]; INSendMessageIntentResponse *response = [[INSendMessageIntentResponse alloc] initWithCode:INSendMessageIntentResponseCodeSuccess 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. #pragma mark - INSearchForMessagesIntentHandling - (void)handleSearchForMessages:(INSearchForMessagesIntent *)intent completion:(void (^)(INSearchForMessagesIntentResponse *response))completion { // Implement your application logic to find a message that matches the information in the intent. NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INSearchForMessagesIntent class])]; INSearchForMessagesIntentResponse *response = [[INSearchForMessagesIntentResponse alloc] initWithCode:INSearchForMessagesIntentResponseCodeSuccess userActivity:userActivity]; // Initialize with found message's attributes response.messages = @[[[INMessage alloc] initWithIdentifier:@"identifier" content:@"I am so excited about SiriKit!" dateSent:[NSDate date] sender:[[INPerson alloc] initWithPersonHandle:[[INPersonHandle alloc] initWithValue:@"sarah@example.com" type:INPersonHandleTypeEmailAddress] nameComponents:nil displayName:@"Sarah" image:nil contactIdentifier:nil customIdentifier:nil] recipients:@[[[INPerson alloc] initWithPersonHandle:[[INPersonHandle alloc] initWithValue:@"+1-415-555-5555" type:INPersonHandleTypePhoneNumber] nameComponents:nil displayName:@"John" image:nil contactIdentifier:nil customIdentifier:nil]] ]]; completion(response); } #pragma mark - INSetMessageAttributeIntentHandling - (void)handleSetMessageAttribute:(INSetMessageAttributeIntent *)intent completion:(void (^)(INSetMessageAttributeIntentResponse *response))completion { // Implement your application logic to set the message attribute here. NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INSetMessageAttributeIntent class])]; INSetMessageAttributeIntentResponse *response = [[INSetMessageAttributeIntentResponse alloc] initWithCode:INSetMessageAttributeIntentResponseCodeSuccess userActivity:userActivity]; completion(response); } @end