{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-240", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/240", "wordCount": 3439, "segments": [{"start": 7.0, "text": "Hi, I'm Dan Niemeyer, a software engineer on the Swift Intelligence Frameworks team."}, {"start": 12.0, "text": "Today, I'll show you how to bring your app to Siri"}, {"start": 15.0, "text": "using new capabilities powered by Apple Intelligence."}, {"start": 19.0, "text": "In the 27 releases, Siri is more capable, more contextual, and more personal."}, {"start": 24.0, "text": "And App Intents are the foundation that make that possible."}, {"start": 28.0, "text": "Here's what I'll cover today."}, {"start": 30.0, "text": "Starting with what's new with Siri and App Intents."}, {"start": 34.0, "text": "How Siri understands your app's content,"}, {"start": 37.0, "text": "and when Siri understands your content,"}, {"start": 39.0, "text": "enabling it to take action."}, {"start": 42.0, "text": "At the end of the talk, I'll cover use cases"}, {"start": 45.0, "text": "for working across apps,"}, {"start": 47.0, "text": "such as asking Siri to text my wife her plane ticket,"}, {"start": 50.0, "text": "or apply a cinematic filter to this photo."}, {"start": 54.0, "text": "And share some best practices for how to bring your app to Siri"}, {"start": 57.0, "text": "by extending the system's understanding of what your app can do."}, {"start": 62.0, "text": "Alright, there's a lot here, so let's get started."}, {"start": 67.0, "text": "In the 27 releases, Siri takes a big step forward,"}, {"start": 71.0, "text": "powered by Apple Intelligence,"}, {"start": 74.0, "text": "our personal intelligence platform that helps people be more creative"}, {"start": 78.0, "text": "and productive in the work they do."}, {"start": 80.0, "text": "As a developer, the way you participate in Apple Intelligence"}, {"start": 84.0, "text": "is through the App Intents framework."}, {"start": 86.0, "text": "App Intents is the foundation for integrating your Apple Siri"}, {"start": 90.0, "text": "and Apple Intelligence,"}, {"start": 92.0, "text": "and provides a structured way to describe what your app can do"}, {"start": 95.0, "text": "and the content it manages."}, {"start": 98.0, "text": "Everything I talk about today builds on top of App Intents."}, {"start": 103.0, "text": "If App Intents is new to you, I highly recommend starting with these videos,"}, {"start": 107.0, "text": "which cover the fundamentals in more depth."}, {"start": 111.0, "text": "This year, Siri becomes more powerful in three key ways."}, {"start": 117.0, "text": "Siri can now access your app's entities,"}, {"start": 119.0, "text": "the real meaningful content inside your app."}, {"start": 123.0, "text": "This means people can ask questions like: \"When and where is my next meeting?\""}, {"start": 127.0, "text": "And Siri can answer directly by understanding"}, {"start": 130.0, "text": "what a meeting is in your app,"}, {"start": 132.0, "text": "which meeting is relevant,"}, {"start": 134.0, "text": "and which properties to return,"}, {"start": 136.0, "text": "like time and location."}, {"start": 139.0, "text": "Siri can take action using your app's intents."}, {"start": 143.0, "text": "For example, someone could say: \"Send my latest report to Mary\"."}, {"start": 147.0, "text": "So, people can send emails just by asking."}, {"start": 150.0, "text": "Intents describe the actions your app supports,"}, {"start": 153.0, "text": "the parameters they require,"}, {"start": 155.0, "text": "and when they're safe to run."}, {"start": 157.0, "text": "Siri handles the language understanding."}, {"start": 160.0, "text": "Your app focuses on the action."}, {"start": 164.0, "text": "Siri can also understand on-screen context."}, {"start": 168.0, "text": "For example, people can say things like: \"Explain this text\","}, {"start": 172.0, "text": "or: \"Get me reviews for this product\"."}, {"start": 175.0, "text": "When you annotate views with entities that describe what's on screen,"}, {"start": 179.0, "text": "Siri can then understand what content is meaningful,"}, {"start": 183.0, "text": "which entities it represents, and what actions apply."}, {"start": 188.0, "text": "This gives people a more contextual conversational experience"}, {"start": 192.0, "text": "that feels natural and incredibly powerful."}, {"start": 197.0, "text": "So that's a preview of what's new with Siri, how we can find content,"}, {"start": 201.0, "text": "take actions, and understand what's on screen."}, {"start": 205.0, "text": "Now it's time to ground all of that in a real app."}, {"start": 210.0, "text": "For the rest of this video, I'll work in a sample app called UnicornChat."}, {"start": 215.0, "text": "UnicornChat is a messaging app where people can chat"}, {"start": 219.0, "text": "with fictional unicorn characters"}, {"start": 221.0, "text": "like Bubbles, Flare, and Glow."}, {"start": 224.0, "text": "It has just enough functionality to demonstrate"}, {"start": 227.0, "text": "the concepts I'm covering today."}, {"start": 230.0, "text": "And while it's a messaging app, the same ideas apply"}, {"start": 234.0, "text": "to apps across many other domains."}, {"start": 237.0, "text": "You can download the sample from the Apple Developer website"}, {"start": 240.0, "text": "and follow along."}, {"start": 243.0, "text": "Having explored what's new and the app we'll use to demonstrate it,"}, {"start": 246.0, "text": "let's talk about how you can bring these capabilities to your app."}, {"start": 251.0, "text": "At the center of all of these App Intents-powered experiences"}, {"start": 254.0, "text": "is a single concept - app entities."}, {"start": 258.0, "text": "An AppEntity is a structured representation"}, {"start": 261.0, "text": "of the content inside your app."}, {"start": 263.0, "text": "To make this concrete,"}, {"start": 265.0, "text": "think about the data your app already works with every day."}, {"start": 269.0, "text": "If you have a calendar app, each event is an entity."}, {"start": 274.0, "text": "If you have a mail app, each message is an entity."}, {"start": 278.0, "text": "And if you have a photos app, each photo and each album is an entity."}, {"start": 284.0, "text": "App entities describe three important things."}, {"start": 288.0, "text": "What the thing is, how it's identified, and which properties matter, like a title,"}, {"start": 294.0, "text": "a date, or some text."}, {"start": 297.0, "text": "They're not a new data model."}, {"start": 299.0, "text": "They're a way of describing your existing content"}, {"start": 301.0, "text": "so the system can understand it."}, {"start": 305.0, "text": "Now, modeling an entity is the first step, but on its own,"}, {"start": 309.0, "text": "that's not enough for Siri to be able to find it or talk about it."}, {"start": 314.0, "text": "For Siri to understand what an entity is, what category of thing it represents,"}, {"start": 320.0, "text": "your entity needs to conform to an AppSchema."}, {"start": 325.0, "text": "App schemas give Siri a predefined understanding of common concepts,"}, {"start": 329.0, "text": "like messages, contacts, or documents."}, {"start": 333.0, "text": "When your entities conform to a schema,"}, {"start": 336.0, "text": "Siri already knows how to reason about them."}, {"start": 340.0, "text": "Instead of treating your app like a black box,"}, {"start": 343.0, "text": "Siri can reason about what the user is talking about."}, {"start": 348.0, "text": "In UnicornChat, the nouns in the app are Contact, Conversation, and Message."}, {"start": 354.0, "text": "All three are modeled as app entities that conform to app schemas."}, {"start": 358.0, "text": "That's what allows Siri to understand questions like:"}, {"start": 361.0, "text": "\"Show my last message from Flare\", one of our contacts,"}, {"start": 365.0, "text": "or \"Open UnicornChat with Glow\", another unicorn friend."}, {"start": 370.0, "text": "So once you've modeled your content as app entities,"}, {"start": 373.0, "text": "the next question is, how does Siri find the right one?"}, {"start": 377.0, "text": "Entity resolution is how Siri resolves what the user says"}, {"start": 381.0, "text": "into real app entities inside your app."}, {"start": 385.0, "text": "For example, when a user says: \"Open UnicornChat with Glow\","}, {"start": 390.0, "text": "Siri resolves that Glow refers to a specific unicorn,"}, {"start": 394.0, "text": "finds the matching contact, and fills in the entity"}, {"start": 397.0, "text": "along with the values of its properties,"}, {"start": 400.0, "text": "like its name and identifier,"}, {"start": 402.0, "text": "so it can be used by the system."}, {"start": 405.0, "text": "But people don't always ask for things using exact names."}, {"start": 409.0, "text": "They speak in concepts and descriptions."}, {"start": 412.0, "text": "When someone says something like:"}, {"start": 415.0, "text": "\"The best windsurfing in Carmel\","}, {"start": 417.0, "text": "they're not looking for an exact text match."}, {"start": 421.0, "text": "They're expressing meaning."}, {"start": 423.0, "text": "To support that experience, Siri needs more than string matching."}, {"start": 427.0, "text": "It needs semantic search."}, {"start": 430.0, "text": "And that's exactly what IndexedEntity enables."}, {"start": 434.0, "text": "The primary way to power entity resolution"}, {"start": 437.0, "text": "is by adopting IndexedEntity."}, {"start": 440.0, "text": "When you do this, your app's entities are indexed into the system semantic index."}, {"start": 446.0, "text": "This allows Siri to match based on meaning, not just text,"}, {"start": 450.0, "text": "understand relationships between entities,"}, {"start": 453.0, "text": "and even answer questions over your content."}, {"start": 457.0, "text": "For example: \"Show the messages with Flare about movies\" -"}, {"start": 461.0, "text": "that's not a string match."}, {"start": 462.0, "text": "Siri can find messages that reference movie titles"}, {"start": 466.0, "text": "because it's performing a semantic query over UnicornChat's indexed messages."}, {"start": 472.0, "text": "And the way you get that behavior is by conforming your schematized entity"}, {"start": 477.0, "text": "to the IndexedEntity protocol."}, {"start": 480.0, "text": "The indexingKey tells Spotlight which properties, like the message body,"}, {"start": 485.0, "text": "should be searchable."}, {"start": 488.0, "text": "Once indexed, Siri can search your content, reason over it,"}, {"start": 492.0, "text": "and use it to answer questions, not just retrieve items."}, {"start": 498.0, "text": "IndexedEntity enables the best Siri experience with semantic matching,"}, {"start": 503.0, "text": "fewer follow-up questions, and more natural language understanding."}, {"start": 509.0, "text": "But not everything can be indexed."}, {"start": 511.0, "text": "Your dataset might be large, lives on a server,"}, {"start": 515.0, "text": "or changes too frequently to index ahead of time."}, {"start": 518.0, "text": "In those cases, you can use EntityStringQuery."}, {"start": 523.0, "text": "With a string query, Siri hands you the person's input."}, {"start": 527.0, "text": "Your app is responsible for finding matching entities and returning them."}, {"start": 534.0, "text": "You don't get semantic understanding, but you do get full control"}, {"start": 538.0, "text": "over how you search for and match your app's entities."}, {"start": 542.0, "text": "So to bring this all together,"}, {"start": 544.0, "text": "start by modeling your app's content as app entities."}, {"start": 548.0, "text": "Conform each entity to an AppSchema"}, {"start": 551.0, "text": "so Siri can understand what kind of thing it is."}, {"start": 555.0, "text": "When your data can be indexed, adopt IndexedEntity."}, {"start": 559.0, "text": "Or use EntityStringQuery when indexing isn't feasible."}, {"start": 564.0, "text": "This unlocks powerful experiences like answering questions"}, {"start": 568.0, "text": "and finding content instantly."}, {"start": 571.0, "text": "But entities on their own are just information."}, {"start": 575.0, "text": "Where things really get interesting is when you combine entities with actions."}, {"start": 581.0, "text": "App Intents are how your app exposes actions to the system."}, {"start": 586.0, "text": "But it's important to understand that not all actions are treated the same way."}, {"start": 590.0, "text": "So we're going to break this into two parts."}, {"start": 594.0, "text": "When you define an app intent, that action can show up across the system"}, {"start": 598.0, "text": "in places like Shortcuts, Spotlight, Widgets, and more."}, {"start": 603.0, "text": "This means people can discover and trigger your app's actions"}, {"start": 606.0, "text": "in many places, even without Siri."}, {"start": 610.0, "text": "You describe what the action does, you define its parameters,"}, {"start": 614.0, "text": "and you implement the behavior."}, {"start": 616.0, "text": "The system takes care of surfacing it, suggesting it, and wiring it"}, {"start": 621.0, "text": "into system experiences."}, {"start": 624.0, "text": "This is incredibly powerful and provides great benefits"}, {"start": 628.0, "text": "for your app and the people who use it."}, {"start": 631.0, "text": "But you can provide even more value by taking a few extra steps"}, {"start": 635.0, "text": "to bring your actions to Siri."}, {"start": 639.0, "text": "Just like entities use app schemas to be understood,"}, {"start": 643.0, "text": "actions use schemas to become executable by Siri."}, {"start": 647.0, "text": "Think of schemas as a specialization of App Intents."}, {"start": 651.0, "text": "They're still App Intents, but shaped in a way that Siri knows how to process."}, {"start": 658.0, "text": "Schemas define the kinds of actions Siri understands,"}, {"start": 662.0, "text": "the structure it expects,"}, {"start": 664.0, "text": "and how those actions map to natural language."}, {"start": 668.0, "text": "This is what allows Siri to confidently handle commands like:"}, {"start": 671.0, "text": "\"Send a message to Mary\", or: \"Play my focus Playlist\"."}, {"start": 676.0, "text": "Individual schemas define individual actions,"}, {"start": 679.0, "text": "but apps usually need a complete set."}, {"start": 683.0, "text": "That's why schemas are grouped into AppSchema domains."}, {"start": 687.0, "text": "Each domain represents a category of tasks,"}, {"start": 690.0, "text": "such as mail, photos, messages, and more."}, {"start": 695.0, "text": "When you integrate with a domain,"}, {"start": 697.0, "text": "you implement a set of predefined app schemas."}, {"start": 700.0, "text": "You map them to your app's functionality, and Siri immediately knows"}, {"start": 704.0, "text": "how to talk about your app in that domain."}, {"start": 708.0, "text": "Think of domains as categories of contracts between your app and Siri."}, {"start": 712.0, "text": "They tell Siri what your app can do, what actions are available,"}, {"start": 716.0, "text": "and how the system should respond."}, {"start": 719.0, "text": "For more details on how app schemas work, check out my video from WWDC24."}, {"start": 726.0, "text": "Now that we understand the difference between general App Intents"}, {"start": 730.0, "text": "and series-specific app schemas,"}, {"start": 732.0, "text": "let's bring this to life by adopting one of these domains"}, {"start": 736.0, "text": "in UnicornChat and wiring it up end-to-end."}, {"start": 741.0, "text": "Just like before, everything starts with entities."}, {"start": 744.0, "text": "In UnicornChat, we already modeled the two things we need to send a message."}, {"start": 750.0, "text": "Contacts which represents the recipient"}, {"start": 754.0, "text": "and exposes properties like a name and identifier."}, {"start": 761.0, "text": "And the message, which captures things like the message body and author."}, {"start": 768.0, "text": "These are app entities, which tell Siri who the message is going to"}, {"start": 772.0, "text": "and what is being sent."}, {"start": 774.0, "text": "Now, let me show you how we connect those entities to an action"}, {"start": 777.0, "text": "by adopting an app schema."}, {"start": 781.0, "text": "In Xcode, we start by typing the schema name."}, {"start": 785.0, "text": "Xcode already knows about all the available app schemas"}, {"start": 789.0, "text": "grouped by domain,"}, {"start": 790.0, "text": "and Autocomplete lets us pick exactly the one we want."}, {"start": 795.0, "text": "Since we're building messaging functionality,"}, {"start": 797.0, "text": "we select the sendMessage schema from the messages domain."}, {"start": 802.0, "text": "Instead of inventing a custom intent structure,"}, {"start": 805.0, "text": "we're adopting a schema Siri already understands"}, {"start": 808.0, "text": "and mapping it to UnicornChat's existing logic."}, {"start": 812.0, "text": "This tells Siri what the action does, which parameters it expects,"}, {"start": 817.0, "text": "like the recipient and the message content,"}, {"start": 819.0, "text": "and how to guide the customer if something is missing."}, {"start": 824.0, "text": "Our job is to map those schema parameters"}, {"start": 827.0, "text": "onto UnicornChat's existing messaging flow."}, {"start": 831.0, "text": "First, we process the parameters."}, {"start": 837.0, "text": "Then we pass them into UnicornChat's interface"}, {"start": 841.0, "text": "so the message is actually sent."}, {"start": 849.0, "text": "Finally, we return the newly sent message back to the system as an app entity."}, {"start": 859.0, "text": "And that's it."}, {"start": 861.0, "text": "Because this action is implemented as an app intent,"}, {"start": 864.0, "text": "it's available throughout the system."}, {"start": 867.0, "text": "And because it conforms to an app schema from the messages domain,"}, {"start": 871.0, "text": "Siri can execute it directly"}, {"start": 873.0, "text": "without you having to handle natural language yourself."}, {"start": 877.0, "text": "Let's see it in action."}, {"start": 880.0, "text": "Here I say: \"Send a message to Glow in UnicornChat,"}, {"start": 884.0, "text": "saying 'What movies do you recommend?'\""}, {"start": 890.0, "text": "Siri resolves Glow using our AppEntity query,"}, {"start": 894.0, "text": "invokes our intent, and sends it."}, {"start": 897.0, "text": "All without opening the app."}, {"start": 901.0, "text": "This is the power of app schemas."}, {"start": 903.0, "text": "Once your entities are in place, you connect them"}, {"start": 905.0, "text": "to well-defined actions and Siri handles the rest."}, {"start": 910.0, "text": "So to recap, App Intents expose actions to the system."}, {"start": 915.0, "text": "App schemas make those actions understandable by Siri."}, {"start": 919.0, "text": "App schema domains like messages"}, {"start": 922.0, "text": "package schemas into powerful end-to-end experiences."}, {"start": 926.0, "text": "Once you adopt a domain, Siri can speak your app's language fluently."}, {"start": 933.0, "text": "So far we focus on how Siri can understand your content"}, {"start": 936.0, "text": "and take actions inside your app."}, {"start": 939.0, "text": "But many real-world requests span multiple apps."}, {"start": 943.0, "text": "They start in one app, continue in another,"}, {"start": 946.0, "text": "and finish somewhere else."}, {"start": 948.0, "text": "For example: \"Hey Siri, email my wife this reply from Bubbles.\""}, {"start": 954.0, "text": "These experiences combine two capabilities,"}, {"start": 957.0, "text": "understanding what people are looking at"}, {"start": 959.0, "text": "and moving that content to another app."}, {"start": 964.0, "text": "Let's break that down into two parts."}, {"start": 967.0, "text": "First, Siri needs to understand that this reply from Bubbles refers to,"}, {"start": 972.0, "text": "that's on-screen awareness."}, {"start": 975.0, "text": "Then, Siri needs to pass that content into another app"}, {"start": 979.0, "text": "so an action can be performed."}, {"start": 981.0, "text": "That's content transfer."}, {"start": 983.0, "text": "We'll look at these one at a time."}, {"start": 986.0, "text": "To enable on-screen awareness,"}, {"start": 988.0, "text": "your app connects what's visible on-screen"}, {"start": 991.0, "text": "to structured information the system understands."}, {"start": 995.0, "text": "At the core of this is app entities."}, {"start": 998.0, "text": "When views are associated with entities,"}, {"start": 1000.0, "text": "Siri can resolve references like \"this message\""}, {"start": 1004.0, "text": "or \"that conversation\" without people naming them explicitly."}, {"start": 1009.0, "text": "There are two APIs for annotating on-screen content,"}, {"start": 1012.0, "text": "and they serve different purposes."}, {"start": 1015.0, "text": "Use UserActivity when there's one primary thing on-screen,"}, {"start": 1019.0, "text": "like viewing a document or composing a message."}, {"start": 1023.0, "text": "Use View annotations when multiple meaningful items are visible at once,"}, {"start": 1028.0, "text": "like messages in a conversation or items in a list."}, {"start": 1034.0, "text": "Here's how you can achieve this."}, {"start": 1036.0, "text": "Each row in this list represents real data in your app."}, {"start": 1040.0, "text": "In UnicornChat, that's a message."}, {"start": 1043.0, "text": "Each message row is annotated with its corresponding message entity."}, {"start": 1048.0, "text": "This explicitly connects what's on screen to the same entities"}, {"start": 1052.0, "text": "we already use for intents."}, {"start": 1055.0, "text": "It allows customers to say things like:"}, {"start": 1058.0, "text": "\"Edit this message\", or: \"Forward the last one\"."}, {"start": 1061.0, "text": "Siri resolves entities directly from the view,"}, {"start": 1065.0, "text": "enabling powerful in-app experiences."}, {"start": 1069.0, "text": "But the real power comes when you combine annotations with content transfer."}, {"start": 1075.0, "text": "Content transfer is what allows other apps to act on your entities."}, {"start": 1080.0, "text": "You enable this by exporting your entities using Transferable."}, {"start": 1084.0, "text": "This tells the system how to represent your content"}, {"start": 1087.0, "text": "in a form other apps can understand."}, {"start": 1091.0, "text": "For example: \"Text my wife this conversation\","}, {"start": 1094.0, "text": "or: \"Summarize this message\"."}, {"start": 1097.0, "text": "You do this by adopting Transferable and providing an IntentValueRepresentation."}, {"start": 1103.0, "text": "In UnicornChat, we export a ContactEntity as an IntentPerson."}, {"start": 1109.0, "text": "Once exported, the system can pass that content into actions from other apps."}, {"start": 1115.0, "text": "It enables use cases such as: \"Call this contact\"."}, {"start": 1119.0, "text": "Your app doesn't need to know what happens next."}, {"start": 1122.0, "text": "It just needs to describe its content accurately."}, {"start": 1127.0, "text": "When content comes into your app, there are usually two possibilities."}, {"start": 1132.0, "text": "Either that content refers to something that already exists,"}, {"start": 1136.0, "text": "or it represents something entirely new."}, {"start": 1140.0, "text": "You get to decide which path your app takes."}, {"start": 1143.0, "text": "If you're matching existing content, use IntentValueQuery."}, {"start": 1147.0, "text": "If you're creating something new,"}, {"start": 1149.0, "text": "use importing on the transferRepresentation."}, {"start": 1154.0, "text": "Use IntentValueQuery when incoming content should resolve to an existing app entity"}, {"start": 1159.0, "text": "in your app."}, {"start": 1160.0, "text": "Conceptually, this is very similar to entity query"}, {"start": 1164.0, "text": "but scope to intent parameters instead of standalone entity resolution."}, {"start": 1170.0, "text": "In this example, UnicornChat receives an IntentPerson from another app"}, {"start": 1175.0, "text": "and tries to match it into an existing ContactEntity."}, {"start": 1180.0, "text": "This is ideal when the content already exists in your app"}, {"start": 1184.0, "text": "or you want to select from existing data."}, {"start": 1187.0, "text": "You're essentially saying: giving this incoming value,"}, {"start": 1191.0, "text": "which of my entities does it refer to?"}, {"start": 1195.0, "text": "Use IntentValueRepresentation importing when incoming content should create"}, {"start": 1200.0, "text": "something new in your app."}, {"start": 1202.0, "text": "Instead of resolving to an existing entity,"}, {"start": 1205.0, "text": "you convert the incoming value"}, {"start": 1207.0, "text": "into a brand new app entity."}, {"start": 1210.0, "text": "In UnicornChat, this allows us to create a new unicorn"}, {"start": 1214.0, "text": "from an IntentPerson when needed."}, {"start": 1216.0, "text": "From the user's perspective, the content just works."}, {"start": 1220.0, "text": "But your app stays in control of how that content is stored and managed."}, {"start": 1227.0, "text": "So when importing content,"}, {"start": 1229.0, "text": "if the content already exists in your app,"}, {"start": 1232.0, "text": "resolve it."}, {"start": 1233.0, "text": "If it doesn't, import it."}, {"start": 1236.0, "text": "Many apps use both, depending on the intent and workflow."}, {"start": 1241.0, "text": "So to recap, on-screen awareness lets Siri understand what the user sees."}, {"start": 1247.0, "text": "Content transfer lets that content move across apps."}, {"start": 1250.0, "text": "Together, they unlock powerful multi-step experiences,"}, {"start": 1254.0, "text": "all built on app entities,"}, {"start": 1256.0, "text": "app intents, and schemas."}, {"start": 1259.0, "text": "Now that we've covered entities, actions, and working across apps,"}, {"start": 1264.0, "text": "let's talk about best practices."}, {"start": 1267.0, "text": "Beyond getting things working, there are a few practices"}, {"start": 1270.0, "text": "that make Siri work better with your app"}, {"start": 1272.0, "text": "and more resilient over time."}, {"start": 1275.0, "text": "Because while you can adopt individual schemas and APIs independently,"}, {"start": 1279.0, "text": "great Siri experiences often depend on how these pieces work together."}, {"start": 1284.0, "text": "And the good news is you don't have to figure this out alone."}, {"start": 1287.0, "text": "The tools are designed to help you along the way."}, {"start": 1291.0, "text": "Let me show you what I mean with a demo."}, {"start": 1294.0, "text": "Let's jump back into Xcode and pick up where we left off."}, {"start": 1298.0, "text": "In our last demo, we adopted the sendMessage schema in UnicornChat."}, {"start": 1303.0, "text": "That works great."}, {"start": 1304.0, "text": "People can send messages with Siri."}, {"start": 1307.0, "text": "But now, let's try to build."}, {"start": 1313.0, "text": "And we get a build error."}, {"start": 1315.0, "text": "Xcode is telling us that while we adopted sendMessage,"}, {"start": 1318.0, "text": "we haven't adopted the related draftMessage schema."}, {"start": 1322.0, "text": "This is important because some Siri scenarios require more than one schema"}, {"start": 1326.0, "text": "to deliver a complete experience."}, {"start": 1329.0, "text": "This isn't just a compiler error, it's a design hint."}, {"start": 1333.0, "text": "Xcode knows that if your app can send messages with Siri,"}, {"start": 1337.0, "text": "it also needs a way to draft messages,"}, {"start": 1340.0, "text": "especially when confirmation is required."}, {"start": 1343.0, "text": "So instead of failing silently at runtime, the build system surfaces this early."}, {"start": 1350.0, "text": "If we click into the error, Xcode offers a fix-it."}, {"start": 1358.0, "text": "Xcode generates a sample adoption of the draftMessage schema."}, {"start": 1363.0, "text": "This gives us an intent definition,"}, {"start": 1368.0, "text": "the required parameters"}, {"start": 1370.0, "text": "and a stub implementation."}, {"start": 1372.0, "text": "All wired correctly."}, {"start": 1375.0, "text": "From here, we just need to fill in the app specific pieces."}, {"start": 1380.0, "text": "First, we connect the intent to our entities."}, {"start": 1389.0, "text": "Then, we inject our dependencies."}, {"start": 1396.0, "text": "Next, we process the input."}, {"start": 1404.0, "text": "And finally, we open the message creation view."}, {"start": 1411.0, "text": "Since this action mutates UI state, it needs to run on the main actor."}, {"start": 1421.0, "text": "Now, when we build again, the build succeeds."}, {"start": 1426.0, "text": "We've completed the schema adoption, and Siri now has everything it needs"}, {"start": 1430.0, "text": "to guide people through the full messaging flow."}, {"start": 1435.0, "text": "The important thing to remember is,"}, {"start": 1437.0, "text": "if a Siri experience depends on multiple schemas,"}, {"start": 1441.0, "text": "Xcode will tell you, show you what's missing,"}, {"start": 1444.0, "text": "and help you generate the right remaining steps."}, {"start": 1447.0, "text": "This makes it much easier to build complete high-quality integrations."}, {"start": 1453.0, "text": "Once you've adopted your schemas, testing becomes critical."}, {"start": 1458.0, "text": "And the best place to start is AppIntentsTesting."}, {"start": 1462.0, "text": "This is a new testing framework that lets you exercise your intents"}, {"start": 1466.0, "text": "entirely in isolation."}, {"start": 1468.0, "text": "No Siri involved."}, {"start": 1471.0, "text": "You can invoke your intent, pass in parameters,"}, {"start": 1474.0, "text": "and validate the result, just like any other integration test."}, {"start": 1479.0, "text": "This is the fastest and most reliable way to validate your business logic"}, {"start": 1484.0, "text": "early in development."}, {"start": 1487.0, "text": "Check out the video \"Validate your App Intents adoption"}, {"start": 1490.0, "text": "with AppIntentsTesting\" to learn more."}, {"start": 1494.0, "text": "Once your logic is solid, the next step is the Shortcuts app."}, {"start": 1498.0, "text": "Shortcuts gives you a structured UI for your intents."}, {"start": 1502.0, "text": "Letting you inspect parameters, tweak inputs,"}, {"start": 1505.0, "text": "and understand how your action is presented to people."}, {"start": 1509.0, "text": "This is where you validate the shape of your intent."}, {"start": 1512.0, "text": "Not just what it does, but how it's configured and exposed."}, {"start": 1518.0, "text": "Next, move to Spotlight."}, {"start": 1520.0, "text": "Spotlight is where you validate your content integration,"}, {"start": 1524.0, "text": "ensuring your entities are indexed correctly, discoverable, and linkable."}, {"start": 1530.0, "text": "This helps you confirm that Siri can find the right data"}, {"start": 1534.0, "text": "before it ever tries to act on it."}, {"start": 1538.0, "text": "Finally, test a complete experience with Siri."}, {"start": 1541.0, "text": "This is where everything comes together."}, {"start": 1544.0, "text": "Natural language, entity resolution, on-screen context,"}, {"start": 1548.0, "text": "and cross-app workflows."}, {"start": 1550.0, "text": "Testing end-to-end ensures that everything works together"}, {"start": 1554.0, "text": "the way your customers expect."}, {"start": 1557.0, "text": "At this point, you've seen how to model your content with app entities."}, {"start": 1563.0, "text": "Expose actions using App Intents and app schemas."}, {"start": 1566.0, "text": "Enable cross-app workflows."}, {"start": 1569.0, "text": "And use tooling to build and test confidently."}, {"start": 1573.0, "text": "So let's wrap up with a few concrete next steps."}, {"start": 1578.0, "text": "Here's how to get started."}, {"start": 1579.0, "text": "Model and index your entities to Spotlight so Siri can find your content."}, {"start": 1585.0, "text": "Adopt app schema domains that match your app's core experiences."}, {"start": 1589.0, "text": "Adopt Transferable to enable content import and export."}, {"start": 1594.0, "text": "And test early and often using AppIntentsTesting,"}, {"start": 1598.0, "text": "then Shortcuts, Spotlight, and Siri."}, {"start": 1602.0, "text": "All of these APIs are available today, and they're designed to scale"}, {"start": 1606.0, "text": "with your app as Siri continues to evolve."}, {"start": 1611.0, "text": "Siri is becoming more powerful, more contextual, and more capable."}, {"start": 1616.0, "text": "And App Intents are the foundation that make that possible."}, {"start": 1620.0, "text": "By bringing your app to Siri, you're not just adding voice support."}, {"start": 1624.0, "text": "You're making your app faster,"}, {"start": 1626.0, "text": "more accessible, and easier to use across the system."}, {"start": 1630.0, "text": "Thanks for watching, and we can't wait to see what you build."}]}