{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-378", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/378", "wordCount": 1506, "segments": [{"start": 7.0, "text": "Hello, I'm Sam, and I'm an engineer on the StoreKit team."}, {"start": 11.0, "text": "In this session, I'll dive into new tools"}, {"start": 14.0, "text": "to help you create the best games on Apple platforms."}, {"start": 17.0, "text": "First, I'll cover updates to Background Assets."}, {"start": 21.0, "text": "Then, I'll introduce new Unity plug-ins"}, {"start": 23.0, "text": "to help deliver a great In-App Purchase experience."}, {"start": 26.0, "text": "Finally, I'll review how to enhance your presence"}, {"start": 29.0, "text": "on the App Store and Apple Games app."}, {"start": 32.0, "text": "I'll start with updates to Background Assets."}, {"start": 36.0, "text": "Here's an app I've been working on called The Coast."}, {"start": 38.0, "text": "It's a jam-packed game with many different levels to play."}, {"start": 42.0, "text": "In addition to the game content, the app includes lots of audio,"}, {"start": 46.0, "text": "video, textures, and machine learning models,"}, {"start": 49.0, "text": "but these assets are only really needed at specific moments."}, {"start": 53.0, "text": "Rather than downloading all of the assets upfront"}, {"start": 56.0, "text": "and taking up storage space,"}, {"start": 57.0, "text": "Managed Background Assets saves your players time and storage."}, {"start": 62.0, "text": "The system automatically downloads your asset packs when they're needed"}, {"start": 65.0, "text": "to provide a great gaming experience for players."}, {"start": 69.0, "text": "And for apps on the App Store,"}, {"start": 71.0, "text": "Apple can host up to 200 GB of assets per app,"}, {"start": 74.0, "text": "included in the Developer Program membership."}, {"start": 78.0, "text": "Apple-Hosted Background Assets is available starting with iOS,"}, {"start": 81.0, "text": "iPadOS, macOS, tvOS, and visionOS 26."}, {"start": 86.0, "text": "For a deep dive on setup and API integration,"}, {"start": 89.0, "text": "check out the session"}, {"start": 91.0, "text": "\"Discover Apple-Hosted Background Assets\" from WWDC25."}, {"start": 95.0, "text": "In iOS 27, Managed Background Assets becomes even more powerful"}, {"start": 100.0, "text": "with localized asset packs."}, {"start": 102.0, "text": "Localized asset packs greatly reduce the size of assets"}, {"start": 105.0, "text": "that players need to download"}, {"start": 107.0, "text": "by allowing the system to identify the player's preferred language"}, {"start": 110.0, "text": "selected in Settings,"}, {"start": 112.0, "text": "and only deliver assets for your game in that language."}, {"start": 116.0, "text": "If asset packs for the user-selected language are not provided,"}, {"start": 119.0, "text": "the system automatically falls back to the closest language match."}, {"start": 124.0, "text": "In The Coast, I set English as the primary language,"}, {"start": 127.0, "text": "with French and German also available."}, {"start": 130.0, "text": "Without localized asset packs,"}, {"start": 132.0, "text": "the system installs all of these assets to the player's device."}, {"start": 136.0, "text": "After localizing my asset packs,"}, {"start": 138.0, "text": "if a player sets their system-wide language preference as German,"}, {"start": 142.0, "text": "the system only installs the German asset packs on their device."}, {"start": 146.0, "text": "Localizing asset packs significantly decreases the storage"}, {"start": 150.0, "text": "that my game requires."}, {"start": 153.0, "text": "If I select English-UK as my system language preference,"}, {"start": 156.0, "text": "the system understands that an English-UK asset pack was not provided."}, {"start": 161.0, "text": "As a fallback, the base language asset pack of the preferred user language is used,"}, {"start": 166.0, "text": "which in this case defaults to English-US."}, {"start": 170.0, "text": "In another scenario, if I select Spanish as my system language preference,"}, {"start": 174.0, "text": "The Coast did not provide Spanish asset packs,"}, {"start": 177.0, "text": "and there is no similar regional variant available,"}, {"start": 179.0, "text": "so here the system falls back to the primary app language"}, {"start": 183.0, "text": "which is English."}, {"start": 186.0, "text": "To support localized asset packs in your game,"}, {"start": 189.0, "text": "update your asset pack manifest JSON files with a language tag."}, {"start": 193.0, "text": "If you're building a game on Steam,"}, {"start": 195.0, "text": "you may already manage your game's assets with depots."}, {"start": 199.0, "text": "You can now more easily convert your Steam depots to asset packs"}, {"start": 202.0, "text": "to distribute with your game on Apple platforms."}, {"start": 206.0, "text": "To use the Steam asset converter on macOS,"}, {"start": 209.0, "text": "install Xcode 27,"}, {"start": 211.0, "text": "and run xcrun ba-package convert on the command line."}, {"start": 215.0, "text": "Three arguments are passed in:"}, {"start": 217.0, "text": "the ID of the asset pack, the language ID, if applicable,"}, {"start": 222.0, "text": "and the desired download policy."}, {"start": 225.0, "text": "Pass your Steam manifest build script as input,"}, {"start": 228.0, "text": "and an asset pack manifest with the specified name will be output."}, {"start": 233.0, "text": "The same tool is coming soon to Linux and Windows."}, {"start": 237.0, "text": "Once the asset pack manifest is created,"}, {"start": 239.0, "text": "you can generate an asset pack archive by running ba-package again"}, {"start": 243.0, "text": "using the new manifest file as input,"}, {"start": 246.0, "text": "and an asset pack archive will be output."}, {"start": 250.0, "text": "The packaged asset pack archive is now ready to be used in your game!"}, {"start": 254.0, "text": "If you are developing with Unity,"}, {"start": 256.0, "text": "you can also utilize the updates to Background Assets."}, {"start": 260.0, "text": "I'm excited to share two new plug-ins"}, {"start": 262.0, "text": "are joining the Apple Unity plug-in portfolio:"}, {"start": 265.0, "text": "Background Assets and StoreKit."}, {"start": 268.0, "text": "Apple Unity plug-ins enable your game to tap into the latest features"}, {"start": 272.0, "text": "and game services across Apple platforms."}, {"start": 276.0, "text": "The Background Assets and StoreKit plug-ins are available now for download,"}, {"start": 280.0, "text": "alongside Apple's existing plug-ins on GitHub."}, {"start": 283.0, "text": "The repository can be found in the resources of this session,"}, {"start": 287.0, "text": "and it provides instructions for building and installing the plug-ins."}, {"start": 292.0, "text": "Once you download the new Unity plug-ins,"}, {"start": 294.0, "text": "you can build them with the same Python script"}, {"start": 296.0, "text": "used to build the other Apple Unity plug-ins."}, {"start": 299.0, "text": "Both new plug-ins expose a C#-based Unity API"}, {"start": 303.0, "text": "which acts as a bridge to the underlying native framework."}, {"start": 307.0, "text": "To build, package, and test the plug-ins,"}, {"start": 309.0, "text": "use Xcode 27, Python 3, and Unity 2022 LTS or later."}, {"start": 316.0, "text": "Check out the Meet with Apple session:"}, {"start": 317.0, "text": "\"Chart your game's course to Apple platforms\""}, {"start": 320.0, "text": "to learn more about setting up and configuring your project"}, {"start": 322.0, "text": "with other Unity plug-ins from Apple."}, {"start": 325.0, "text": "And for best practices when building your game,"}, {"start": 327.0, "text": "check out \"Plug-in and play: Add Apple frameworks to your Unity game projects\""}, {"start": 332.0, "text": "from WWDC22."}, {"start": 336.0, "text": "Once the plug-ins are installed in your project,"}, {"start": 338.0, "text": "open your game in the Unity editor."}, {"start": 341.0, "text": "By adopting StoreKit in your project,"}, {"start": 343.0, "text": "you can reach players around the world, across all Apple platforms,"}, {"start": 347.0, "text": "and offer In-App Purchases"}, {"start": 349.0, "text": "through the App Store's safe and trusted commerce platform."}, {"start": 353.0, "text": "The C# version of the StoreKit APIs provides access to common flows"}, {"start": 357.0, "text": "like fetching and merchandising your In-App Purchase products"}, {"start": 360.0, "text": "with the Product API."}, {"start": 362.0, "text": "And, you can initiate a purchase for products in your game"}, {"start": 365.0, "text": "using the Purchase API to display the system payment sheet."}, {"start": 369.0, "text": "After purchasing, use the PurchaseResult to check that the purchase was successful"}, {"start": 374.0, "text": "and the transaction IsVerified."}, {"start": 376.0, "text": "Then, deliver the purchased content to your players"}, {"start": 379.0, "text": "and call Finish() to complete the transaction."}, {"start": 382.0, "text": "Throughout your game's lifecycle,"}, {"start": 384.0, "text": "listen for new transactions with the Transaction.Updates sequence."}, {"start": 388.0, "text": "A transaction is emitted through this sequence"}, {"start": 390.0, "text": "any time the system creates or updates transactions"}, {"start": 393.0, "text": "that occur outside your app or on other devices."}, {"start": 397.0, "text": "Here, I have an OnUpdate handler"}, {"start": 400.0, "text": "that is called at app startup inside a listener for transaction updates."}, {"start": 404.0, "text": "For consumables, I first check that the transaction was not revoked"}, {"start": 408.0, "text": "and then grant access to the customer."}, {"start": 410.0, "text": "For non-consumables and subscriptions, currentEntitlements is the source of truth"}, {"start": 415.0, "text": "for what a customer is entitled to."}, {"start": 417.0, "text": "It already filters refunded, revoked, and expired states"}, {"start": 421.0, "text": "for nonconsumables and subscriptions,"}, {"start": 423.0, "text": "so we can grant access to customers once we know the transaction is verified."}, {"start": 428.0, "text": "Finally, call Finish() on your verifiedTransaction."}, {"start": 433.0, "text": "When content is purchased by your players, you can use the Background Assets plug-in"}, {"start": 437.0, "text": "to ensure an asset pack is locally available"}, {"start": 439.0, "text": "and then start serving the content to players."}, {"start": 443.0, "text": "If a download is necessary,"}, {"start": 444.0, "text": "then you can monitor download progress, and update your game's UI"}, {"start": 448.0, "text": "by iterating over the status updates"}, {"start": 450.0, "text": "that the DownloadStatusUpdatesAsync method yields."}, {"start": 454.0, "text": "After configuring your game with the new plug-ins,"}, {"start": 457.0, "text": "export your project to Xcode,"}, {"start": 458.0, "text": "and leverage the powerful testing capabilities"}, {"start": 461.0, "text": "included with StoreKit Testing in Xcode and the Background Assets mock server."}, {"start": 466.0, "text": "To set up StoreKit Testing in Xcode,"}, {"start": 468.0, "text": "create a StoreKit configuration file and add your test products."}, {"start": 473.0, "text": "Then, edit your target's scheme,"}, {"start": 475.0, "text": "select Run,"}, {"start": 477.0, "text": "and choose your StoreKit Configuration file in the drop-down."}, {"start": 480.0, "text": "Here is where you can also select the folder"}, {"start": 482.0, "text": "where your packaged asset packs are stored for the mock server to send to your game."}, {"start": 487.0, "text": "Now you're ready to build and run!"}, {"start": 489.0, "text": "When you run your project in Xcode 27,"}, {"start": 492.0, "text": "the Background Assets mock server"}, {"start": 493.0, "text": "automatically starts and attaches to your debug session"}, {"start": 497.0, "text": "to serve assets in your game."}, {"start": 499.0, "text": "Sandbox testing is also available to help test the user experience"}, {"start": 502.0, "text": "with products you set up in App Store Connect."}, {"start": 505.0, "text": "When you're ready to submit your game to the App Store"}, {"start": 508.0, "text": "you can add new visuals to your product page header and search results"}, {"start": 511.0, "text": "to make your game stand out."}, {"start": 514.0, "text": "The images and videos you add to your App Store search results"}, {"start": 517.0, "text": "will also appear in the Apple Games app,"}, {"start": 519.0, "text": "providing more ways to visually highlight your game."}, {"start": 522.0, "text": "Check out \"Enhance your presence on the App Store\" from WWDC26"}, {"start": 527.0, "text": "to learn more about configuring these assets."}, {"start": 530.0, "text": "Finally, when your game is published and players purchase new content,"}, {"start": 534.0, "text": "they'll use the redesigned system payment sheet in iOS 27."}, {"start": 538.0, "text": "It works great in landscape mode,"}, {"start": 540.0, "text": "so people can unlock content, and continue gaming."}, {"start": 544.0, "text": "Before we conclude,"}, {"start": 545.0, "text": "let's review the next steps to improve your development workflow"}, {"start": 548.0, "text": "and create an even better gaming experience for players."}, {"start": 552.0, "text": "Further reduce your app size"}, {"start": 554.0, "text": "and efficiently deliver content to your players"}, {"start": 556.0, "text": "by uploading localized versions of your asset packs in App Store Connect."}, {"start": 560.0, "text": "Bring the power of the native Managed Background Assets"}, {"start": 563.0, "text": "and StoreKit APIs to your Unity game by installing new Apple Unity plug-ins."}, {"start": 569.0, "text": "When you finish updating your game,"}, {"start": 571.0, "text": "plan for how you can highlight your features"}, {"start": 572.0, "text": "using new image and video assets in the App Store and Apple Games app."}, {"start": 577.0, "text": "Whether you're starting fresh or building on top of years of work,"}, {"start": 581.0, "text": "these new features will help you reach millions of players worldwide"}, {"start": 584.0, "text": "on Apple platforms."}, {"start": 586.0, "text": "Thank you for joining me, and now, go take your game to the next level!"}]}