大多数浏览器和
Developer App 均支持流媒体播放。
-
轻 App 的新功能
探索轻 App 的最新更新:了解我们如何通过改进尺寸限制以及 CloudKit 和钥匙串的使用,帮助您比从前更轻松地构建轻 App。我们还将介绍如何利用验证工具来验证您的轻 App,并使用 App Store Connect 来自动化您的优质轻 App 体验工作流程。
资源
相关视频
WWDC21
WWDC20
-
下载
♪ ♪ Charles Ying: 大家好 我是 Charles Ying 欢迎来到 What's new in App Clips App clip 是 App 的一小部分 它是一种轻量级的、快速的 且易于发现的 App 您需要的时候可以快速取用 可在信息 App 地图 App 聚焦 Safari 或外部二维码和 App Clip 编码 来访问 Toast 是其中一个 很好的例子 Toast 的 App clip 让您可以 通过扫描二维码支付点餐费用 Toast 的 App Clip 可通过 印制于收据上的 二维码来打开 使用 App Clip 用户可 快速结账 从而会让用户选择安装 完整的 App 在当前流中搭建 App Clip 是简化体验的 一个绝佳方法 通过今天介绍的新功能 您的用户将能用 App clip 完成更多操作 且开发 App clips 也会变得前所未有的简单 我们先看下 App clip 的 大小限制 App Clips 是轻应用及快应用 就是为速度而生的 小才能保证 App clips 的即时性 而现在的无线网络已经比 两年前更快了 我很高兴地宣布 在 iOS 16中 App clips 现在可以达到 15 MB 的尺寸 为您提供了更多空间 搭建更理想的体验 将您 App clip 的最低版本 设置到 iOS 16 的新限值 或保持在 10 MB 以内 以兼容 iOS 15 及更早版本 不管怎样 您都可以在 App clip 启动后 下载额外资源 速度还是打造良好体验的关键 您的用户不一定总能在 网速快的环境 因此 App clip 优化的重要性 丝毫不亚于以往 您可查看“Build light and fast app clips” 以了解更多关于优化 app clip 的信息 接下来 我将为您演示一个 简单的新工具 能确保您 App clip 体验 或 universal link 得以正确设置 以下是运行方法 在您的 iPhone 或 iPad 中 转到开发者设置 在 App Clips Testing 下 选择 Diagnostics 现在输入您的 URL 您可以将您的设备与 Xcode 相连 打开开发者模式 iOS 会检查您的 URL 配置 如果配置正确 您将能看到 这些绿色的复选框
但是 如果出错了 您将会看到这样的屏幕 告诉您错误的原因是什么 这可以帮助您解决问题 如 Safari 不显示标题栏 或导航到网页 而不是您的 App clip 每个诊断都可链接到一个 解释进一步配置步骤的文档 现在您可以看到具体 是哪里出错了
App Clip 诊断可检查使用 物理代码 Safari 和 iMessage 的 App clip 体验 也可检查与域配置 相关的 Universal Link 这个简单的新工具可帮助您 轻而易举就实现正确配置
接下来是 CloudKit
CloudKit 这一框架让您的 App 可访问存储在 iCloud 的数据 直至现在 CloudKit 仍不可 在 App clips 中使用 您的 App clip 可能使用服务器 来读取数据或资源
而 iOS 16 全新推出的 App clips 可读取存储在 CloudKit 公用数据库的 数据和资源 您现在可以通过 CloudKit 提供的驱动和比例 在您的 App 和 App clip 中 共享同样的代码 访问同样的数据 App 和 app clips 之间 一个重要的区别在于 App clip 可以从公用数据库中读取 但无法将数据写入 CloudKit App clips 也不能使用云文档 及键值存储 如与用户承诺的那样 当 App clip 没有使用时 iOS 将会删除 App clip 及其数据
在 Xcode 中启用 您 App clip 的 CloudKit 打开您 App clip 目标的 Signing and Capabilities 选项卡 选择您想让您的 App clip 使用的 CloudKit 容器 这一 CloudKit 容器可以是 全新的 也可以是与您完整 App 共享的 这是从您 App clip 中 读取 CloudKit 公用数据的例子 用容器的标识符 创建一个 CKContainer 并访问 publicCloudDatabase 属性 然后提取您想从公用数据库中 获取的记录
接下来是密钥串迁移 今天 您想将敏感信息 从 App clip 转移到 您的完整 App 中 如验证令牌和付款信息 您的 App clip 将在共享 app 组容器中存储数据 用户将 App clip 升级到 完整 App 时 iOS 保存该数据
您的完整 App 读取 App 组容器 将信息存储至密钥串中
然而 密钥串是安全存储 这类信息的理想位置 今年全新推出的功能 当用户安装您的 App 时 存储在您 App clip 密钥串中的项目 从您的 App clip 转移到 App 中 现在您的 App clip 只需 存储密钥串中的安全项目 并在安全时转移到您的 App 中 共享密钥串组和 iCloud 密钥串 都不支持 正如与用户承诺的那样 App clip 不使用时 不会保留密钥串信息
这是如何存储和读取 密钥串中登陆信息的示例 App 和 App clip 的代码 是一样的 您可以用 SecItemAdd 添加新项目到密钥串 并用 SecItemCopyMatching 从密钥串中提取这些项目 为您的项目添加标签 从而帮助您的完整 App 识别您的 App clip 保存的项目
最后是 App Clip Experiences API 随着您 App clip 的增加 您会有更多高级的 App clip 体验 每个都有自己的信息或定位 你需要一个简单的方法 来添加和更新这些体验 App Store Connect 有一个 App Clip Experiences 网页 API 可用于自动化工作流 我们来看看使用 该 API 来添加 高级 App clip 体验的例子 首先 获取 App clip 资源 ID 接下来 上传您的 header 图像 最后 创建高级 App clip 体验 首先 我们找到 App clip 的 资源 ID 用您 App 的项目 ID 和 App clip 捆绑 ID 来调用网页 API 根据响应 保存 App clip 资源 ID 供后续使用 接下来 为高级 App clip 体验 上传 header 图像 保存 header 图像的资源 ID 供下一步使用 最后 通过您 App clip 资源 ID 和您的 header 图像 ID 我们现在可以创建您的 高级 App clip 体验了 有三个字典要填写 attributes, relationships, 和 included
在 attributes 字典中 增加如动作名称的信息 哪一类别 语言 和高级 App clip 体验的链接 如果你的高级体验与地图 App 位置绑定 增加位置字典 在 place 字典中 增加匹配的 地图营业场所名称 地图动作 地图坐标 在 relationships 字典中 添加 App clip 的资源 ID 和 header 图像 ID 在列入字典中 为高级 App clip 体验 增加本地化标题和子标题 好了 使用这种 App Store Connect API 您可以全自动创建 高级 App clip 体验 您可以查看 WWDC 2020 中的 Automating App Store Connect 以及 What's new in App Store Connect 以了解更多关于 App Store Connect 的信息 总的来说 新的 App clip 尺寸限制 为您提供了更多空间 以搭建理想体验 App Clip 诊断工具是端到端理解 您的 App clip 和 universal link 配置的强大工具 CloudKit 和密钥串通过 与 App 共享更多代码 来简化开发流程 App Clip experiences API 通过 管理您的高级 App Clip 体验 自动化工作流 您可查看 WWDC 2021 中的 What's new in App Clips 以及 WWDC 2020 中的 Design great App Clips 以查看更多 关于开发 App Clips 的信息 各位开发者们设计了 这么强大的 App clips 它们都太有创意了 我们希望这些新功能能帮助您 搭建下一个强大的 App clip 感谢大家的观看
-
-
4:41 - Read your CloudKit public database from your App Clip
// Read your CloudKit public database from your App Clip let container = CKContainer.default() let publicDatabase = container.publicCloudDatabase let record = try await publicDatabase.record(for: CKRecord.ID(recordName: "A928D582-9BB6-E9C5-7881-E4EAF615E0CD")) if let title = record["Title"] as? String, let description = record["Description"] as? String { print(“Fetched a food item from CloudKit: \(title) \(description)") }
-
6:03 - Read and Write from your App Clip's keychain
// Write authentication token to App Clip keychain let addSecretsQuery: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecValueData as String: "smoothie-secret".data(using: .utf8), kSecAttrLabel as String: "foodsample-appclip" ] SecItemAdd(addSecretsQuery as CFDictionary, nil) // Read authentication token from app or App Clip var readSecretsQuery: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecReturnAttributes as String: true, kSecAttrLabel as String: "foodsample-appclip", kSecReturnData as String: true ] var secretsCopy: AnyObject? SecItemCopyMatching(readSecretsQuery as CFDictionary, &secretsCopy)
-
7:10 - Get your App Clip resource ID
# Get the App Clip resource ID GET /v1/apps/1234567890/appClips?filter[bundleId]=com.example.foodsample.Clip # Response { "data": { "attributes": { "bundleId": "com.example.foodsample.Clip" }, "id": "726ad1bb-3e1b-40eb-a986-d8a9897e4f1e" } }
-
7:25 - Upload a header image for the advanced App Clip experience
# Upload a header image for the advanced App Clip experience POST /v1/appClipAdvancedExperienceImages { "data": { "type": "appClipAdvancedExperienceImages", "attributes": { "fileName": "Hero_image_US.png", "fileSize": 43500 } } } # Response { "data": { "attributes": "..." "id": "91c52741-832b-48a2-8935-1797655edbe7" } }
-
7:34 - Create the advanced App Clip experience
# Create advanced App Clip experience POST /v1/appClipAdvancedExperiences { "data": { "type": "appClipAdvancedExperiences", "attributes": { "action": “OPEN", "businessCategory": "FOOD_AND_DRINK", "defaultLanguage": "EN", "isPoweredBy": true, "link": "https://fruta.example.com/restauraunt/simply_salad", "place": { "names": [ "Caffe Macs" ], "mapAction": "RESTAURANT_ORDER_FOOD", "displayPoint": { "coordinates": { "latitude": 37.33611, "longitude": -122.00731 }, "source": "CALCULATED" } } }, "relationships": { "appClip": { "data": { "type": "appClip", "id": "726ad1bb-3e1b-40eb-a986-d8a9897e4f1e" } }, "headerImage": { "data": { "type": "appClipAdvancedExperienceImages", "id": "91c52741-832b-48a2-8935-1797655edbe7" } } }, "included": { "type": "appClipAdvancedExperienceLocalizations", "attributes": { "language": "EN", "subtitle": "Fresh salad every day", "title": "Simply Salad" } } } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。