大多数浏览器和
Developer App 均支持流媒体播放。
-
StoreKit 和 App 内购买项目的新功能
了解如何利用 App Store 的 App 内购买项目机制,为顾客打造并提供更胜以往的购买体验。我们将演示新的 StoreKit 视图控制风格和新的 API 来帮助你提升订阅自定体验,还将讨论适用于交易级别信息的新栏位,并探索 Xcode 中的全新可测试性功能。此外,我们还将介绍 StoreKit 方面一项重要的弃用相关更新。
章节
- 0:00 - Introduction
- 0:36 - Core API enhancements
- 3:12 - Merchandise using SwiftUI
- 15:35 - Test in Xcode
- 21:06 - Update to StoreKit 2
资源
- Forum: App Store Distribution & Marketing
- In-App Purchase
- Introducing StoreKit 2
- Message
- Original API for In-App Purchase
- Product.SubscriptionInfo.RenewalInfo
- Setting up StoreKit Testing in Xcode
- StoreKit views
- Testing in-app purchases with StoreKit transaction manager in Xcode
- Transaction properties
相关视频
WWDC24
WWDC23
WWDC22
WWDC21
WWDC20
-
下载
大家好 我是 Rudy 欢迎观看 “StoreKit 和 App 内购买项目 的新功能” 很高兴为大家介绍 StoreKit 的新功能 以及我们推出的 Xcode 测试体验增强功能 这些功能旨在帮助你 使用 StoreKit 配置进行测试 首先 我将介绍 新的核心框架功能 然后 我将介绍一些 构建推销 UI 的新方法 我还将介绍如何在 Xcode 中 测试 App 的行为
最后 我将介绍更新 App 后使用 StoreKit 2 有哪些好处 首先 我们来谈谈 我们将针对 顾客交易历史记录推出的更新功能 在过去 交易历史记录 API 包括了自动续期订阅项目、 非续期订阅项目、 非消耗型项目 以及未结束的消耗型项目的交易 这意味着如果有人使用你的 App 购买了消耗型项目 则进行这次购买的已完成交易 无法通过这些 API 进行访问 从 iOS 18 开始 交易历史记录 API 包括 已完成的消耗型项目交易
现在 不必手动跟踪 已结束的消耗型项目 框架能够提供所有消耗型项目的交易 无论其处于完成还是未完成的状态 这是一项新的可选功能 可通过项目的 info.plist 文件 进行配置
要开始接收已结束消耗型项目的交易 请将新的 SKIncludeConsumableInAppPurchaseHistory 键的值设置为 true 然后像平常一样侦听交易
已结束的消耗型项目也可 通过 App Store Server API 访问 此外我们还在 Transaction 和 RenewalInfo 数据模型中 新增一些栏位 用于提供 App 内购买项目 额外的交易级别信息 Transaction 类型中的 第一个新栏位是 currency 顾名思义 它可以指明 购买时使用的币种
这个栏位与新的 price 成员配套使用 后者包含了你在 App Store Connect 中配置的价格
对于 RenewalInfo 模型 我们添加了两个新栏位 用于镜像 Transaction 模型中新增的栏位 第一个新栏位名为 currency 第二个新栏位名为 renewalPrice renewalPrice 表示在续订时 将向顾客收取的金额 请务必注意 renewalPrice 必须在新的 currency 成员 提供的上下文中进行解释 使用 Xcode 16 构建 App 时 你可以访问这些新的交易 API 和续订信息 API 即使 App 在旧版操作系统上运行 也可以使用这些 API 最早支持 iOS 15 如果你的 App 支持运行旧版操作系统 请参考 App 内购买项目文档 了解关于如何访问 这些栏位的指导说明 我们将在今年推出的 最后一项核心 API 更新 是一种新的订阅项目优惠类型 名为“赢回优惠” 赢回优惠旨在帮助你 挽回流失的订阅者 这个新的优惠类型可以 轻松整合到你的 App 中 借助强大的新工具 你可以 从 App Store Connect 中 自定资格条件规则 还可以使用 StoreKit Message API 来推销优惠 而不需要任何额外的代码
还可以在 App Store 上 推广赢回优惠 例如 我们的编辑团队 在编辑面向顾客的个性化推荐时 可能会在“Today”、“游戏” 和“App”标签页上 将你的赢回优惠列入编辑精选 要进一步了解赢回优惠 请观看 WWDC24 讲座 “实现 App Store 优惠” 接下来 我们来了解一些 用于推销 App 内购买项目的新方法 自从我们去年在 WWDC23 推出 StoreKit 以来 开发者们已经在构建 精彩的 App 内购买项目 UI 了 这让我们兴奋不已 我们一直在认真听取大家的反馈 现在 我们为大家提供很棒的新方法 用于自定订阅项目商店视图 要想展示这些炫酷的新功能 最佳方式莫过于 为我们常用的流媒体 App “Destination Video” 构建订阅项目追加销售 由于我将使用 Xcode 预览 来进行推销 UI 的快速迭代 我已经使用产品元数据 设置了一个 StoreKit 配置文件 这是让 App 内购买项目 UI 支持 Xcode 预览的必要步骤 如需详细了解如何在 Xcode 中 设置 StoreKit 配置文件 请观看 WWDC22 中的 “StoreKit 测试的新功能” 以及 WWDC20 中的 “介绍 Xcode 中的 StoreKit 测试” 我要为 Destination Video 构建的订阅项目 可以为顾客提供 两种不同的订阅方式
一种是 Premium 套餐 另一种是价格较低的 Basic 套餐
然后 你可以选择是按月还是按年 续订你的订阅项目 我将展示如何在 Xcode 中 创建订阅项目商店 来推销这些套餐 我已创建名为 DestinationVideoShop 的视图 我会使用它来创建订阅项目商店 第一步是声明 SubscriptionStoreView 并提供订阅项目的组 ID
只需使用这一行代码 我们就能开个好头 但是我想设计一下商店的结构 让不同级别的服务 以清晰可见的方式呈现给顾客 为此 我可以为每个 Premium 和 Basic 服务级别 声明一个订阅选项组 首先 我要在订阅项目商店中 添加一个订阅选项组
使用一个条件来定义订阅选项组 这个条件表示了 其中会包含哪些产品 我想让第一个组表示 这两个 Premium 选项 所以我将条件声明为 包含服务级别为 Premium 的 任意产品
为了让我的订阅项目商店 更加易于使用 我之前创建了一个枚举 名为 StreamingPassLevel 我使用它来为 Premium 和 Basic 服务级别建模 请注意 商店已更新为 仅显示与我声明这个组时 使用的条件相匹配的 Premium 套餐
你还可以为组添加标签 在这个示例中 我将使用 Premium
当我声明第二个组时 事情开始变得很有意思 我添加了一个表示 Basic 选项的组
现在 我已经声明了两个组 订阅项目商店视图 会自动创建标签视图 让我能够查看 Basic 套餐 或 Premium 套餐
这种全新布局让我的订阅选项 变得更加简单易懂
SubscriptionStoreView 还有一项重要功能 是让你能够提供 SwiftUI 视图 来作为自定营销内容 通常 你需要将这个视图 直接提供给 SubscriptionStoreView 但由于我要声明一个分层结构 我会将营销内容直接提供给这些组
请注意 预览更新后可 说明我提供的服务具有什么价值
使用订阅选项组是一种很好的方法 因为我们可以根据活跃的组 来提供不同的营销内容视图 为了演示这项功能 我要添加一个经过修改的视图 来说明 Basic 套餐的价值
现在 当我更换活跃标签时 营销内容会对 Basic 套餐进行说明
声明单个选项组 是一种富有表现力的方法 因为声明看起来和 UI 外观非常相似 对于像这样的情况 你可以通过声明一个订阅选项组集合 来简化实现方式
现在 我只需提供每款产品对应的 StreamingPassLevel 值 而无需提供条件
组集合表示从第一个闭包 返回的每个唯一值所对应的组 这里返回了一个 Premium 组 和一个 Basic 组
这种方法也简化了营销内容声明方式 因为我们只需将 Streaming Pass 级别提供给营销内容视图即可
Streaming Pass+ 为顾客 提供了很大的价值 所以我希望确保 营销内容能够反映这一点
现在 我的营销内容能够 提供大量信息
但会占用很大一部分屏幕空间 要降低店面的高度 我可以使用 subscriptionStoreControlStyle 修饰符并使用新的紧凑型选择器样式
现在 订阅选项选择器 所占用的空间比以前少多了 我们可以通过在底栏中放置控件 让用户更轻松地了解其他套餐选项 默认情况下 底栏中仅显示订阅按钮 由于控件样式非常紧凑 我可以提供 bottomBar 作为 控件样式修饰符的 placement 参数
现在 底栏中会始终显示订阅选项 即使在我滚动浏览营销内容中的 服务权益时 也是如此
以上介绍了如何使用 功能强大的全新订阅选项组 API 及其便捷的 API 订阅选项组集合 大家还看到了全新 紧凑型选择器控件样式 和控件放置 API 但是 我们今年推出的 StoreKit 视图更新不止于此 还有许多更新要向大家介绍 我们这就开始 我刚才展示了如何使用订阅选项组 来声明商店内容的结构 我们构建的商店使用了标签样式 来绘制订阅选项组 这种方法非常适合各个 订阅套餐选项存在显著区别的情况 比如不同的服务级别
标签是可用于呈现 订阅选项组的样式之一 你选择的组样式决定了 StoreKit 呈现这些组的方式 需要在 SubscriptionStoreView 上 使用 subscriptionOptionGroupStyle 修饰符 对它进行设置 可供选择的样式不止这一种 也可以使用链接样式 链接非常适合你想要 在导航容器内 向顾客呈现更多套餐选项的情况 如果没有导航容器 则每当用户轻点导航链接时 商店上方会弹出一个表单 其中显示其他套餐选项 订阅选项组 是一种构建块 用于按照你定义的层次结构 来组织订阅选项 这是一个简单而强大的 API 让你能够在组内 甚至在内联组内创建组
我们还打造了组集合 API 让你能够在一个声明中创建多个组 对于一些最常见的用例 例如按订阅期分组 我们创建了 SubscriptionPeriodGroupSet 等便捷的 API
刚才我展示了 在构建 Destination Video 商店时 可以如何使用放置位置 API
借助这个新的 API 你可以任意选择订阅控件 在订阅项目商店中的放置位置
值得注意的是 并非所有放置方式 都适用于每种控件样式 这是因为一些控件样式的布局 只能兼容特定的放置方式
为了让这个 API 更加简单易用 我们将它设计成能够以静态方式 指示哪些放置方式适用于 给定的控件样式
并且由于每个平台 都有不同的设计模式 从 iOS 18 及其同步发布的版本开始 我们推出了适用于特定平台的 放置方式 为你解锁全新布局 为了便于大家理解 我们来详细了解一下 为 Apple tvOS 18 开发 App 时 使用的控件样式修饰符 在 Apple tvOS 上 按钮样式 是可供使用的 唯一一种标准控件样式
不过 这种控件样式 有几种适用的放置方式 包括自动、左侧、右侧和底部 我们来详细了解一下每种放置方式 首先是左侧放置 Apple tvOS 18 新增的功能包括 可以将订阅项目商店视图水平放置 同时将订阅控件置于 由 placement 值指示的 屏幕边缘 并将营销内容置于 与控件相对一侧的边缘 我在这个示例中使用了左侧放置 但也可以使用右侧放置 来实现新的水平布局 对于使用 Apple tvOS 18 SDK 构建 的 App 右侧放置是新的默认设置 在营销内容更适合 采用紧凑垂直高度的情况下 可以使用底部放置
控件放置 API 可以用于 大家已经非常熟悉的 任何现有控件样式 说到控件样式 我很高兴能够向大家介绍 iOS 18 中新增的三种标准样式 我们来详细了解一下每种标准样式 首先是我刚才展示过的 compactPicker 样式 这是第一个具有水平货架式布局的 选择器类型控件样式 这种样式具有紧凑的尺寸 因此非常适合用来突出显示 不同套餐之间的显著区别 例如 如果多个订阅套餐 具有不同的时限 但都可以解锁同一服务级别
由于紧凑型选择器样式倾向于 将订阅选项一次性全部显示在屏幕上 因此在订阅项目商店仅显示 两个或三个套餐选项的情况下使用 可以收到最佳效果 让顾客不必滚动浏览你的商店
下一个新样式 是 pagedPicker 样式 和紧凑型选择器样式类似 这种样式也采用水平布局 不同之处在于紧凑型选择器 会在一行中显示 2 到 3 个套餐 而分页选择器采用水平分页效果 能够显示套餐的更多详细信息 最后是 pagedProminentPicker 样式 这种样式与分页选择器样式最为相似 但是会为选中的订阅选项 添加醒目的边框和缩放特效
这些新样式非常适合 用来减少垂直空间占用 如果你要推销为数不多的订阅套餐 并且希望在商店中留出一些空间 来放置营销内容等其他重要设计元素 那么这是一种理想的方法
这些控件样式的加入 让可供选择的标准样式数量 从三个增加到六个 订阅项目商店控件样式 是订阅项目商店的基本元素 而这些全新标准样式 与放置 API 和分组 API 搭配使用 让你能够为自己的 App Store App 打造一流的 App 内购买体验 如果你想进一步自定 订阅项目商店的外观 很高兴告诉你 从 iOS 18 开始 你也可以创建自己的自定控件样式
为了帮助你构建自定样式 我们还将提供与 StoreKit 所用原语相同的原语 大家已经很熟悉的标准样式 正是 StoreKit 使用这些原语创建的 我要从头开始构建一个订阅项目商店 向大家展示 编写自己的样式实现有多么简单
我要创建一个采用选择器类型布局的 自定控件样式 为可与家人共享的套餐 添加特别的徽章
创建自定控件样式的第一步是 声明一个遵从 SubscriptionStoreControlStyle 协议的类型 这个协议只有一个 必需的方法:makeBody
传递给 makeBody 函数的配置值 包含了创建自定控件所需的全部信息 这个配置值可与新的 SubscriptionPicker API 搭配使用
订阅选择器应该有两个闭包 第一个闭包会返回用于表示 提供的每个订阅选项的视图 我要根据这个规格 从头创建一个自定 SwiftUI 视图
首先添加 VStack 和选择器选项的显示名称
我要使用之前创建的 helper 方法 添加这个选项的本地化价格显示
然后 我要检查这个选择器选项 是否启用了家人共享功能 如果已启用家人共享功能 我就会 添加家人共享徽章
接下来 我要添加 订阅选项的本地化描述
为了指示哪个选项已被选中 我要用 HStack 包装这个视图 并添加选择指示器 将选择器选项被选中的状态 传递给它
第二个闭包 需要提供一个视图 让顾客能够 订阅所选的套餐 从语义上讲 这个视图是一个按钮 当用户与它交互时 就会触发所选选项的购买 和第一个闭包类似 你可以构建自己的订阅按钮 也可以使用 新的 SubscribeButton API 并将提供给闭包的选项参数 传递给这个 API
要使用新的自定控件样式 只需使用控件样式修饰符 来修改订阅项目商店视图 然后通过自定控件样式类型的 实例进行传递 将自己的控件样式实现与 SubscriptionStoreView 一起使用 就是这么简单 自定义控件样式 提供了一种便捷的方式来利用 StoreKit 的强大基础架构 例如 App Store 数据流 与此同时 你可以充分发挥创意 来设计订阅项目商店 推销 App 内购买项目的方式 我展示了 SubscriptionStoreView 的一些新功能 接下来 我要介绍一些 Xcode 测试体验增强功能 这些增强功能可以进一步简化 App Store App 测试 Xcode 中的 StoreKit 测试 是从开始构建时就能 确保最佳 App 内购买体验的 最佳方式
借助 Xcode 中的 StoreKit 测试 你可以将 App Store Connect 中的产品配置推迟到 你已确保 App 能按预期运行时 从而全神贯注 开发让你的 App 与众不同的关键功能 今年 我们增加了多种 在 Xcode 内测试 App 的方式 我们来了解一下 首先是 StoreKit 配置方面的更新 作为 Xcode 16 的一项新功能 你可以在本地测试 App 的 隐私政策和许可协议 这项新设置位于 StoreKit 配置文件编辑器中 新的 App Policies 部分下 点按这个选项 可以打开 App 的 许可协议和隐私政策编辑器 当用户轻点 服务条款和隐私政策按钮来查看条款时 在这些栏位中输入的值 会显示在 App 的 SubscriptionStoreView 中
Xcode 16 还有一项新功能 是测试订阅组显示名称的 本地化版本 在 StoreKit 配置编辑器中 导航到某个订阅组 即可找到这项设置 你会注意到包含在组中的 订阅套餐的下方 有一个新增的 Localizations 部分 点按这个部分底部边缘的加号按钮 可打开一个编辑器 你可以在其中 添加本地化的组显示名称
我们还将针对赢回优惠 添加一项新的配置设置 在测试配置中添加赢回优惠的方法 与你已经非常熟悉的 其他订阅优惠类型非常相似 要了解如何在 StoreKit 配置中 添加赢回优惠 请观看 WWDC24 讲座 “实现 App Store 优惠”
我们将会添加的下一项功能 是支持对测试配置中的 App 内购买项目图像进行测试 这项新设置位于产品编辑器中 新增的“Image”部分下方 由于在 StoreKit 配置中提供的图像 仅用于本地测试目的 因此可以随意添加任何图像 当然 要测试图像在 App 中的 视觉效果 最简单的方法 是使用 ProductView 或 StoreView 并将 prefersPromotionalIcon 标记设置为 true
要进一步了解 ProductView 请观看 WWDC23 中的“认识 StoreKit 与 SwiftUI” 还有一项 StoreKit 配置文件更新 是新增了 Dialogs 部分
通过这项设置 你可以选择 要启用还是停用 与 App 内购买相关的系统对话框
默认情况下 系统对话框 始终处于启用状态 如果停用系统对话框 则每当系统显示对话框时 例如在进行 App 内购买期间 都会自动选择默认选项 如果你要进行 UI 自动化测试 或手动测试 并且你感兴趣的测试内容 只有 App 的 App 内购买 逻辑的默认流程 那么这项功能尤其实用 接下来 我要介绍 我们将为 Xcode 中的交易管理器 带来的更新功能 交易管理器 对于 App 内购买项目的 测试和调试至关重要 在交易管理器中 你可以 完成多种操作 比如检查交易 模拟从 Xcode 安装的各种 App 中 各种不同的购买项目 以及使用 Xcode 中的 StoreKit Xcode 测试 而且这项功能适用于 各种设备和模拟器 我要前往 Xcode 以便向大家展示 交易管理器即将推出的更新 我有一个模拟器 在运行 Destination Video 我要使用这个模拟器 来演示这些新功能 从 Xcode 15.2 开始 你可以直接从 Xcode 将购买意图发送至 App
当用户从 App 外部发起购买时 例如购买 App Store 中 推广的产品 App 就会收到购买意图
然后购买数据会发送至 App 你可以使用这些数据来完成购买
对 App 收到购买意图后的行为 进行测试至关重要 现在 无需通过 App Store 即可轻松完成这类测试 如果你想进一步了解 推广的 App 内购买项目 以及如何在 App 中实现购买意图 请观看 WWDC 23 中的 “StoreKit 2 的新增功能 和 Xcode 中的 StoreKit 测试” 我已在 Destination Video App 中 添加了用于侦听购买意图的代码 接下来我来展示一下如何进行测试 要将购买意图发送至 App 首先要在交易管理器窗口中 点按筛选栏左侧的加号指示器 在 App 的已配置产品列表下方 你会发现有一个新增控件 用于在常规购买和购买意图之间 做出决定
选择要针对其发送购买意图的产品 将购买类型设置为 Purchase Intent 然后点按 Done 即可 将购买意图发送至测试设备 为了处理收到的购买意图 我已经使用 SwiftUI 构建了一些自定 UI 如果你选择处理收到的购买意图 也可以制作自己的产品推销 UI 如果你什么都不做 则付款单 会在 App 启动后自动显示 让顾客能够完成购买流程 以上介绍了如何在 Xcode 中 测试购买意图 从 iOS 18 开始 还有一项新功能 你现在可以直接在 App 内 测试账单问题信息 如果订阅项目由于账单问题 而无法续订 App 就会收到账单问题信息 在这种情况下 StoreKit 会通过一个表单 来提示顾客解决问题 在 Xcode 中 你可以 使用交易管理器来测试这项功能 如果设备运行的是 iOS 18 你也会在 App 内获得一个表单 可以在这个表单中 选择取消订阅或解决问题 要测试账单问题 请启用 StoreKit 配置的 配置设置中的账单重试选项
进行测试时 如果订阅项目尝试续订 你会在交易旁边看到这个徽章 指示现已进入账单重试
我的模拟器已经收到了信息 并且已通过表单提示我解决这个问题 我要轻点 Resolve 这样就可以解决账单问题 并显示要续订的订阅项目
以上介绍了如何在 Xcode 中 测试账单问题信息 如果你的 App 仍使用 App 内购买项目的原始 API 那么我要介绍一项重要更新 从 iOS 18 以及 同步发布的操作系统版本开始 App 内购买项目的原始 API 已被弃用 统一收据也包括在内 现有 App 仍可以继续正常运行 但旧版 API 无法获得 未来操作系统版本推出的 任何增强功能或新功能 为了提供最佳 App 内购买体验 我们强烈建议将现有 App 更新为使用 StoreKit 2 StoreKit 2 在原始 StoreKit API 的基础上提供了许多改进 例如顾客交易历史记录 和订阅项目续订信息 现在随时可供你的 App 使用 而且这个框架会自动 为你执行加密验证 StoreKit 2 还使用了 Swift async/await 等 现代语言模式 来执行获取产品元数据、进行购买 以及检索顾客交易历史记录等任务
最后 得益于 Swift 中的 @backDeployed 属性 StoreKit 2 让你能够使用 新的 App Store 功能 即使 App 安装在装有旧版 操作系统的设备上 也是如此 不仅如此 StoreKit 2 提供了一整套工具 来简化 App 内购买的处理方式 要进一步了解现在 可供你的 App 使用的 API 请查看 Apple Developer 网站 上的 StoreKit 文档 以上就是我今天要介绍的全部内容 接下来 我们快速回顾一下 通过使用 StoreKit 2 开始为顾客提供 最佳 App 内购买体验 就像我展示的一样 借助订阅项目商店视图 即将推出的各种新功能 你可以轻松推销 App 内购买项目 当你准备好测试 App 内购买流程时 不妨试试 Xcode 中的 StoreKit 测试 有关以上功能以及其他 StoreKit 功能的更多信息 请观看我们之前的讲座 “了解 StoreKit 2”“StoreKit 测试的新功能” 以及“认识 StoreKit 与 SwiftUI” 我非常期待看到 大家使用 StoreKit 构建的成果 感谢大家的参与!
-
-
4:26 - Destination Video Shop
import StoreKit import SwiftUI struct DestinationVideoShop: View { var body: some View { SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { streamingPassLevel in StreamingPassMarketingContent(level: streamingPassLevel) StreamingPassFeatures(level: streamingPassLevel) } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) } }
-
9:06 - Subscription Option Groups - Tabs style
SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) .subscriptionStoreOptionGroupStyle(.tabs)
-
9:20 - Subscription Option Groups - Links style
SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionOptionGroupSet { product in StreamingPassLevel(product) } label: { streamingPassLevel in Text(streamingPassLevel.localizedTitle) } marketingContent: { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(.compactPicker, placement: .bottomBar) .subscriptionStoreOptionGroupStyle(.links)
-
13:41 - Custom control style implementation
import StoreKit import SwiftUI struct BadgedPickerControlStyle: SubscriptionStoreControlStyle { func makeBody(configuration: Configuration) -> some View { SubscriptionPicker(configuration) { pickerOption in HStack(alignment: .top) { VStack(alignment: .leading) { Text(pickerOption.displayName) .font(title2.bold()) Text(priceDisplay(for: pickerOption)) if pickerOption.isFamilyShareable { FamilyShareableBadge() } Text(pickerOption.description) } Spacer() SelectionIndicator(pickerOption.isSelected) } } confirmation: { option in SubscribeButton(option) } } } struct DestinationVideoShop: View { var body: some View { SubscriptionStoreView(groupID: Self.subscriptionGroupID) { SubscriptionPeriodGroupSet { _ in StreamingPassMarketingContent() } } .subscriptionStoreControlStyle(BadgedPickerControlStyle()) } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。