Siri is Apple’s intelligent personal assistant, and it allows you to use your voice to interact with your iOS, watchOS, tvOS and macOS devices. Already used by millions, this technology will only continue to grow; in fact, MarketsAndMarkets predicts that the speech and voice recognition market will be valued at $18.3 billion by 2023. And in an effort to continue to thrive in this market, Apple has made it easier for developers to integrate their apps with Siri using SiriKit.
This series will explore SiriKit, why it is important and how you can use it to expose your app’s functionality through Siri. We’ll walk through the basics of SiriKit and how to add support to your iOS app, take a deepdive into Intents and then address final touches that make for a good Siri user experience.
Siri strives to feel natural to users by providing a conversational interface; instead of rigid commands, you just talk to Siri. While this makes using Siri easy for the user, it can be quite complicated for developers. Fortunately, Apple alleviates this complexity by handling the conversational aspects—you just provide the functionality. To provide the functionality, developers use SiriKit.
SiriKit is Apple’s toolkit for exposing your app’s functionality through Siri. It was introduced in iOS 10, and despite Siri’s ubiquitous presence across all Apple platforms, as of this writing SiriKit is only available on iOS and watchOS. When someone speaks to Siri, Siri turns the speech into text, turns the text into what the user wants to do (discovers their intent), which leads to an action and results in a response. Working with the user’s intent is the heart of SiriKit.
Siri is limited in what it can do, functioning only within known Domains. A Domain is a category of things Siri knows about, like making VoIP calls, messaging, making payments, working with lists and notes and helping with your workouts. Within each Domain is a series of Intents, which are actions Siri can perform. For example, within the payments Domain there are Intents to send payments, transfer money and pay bills. In the ride booking Domain, there are Intents to request a ride and get the ride status. When considering SiriKit adoption, look at the Domains and their Intents to see which ones make sense for your app.
An Intent often has parameters: when sending a message, to whom it is addressed; when making a reservation, what restaurant and for how many people. Consequently, implementing an Intent has you performing three steps:
Of these three phases, what and how you do them depends upon the specific Intent; be sure to read headers and Apple’s documentation. Part 2 of this series will examine the three phases in-depth. But first things first: let’s add an Intents Extension to our app.
Because interaction with Siri occurs outside of your app, your app’s SiriKit functionality is implemented as an app extension—specifically an Intents App Extension. Let’s create one!
That will add the Siri service to your App ID, and the Siri entitlement to your project.
Next, create an Intents Extension target in your project.
In order to let the system know what Intents the app can handle, edit the extension’s Info.plist.
NSExtensionitem. If the Info.plist doesn’t contain one, add one of type dictionary.
NSExtensionAttributesitem. If there isn’t one, add one of type dictionary.
IntentsSupportedextension attribute, adding one of type array, if needed. Each entry should be a string of the class name of the Intent you support—one entry for every supported Intent. For example, if you support
INSendMessageIntent, there should be an entry of “INSendMessageIntent”.
NSExtensionPointIdentifierextension attribute should have a value of “com.apple.intents-service”.
NSExtensionPrincipalClassextension attribute should have the correct value via project stationery. More information about this will be discussed later.
That’s it! Your app now has the essential elements to work with Siri. Let’s try it out! And yes, you can work with Siri within the iOS Simulator.
When the Siri waveform interface appears, you can begin your conversation with Siri. Say: “Send a message using My Great App”, and watch your Intents Extension be invoked. If you set breakpoints in the
IntentHandler.swift file, you can watch the extension go through the resolve, confirm and handle phases. Notice that depending on what you say to Siri, some parameters may be resolved multiple times.
Of course, as developers, we tend to do the same thing again and again while we develop. If every time you run your Intents Extension, you have to select the Siri app to run and speak your phrase, it can become tiresome. Thankfully, Xcode provides a nice runtime convenience:
If you enter a phase for the “Siri Intent Query,” Xcode will automatically run Siri and use your text as the invoking phrase. If you leave this field blank, the Xcode will prompt you upon running.
Congratulations! You’ve successfully added an Intents Extension to your application, and can begin extending your app’s capabilities with Siri.
The full source code for this (and the entire SiriKit series) can be found here.
Of course, this doesn’t do anything useful or engaging with your app. In Part 2, we’ll do something useful and explore three key notions in working with Siri: resolve, confirm and handle.
And if you’re having trouble implementing SiriKit or other features into your iOS or watchOS app, Big Nerd Ranch is happy to help. Get in touch to see how our team can build a Siri-enabled app for you, or implement this and other new features into an existing app.