{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-260", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/260", "wordCount": 2406, "segments": [{"start": 7.0, "text": "I'm Matt, and I am an engineer on the Devices team."}, {"start": 10.0, "text": "Later, we'll be joined by my colleague - Hassan."}, {"start": 13.0, "text": "We know how important it is to you that your app looks great everywhere -"}, {"start": 18.0, "text": "on every device, at every appearance, at every text size, and more."}, {"start": 24.0, "text": "And we also know - that can be a lot to account for."}, {"start": 28.0, "text": "So, in this session, we'll introduce you to Device Hub,"}, {"start": 32.0, "text": "an app that makes this easy"}, {"start": 35.0, "text": "and we'll walk through everything it can do."}, {"start": 38.0, "text": "Here's our plan."}, {"start": 40.0, "text": "First, an introduction to Device Hub -"}, {"start": 42.0, "text": "an app that is your home for working with both devices and simulators."}, {"start": 47.0, "text": "Then, a feature walkthrough - we'll learn how to use it to organize,"}, {"start": 51.0, "text": "control, and configure your devices."}, {"start": 54.0, "text": "Finally, you'll see it in action."}, {"start": 56.0, "text": "We'll show you an example."}, {"start": 58.0, "text": "Hassan and I will use Device Hub in a real workflow."}, {"start": 62.0, "text": "Let's get started."}, {"start": 64.0, "text": "This is Device Hub."}, {"start": 66.0, "text": "It's an app that ships alongside Xcode 27."}, {"start": 69.0, "text": "But you don't need to launch Xcode to use it"}, {"start": 72.0, "text": "because it's built for anyone who works with devices,"}, {"start": 75.0, "text": "whether you're developing an app, testing across device configurations,"}, {"start": 78.0, "text": "or managing an inventory of devices."}, {"start": 82.0, "text": "It offers the same set of tools -"}, {"start": 84.0, "text": "whether you're working with a device or a simulator."}, {"start": 87.0, "text": "You can configure either of them however you need."}, {"start": 91.0, "text": "If you're developing an app you'll encounter Device Hub right away."}, {"start": 96.0, "text": "When you build and run to a simulator in Xcode it's automatically launched."}, {"start": 100.0, "text": "It presents a window with a live, interactive view of the screen."}, {"start": 105.0, "text": "This is Device Hub in compact mode."}, {"start": 109.0, "text": "It's a focused and lightweight window."}, {"start": 112.0, "text": "Just the screen and a few essentials."}, {"start": 116.0, "text": "At the bottom are device controls."}, {"start": 119.0, "text": "Things like the home button, screenshots, and rotation."}, {"start": 122.0, "text": "And, they're contextual, so - they change depending on the device you're viewing."}, {"start": 128.0, "text": "For example, on an Apple TV"}, {"start": 130.0, "text": "you'll find controls for both play/pause and navigation."}, {"start": 135.0, "text": "On an Apple Vision Pro - you'll see controls for environment"}, {"start": 138.0, "text": "and camera movement."}, {"start": 140.0, "text": "Or, on an Apple Watch, you'll find both the side button - and the Digital Crown."}, {"start": 146.0, "text": "But Device Hub is much more than this."}, {"start": 150.0, "text": "When these essentials aren't enough,"}, {"start": 152.0, "text": "click the expand button at the top to transition to the full window."}, {"start": 156.0, "text": "Here, you'll have access to a much broader set of tools."}, {"start": 160.0, "text": "There is a lot going on here in the full window."}, {"start": 163.0, "text": "So, let's walk through all of its features."}, {"start": 167.0, "text": "They fall into three areas:"}, {"start": 169.0, "text": "the ability to control, organize, and configure your devices."}, {"start": 174.0, "text": "To tell you more about how to control your devices,"}, {"start": 177.0, "text": "I'll hand it over to Hassan."}, {"start": 180.0, "text": "Thanks Matt!"}, {"start": 181.0, "text": "When developing, my devices can be all over the place,"}, {"start": 185.0, "text": "and driving the device from my screen can help me stay focused on my work."}, {"start": 189.0, "text": "Device Hub makes this easier for me"}, {"start": 192.0, "text": "by giving me Advanced features to control my devices,"}, {"start": 195.0, "text": "They can be found in the canvas at the center of the window."}, {"start": 200.0, "text": "There is a live display of the screen."}, {"start": 202.0, "text": "You can interact with it directly."}, {"start": 204.0, "text": "Click, drag, scroll or use natural trackpad gestures."}, {"start": 209.0, "text": "This works the same whether it's a device or simulator."}, {"start": 213.0, "text": "Take a look here."}, {"start": 214.0, "text": "I have my Apple Watch connected."}, {"start": 216.0, "text": "See how I can control it using Device Hub."}, {"start": 221.0, "text": "At the bottom there are the same controls as the compact window."}, {"start": 225.0, "text": "And just like them, they are contextual and will change depending on the device."}, {"start": 231.0, "text": "Above the canvas there are controls that are not in the compact window."}, {"start": 236.0, "text": "These allow you to zoom in and out,"}, {"start": 239.0, "text": "or snap to one-to-one physical size to see your app at its real world dimensions."}, {"start": 245.0, "text": "Resize mode, allows you to transform your app's dimensions freely."}, {"start": 250.0, "text": "And that will be discussed in the \"Modernize your UIKit app\" session."}, {"start": 254.0, "text": "Capture keyboard routes your Mac's keystrokes straight to the device."}, {"start": 259.0, "text": "Making it easy to test key commands and hardware support."}, {"start": 263.0, "text": "And a button allowing you to switch back to compact mode."}, {"start": 268.0, "text": "So, that's the canvas."}, {"start": 269.0, "text": "It's a powerful way to interact with your devices right from Device Hub."}, {"start": 274.0, "text": "Back to Matt, to talk to you about how to organize"}, {"start": 276.0, "text": "and configure your devices."}, {"start": 279.0, "text": "Thanks Hassan."}, {"start": 280.0, "text": "I work with dozens of devices and simulators"}, {"start": 283.0, "text": "and it can become hard to keep track of all of them."}, {"start": 287.0, "text": "Fortunately Device Hub has tools both to organize them and offer quick access."}, {"start": 295.0, "text": "They can be found in the sidebar."}, {"start": 297.0, "text": "In it - you can see your full inventory."}, {"start": 299.0, "text": "That's each of your devices and simulators all in one place."}, {"start": 305.0, "text": "Use the filter menu at the top to change which are visible."}, {"start": 309.0, "text": "Or use it to sort and group your inventory from several different options."}, {"start": 314.0, "text": "Context-click any device for quick actions."}, {"start": 317.0, "text": "Things like restarting or pairing an iPhone and Apple Watch simulator together."}, {"start": 322.0, "text": "For quick access, you can also view any number of devices at once"}, {"start": 326.0, "text": "using either tabs or stand-alone compact windows."}, {"start": 330.0, "text": "For example, say you are building an iOS app,"}, {"start": 334.0, "text": "and you want to make sure it looks correct on a few different phone sizes."}, {"start": 339.0, "text": "Select them all, double click them in the sidebar,"}, {"start": 342.0, "text": "and you'll get a compact window for each."}, {"start": 345.0, "text": "Making it easy to compare your app across screen sizes."}, {"start": 349.0, "text": "So, I can organize my devices using the tools in the sidebar."}, {"start": 353.0, "text": "But, testing different text sizes, simulating different locations,"}, {"start": 358.0, "text": "or installing different profiles - that can still take a lot of time."}, {"start": 364.0, "text": "So, Device Hub offers deep control over device configuration."}, {"start": 369.0, "text": "It has five different panels to do this."}, {"start": 374.0, "text": "And, they can be found in the inspector area - on the right."}, {"start": 379.0, "text": "The first tab contains device settings."}, {"start": 382.0, "text": "Here you can change how your device looks and behaves."}, {"start": 386.0, "text": "The first section contains appearance options."}, {"start": 389.0, "text": "Things like dark mode, text size, and more."}, {"start": 392.0, "text": "And these changes take effect instantly."}, {"start": 395.0, "text": "So there's no need to dig through your device's settings."}, {"start": 399.0, "text": "The second, lets you test how your app responds to different conditions,"}, {"start": 403.0, "text": "like a change in location."}, {"start": 405.0, "text": "And the third has audio options for sound levels and I/O."}, {"start": 412.0, "text": "The middle tab contains diagnostic reports."}, {"start": 415.0, "text": "It's where you will start investigating if your app hangs or crashes."}, {"start": 419.0, "text": "It contains everything your device has logged -"}, {"start": 422.0, "text": "such as crashes, spins, and other diagnostics."}, {"start": 429.0, "text": "The third tab has three panels: device Info, Apps, and Profiles."}, {"start": 435.0, "text": "Let's go through each."}, {"start": 438.0, "text": "The Info panel contains things such as storage, model, and serial number -"}, {"start": 442.0, "text": "stuff that you need at a glance."}, {"start": 446.0, "text": "The Apps panel lets you install, uninstall, and manage apps,"}, {"start": 450.0, "text": "including downloading and replacing their data containers."}, {"start": 455.0, "text": "And, in the Profiles panel you can manage both configuration"}, {"start": 459.0, "text": "and provisioning profiles."}, {"start": 462.0, "text": "So, that completes our feature walkthrough of Device Hub."}, {"start": 466.0, "text": "It's a feature rich app, and we've covered a lot of ground."}, {"start": 471.0, "text": "From organizing your devices in the sidebar,"}, {"start": 473.0, "text": "to controlling them from the canvas,"}, {"start": 477.0, "text": "to configuring them with five panels in the inspector."}, {"start": 481.0, "text": "Now, I'll hand it over to Hassan,"}, {"start": 483.0, "text": "- to show you how Device Hub fits into our development workflows."}, {"start": 488.0, "text": "We are going to walk through a scenario:"}, {"start": 490.0, "text": "finding a bug on a real device and reproducing it on a simulator."}, {"start": 495.0, "text": "Thanks Matt!"}, {"start": 496.0, "text": "Now let's see it all come together."}, {"start": 499.0, "text": "Matt and I have been building a feature in a workout app."}, {"start": 503.0, "text": "We will show users recovery advice,"}, {"start": 505.0, "text": "based of the altitude of their current location."}, {"start": 508.0, "text": "But this feature has a bug!"}, {"start": 510.0, "text": "For example, in landscape mode some of the text gets cut off."}, {"start": 516.0, "text": "So let's go through my workflow."}, {"start": 518.0, "text": "What features of Device Hub that I use the most?"}, {"start": 521.0, "text": "What do I do when I see an issue like this one?"}, {"start": 525.0, "text": "There are three things I focus on."}, {"start": 527.0, "text": "Pairing devices, ensuring that I have enough logs, and capturing diagnostics."}, {"start": 532.0, "text": "Our Workout app runs on the Apple Watch and the iPhone."}, {"start": 536.0, "text": "Using Device Hub I can wirelessly pair both of them to my Mac."}, {"start": 540.0, "text": "My iPhone is already paired."}, {"start": 543.0, "text": "Let's look at how I would pair an Apple Watch."}, {"start": 546.0, "text": "I'll click the add button in the sidebar and choose Pair Nearby Device."}, {"start": 553.0, "text": "Then I'll follow the instructions on the screen."}, {"start": 557.0, "text": "My Mac shows up right away on my Apple Watch."}, {"start": 559.0, "text": "I'll select it, tap pair,"}, {"start": 563.0, "text": "and finally enter the pin number that appears in Device Hub."}, {"start": 576.0, "text": "And that's it."}, {"start": 577.0, "text": "My Watch is paired."}, {"start": 579.0, "text": "It shows up right here in the sidebar, just like my iPhone."}, {"start": 583.0, "text": "And from now on whenever it's nearby it'll be available on Device Hub."}, {"start": 588.0, "text": "Next, since we are working on a location-based feature,"}, {"start": 592.0, "text": "I would like to have the CoreLocation logging profile installed."}, {"start": 596.0, "text": "Let's take a look at how to add a configuration profile."}, {"start": 600.0, "text": "I'll go to the Profiles panel,"}, {"start": 603.0, "text": "drag and drop the configuration profile and confirm the installation on my iPhone."}, {"start": 617.0, "text": "Then, I'll make sure to reboot my iPhone for privacy reasons."}, {"start": 623.0, "text": "Finally, Matt is our UI engineer,"}, {"start": 625.0, "text": "so he'll be the best person to investigate this issue."}, {"start": 629.0, "text": "I just don't know what he will need to debug it."}, {"start": 632.0, "text": "So I'm going to collect as many diagnostics as possible."}, {"start": 636.0, "text": "Let's take a look at how to do that."}, {"start": 638.0, "text": "After building and running the app from Xcode,"}, {"start": 640.0, "text": "I can see and interact with the app right here on my Mac."}, {"start": 647.0, "text": "I need to reproduce the bug, so I will rotate the device."}, {"start": 655.0, "text": "Here's the bug!"}, {"start": 656.0, "text": "The recovery recommendation is getting cut off!"}, {"start": 659.0, "text": "So first, let me take a screenshot of the bug,"}, {"start": 661.0, "text": "so Matt can see that our UI is broken."}, {"start": 666.0, "text": "Next, in case Matt needs to dig deeper, I'll kick off a sysdiagnose"}, {"start": 670.0, "text": "to capture system-level diagnostics."}, {"start": 681.0, "text": "That'll take some time."}, {"start": 682.0, "text": "While it's running, I'll send the text that's getting clipped to Matt."}, {"start": 687.0, "text": "I'll select it right here on the device,"}, {"start": 691.0, "text": "copy it"}, {"start": 693.0, "text": "and paste it into a file on my Mac."}, {"start": 698.0, "text": "Matt might need my app's data to be able to reproduce this bug."}, {"start": 702.0, "text": "And working with app data containers is a common part of my workflow."}, {"start": 706.0, "text": "Device Hub gives you everything you need to work with app data containers."}, {"start": 711.0, "text": "As of now you can inspect a saved state in Finder,"}, {"start": 715.0, "text": "restore to a known baseline,"}, {"start": 718.0, "text": "or capturing a snapshot for later."}, {"start": 723.0, "text": "Here's all of the data my app has stored."}, {"start": 729.0, "text": "I will download that,"}, {"start": 731.0, "text": "so Matt can load it into his simulator."}, {"start": 736.0, "text": "That should be enough."}, {"start": 737.0, "text": "Let's send this all over to Matt so he can take a look."}, {"start": 740.0, "text": "Matt, this UI issue is all you."}, {"start": 744.0, "text": "Thanks Hassan."}, {"start": 745.0, "text": "So, when I see UI issues like this, that don't affect performance,"}, {"start": 750.0, "text": "I like to reproduce them using simulators."}, {"start": 753.0, "text": "There's a few steps that I like to take to do this."}, {"start": 757.0, "text": "First, I'll need to choose the correct simulator,"}, {"start": 759.0, "text": "then match the app's data,"}, {"start": 761.0, "text": "and finally mirror the device's configuration."}, {"start": 765.0, "text": "Let's start by selecting a simulator."}, {"start": 768.0, "text": "Hassan was using an iPhone 17e, and I don't have one."}, {"start": 773.0, "text": "But, I do have a corresponding simulator."}, {"start": 777.0, "text": "I have it here in the sidebar."}, {"start": 779.0, "text": "I'll select it,"}, {"start": 780.0, "text": "and verify it says iPhone 17e in the info panel."}, {"start": 786.0, "text": "Next, I want to ensure that I'm using the same data"}, {"start": 789.0, "text": "as the app that reported the bug."}, {"start": 791.0, "text": "Just in case any of it is problematic."}, {"start": 795.0, "text": "So, I need my app to match his app's data."}, {"start": 799.0, "text": "My version of the app is empty."}, {"start": 802.0, "text": "But, Hassan sent me his data container,"}, {"start": 804.0, "text": "so I'll go to the Apps inspector and replace mine with his."}, {"start": 814.0, "text": "Now, when I relaunch the app I can see all of his workouts."}, {"start": 821.0, "text": "Finally, I want to mirror his config."}, {"start": 824.0, "text": "I want my simulator's settings to match his device's, as much as possible."}, {"start": 830.0, "text": "Let's go ahead and do that and match any appearance"}, {"start": 833.0, "text": "or accessibility settings that could affect the UI."}, {"start": 836.0, "text": "To start, looking at the screenshot he sent over,"}, {"start": 839.0, "text": "I can see his phone was in landscape mode."}, {"start": 842.0, "text": "So, I'll mirror that."}, {"start": 844.0, "text": "I can rotate my simulator using the device controls."}, {"start": 848.0, "text": "Next, I see that his location is set to Johannesburg."}, {"start": 853.0, "text": "It seems like at that high elevation"}, {"start": 855.0, "text": "we have a long string for a recovery suggestion."}, {"start": 858.0, "text": "So, I'll simulate his location by navigating to the settings inspector"}, {"start": 862.0, "text": "and selecting Johannesburg."}, {"start": 867.0, "text": "Now, it doesn't seem like we are seeing the same text get truncated like he was."}, {"start": 872.0, "text": "So, something else must be different."}, {"start": 875.0, "text": "Taking another look at the screenshot."}, {"start": 879.0, "text": "I can see his text size is pretty large."}, {"start": 882.0, "text": "So that might be it, let's match that as well."}, {"start": 885.0, "text": "I'll bump it up and yup!"}, {"start": 890.0, "text": "Now we can see that truncation happening."}, {"start": 892.0, "text": "And, I bet if I rotate it back it doesn't happen."}, {"start": 896.0, "text": "So, this bug seems to have been a rather striking confluence of things."}, {"start": 901.0, "text": "The device had to be in landscape, it needed to be at a specific location,"}, {"start": 906.0, "text": "and his text size needed to be all the way up."}, {"start": 909.0, "text": "Only with all of these were we able to reproduce the issue."}, {"start": 912.0, "text": "Device Hub let me do all of it."}, {"start": 915.0, "text": "Now, with it reproduced, it is easier to go verify a fix."}, {"start": 919.0, "text": "So that was an example of a workflow:"}, {"start": 922.0, "text": "Hassan found a bug, and I reproduced it."}, {"start": 924.0, "text": "All using Device Hub."}, {"start": 926.0, "text": "Thanks for those great diagnostics Hassan!"}, {"start": 929.0, "text": "Of course, Matt!"}, {"start": 931.0, "text": "Whether you're working with a simulator or a device,"}, {"start": 934.0, "text": "Device Hub gives you a consistent experience across both."}, {"start": 938.0, "text": "From live screens and hardware controls"}, {"start": 941.0, "text": "to app management, appearance settings, and more."}, {"start": 944.0, "text": "And when something goes wrong, Device Hub gives you everything you need"}, {"start": 947.0, "text": "to collect diagnostics and investigate issues"}, {"start": 950.0, "text": "But that's not all!"}, {"start": 952.0, "text": "For scripts and automation, use devicectl."}, {"start": 955.0, "text": "It's a command line tool"}, {"start": 956.0, "text": "based on the same underlying technology as Device Hub."}, {"start": 959.0, "text": "It's great for managing devices in a test environment,"}, {"start": 962.0, "text": "managing apps, capturing diagnostics, and more."}, {"start": 966.0, "text": "For example, you can use devicectl to list your devices,"}, {"start": 971.0, "text": "install an app onto your device,"}, {"start": 974.0, "text": "change settings such as switching between dark and light modes,"}, {"start": 978.0, "text": "or getting more information about one of your devices."}, {"start": 982.0, "text": "And if you want a structured output, you can use the json-output option"}, {"start": 985.0, "text": "to easily integrate into scripts or CI workflows."}, {"start": 990.0, "text": "There's a lot more to explore."}, {"start": 992.0, "text": "Download Xcode 27 and try Device Hub for yourself."}, {"start": 995.0, "text": "If you want to integrate into scripts or CI workflows, check out devicectl."}, {"start": 1000.0, "text": "See how Device Hub can help you improve your app for resizability"}, {"start": 1004.0, "text": "in the \"Modernize your UIKit app\" session."}, {"start": 1006.0, "text": "Check out \"Getting the Most Out of Simulator\" from WWDC 2019."}, {"start": 1012.0, "text": "And for everything else,"}, {"start": 1013.0, "text": "we've linked the Device Hub documentation in the video description."}, {"start": 1017.0, "text": "Thank you for watching."}, {"start": 1019.0, "text": "We can't wait to see what you build next."}]}