{ "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json", "schemaVersion": 1, "id": "wwdc2026-378", "event": "wwdc2026", "eventName": "WWDC26", "year": 2026, "eventContentId": 378, "title": "Unlock in-game content with StoreKit and Background Assets", "description": "Unlock native Apple In-App Purchases for your Unity game with the new StoreKit plug-in. Reduce download sizes with the new Background Assets plug-in, which delivers language-specific asset packs so each player gets just what they need. Plus, a new Steam Asset Converter helps you migrate existing builds.", "url": "https://developer.apple.com/videos/play/wwdc2026/378", "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/378", "type": "Video", "publishedAt": "2026-06-08T14:00:00-07:00", "platforms": [ "iOS", "iPadOS", "macOS", "tvOS", "visionOS", "watchOS" ], "keywords": [], "topics": [ "App Services", "App Store, Distribution & Marketing" ], "primaryTopic": "App Store, Distribution & Marketing", "duration": 599, "hasTranscript": true, "transcriptWordCount": 1506, "availableLanguages": [ "eng", "fra", "jpn", "kor", "por", "spa", "zho" ], "media": { "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/cmaf.m3u8", "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/cmaf-download.m3u8", "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/downloads/wwdc2026-378_sd.mp4", "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/378/6/16c93f95-21e8-4f7f-bb96-2b3c682fa6c7/downloads/wwdc2026-378_hd.mp4", "duration": 599 }, "codeSnippets": [ { "title": "Asset pack manifest for a localized asset pack", "language": "json", "startTimeSeconds": 186, "code": "// Asset pack manifest\n\n{\n \"assetPackID\": \"voice-english\",\n \"downloadPolicy\": { /* … */ },\n \"language\": \"en-US\",\n \"sourceRoot\": \".\",\n \"fileSelectors\": [ /* … */ ],\n \"platforms\": [ /* … */ ]\n //… \n}" }, { "title": "Convert a Steam depot to an asset pack manifest", "language": "bash", "startTimeSeconds": 207, "code": "# Convert a Steam depot to an asset pack manifest\nxcrun ba-package convert --asset-pack-id voice-english -l en-US --on-demand voice-english.vdf -o voice-english.json" }, { "title": "Convert an asset pack manifest to an asset pack archive", "language": "bash", "startTimeSeconds": 208, "code": "# Convert an asset pack manifest to an asset pack archive\nxcrun ba-package voice-english.json -o voice-english.aar" }, { "title": "Fetch and purchase products with the StoreKit plug-in", "language": "csharp", "startTimeSeconds": 352, "code": "// Fetch and purchase products with the StoreKit plug-in\n\nusing UnityEngine;\nusing Apple.StoreKit;\n\nasync void Start() {\n var products = await Product.FetchProducts(new[] {\n \"com.thecoast.capecod\"\n });\n}" }, { "title": "Fetch and purchase products with the StoreKit plug-in", "language": "csharp", "startTimeSeconds": 361, "code": "// Fetch and purchase products with the StoreKit plug-in\n\nusing UnityEngine;\nusing Apple.StoreKit;\n\nasync void Purchase(Product product) {\n var result = await product.Purchase();\n if (result.Result == PurchaseResult.ResultEnum.Success\n && result.TransactionVerification.IsVerified)\n {\n // Unlock access to purchased content\n\n result.TransactionVerification.SafePayload.Finish();\n }\n}" }, { "title": "Listen for Transaction updates with the StoreKit plug-in", "language": "csharp", "startTimeSeconds": 383, "code": "// Listen for Transaction updates with the StoreKit plug-in\n\nusing UnityEngine;\nusing Apple.StoreKit;\n\npublic static class TransactionListener {\n public static void Initialize() => Transaction.Updates += OnUpdate;\n\n\n async void OnUpdate(VerificationResult result) {\n if (!result.IsVerified) return;\n var verifiedTransaction = result.SafePayload;\n\n // Consumables are not in CurrentEntitlements, so handle them inline\n if (verifiedTransaction.ProductType == ProductType.ProductTypeEnum.Consumable) {\n if (verifiedTransaction.RevocationDate != null) {\n // Revoke the consumable identified by verifiedTransaction.ProductId\n } else {\n // Grant access to the consumable\n }\n }else {\n // Non-consumables and subscriptions: re-read CurrentEntitlements as source of truth\n await foreach (var verificationResult in Transaction.GetCurrentEntitlements()) {\n if (!verificationResult.IsVerified) continue;\n // Grant access to the product\n }\n }\n verifiedTransaction.Finish();\n }\n}" }, { "title": "Download asset packs with the Background Assets plug-in", "language": "csharp", "startTimeSeconds": 433, "code": "// Download asset packs with the Background Assets plug-in\n\nusing Apple.BackgroundAssets;\nusing UnityEngine;\n\nasync void LoadTutorial(string language) {\n try {\n string assetPackId = $\"tutorial-{language}\";\n AssetPackManifest manifest = await AssetPackManager.GetManifestAsync();\n AssetPack assetPack = manifest.GetAssetPack(assetPackId);\n CancellationTokenSource tokenSource = new CancellationTokenSource();\n _ = Task.Run(async () => {\n await foreach (AssetPackManager.DownloadStatusUpdate statusUpdate in AssetPackManager.DownloadStatusUpdatesAsync(assetPackId)) { \n \t\t// Update download progress in UI\n }\n }, tokenSource.Token);\n await AssetPackManager.EnsureLocalAvailabilityOfAssetPackAsync(assetPack);\n tokenSource.Cancel();\n // Start tutorial with the locally available assets\n } catch (Exception exception) {\n // Handle the exception\n }\n}" } ], "resources": [ { "title": "Apple Unity Plug-Ins on GitHub", "url": "https://github.com/apple/unityplugins", "type": "download", "description": null }, { "title": "Background Assets", "url": "https://developer.apple.com/documentation/BackgroundAssets", "type": "documentation", "description": "Improve or eliminate the time people wait while your app downloads assets.", "sosumiURL": "https://sosumi.ai/documentation/BackgroundAssets", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/BackgroundAssets.json" }, { "title": "StoreKit", "url": "https://developer.apple.com/documentation/StoreKit", "type": "documentation", "description": "Support In-App Purchases and interactions with the App Store.", "sosumiURL": "https://sosumi.ai/documentation/StoreKit", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/StoreKit.json" } ], "path": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/", "files": { "metadata": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/metadata.json", "readme": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/README.md", "transcript": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/transcript.md", "transcriptJSON": "sessions/wwdc2026/378-unlock-in-game-content-with-storekit-and-background-assets/transcript.json" } }