
-
了解面向空间商务 App 的增强功能
在去年发布的访问和企业级功能基础上,visionOS 26 中最新的增强功能和 API 实现了进一步扩展,快来一探究竟吧!了解这些全新功能如何助你轻松构建模型训练工作流程、增强视频影像,并在本地网络上统一坐标系,从而为企业内部 App 打造协作体验。
章节
资源
- Building spatial experiences for business apps with enterprise APIs for visionOS
- Implementing object tracking in your visionOS app
相关视频
WWDC25
WWDC24
-
搜索此视频…
大家好 我叫 Alex Powers 是 visionOS Enterprise 团队的工程师 很高兴能再次参加 WWDC
去年 我们推出了首批 适用于 visionOS 的企业 API 从那时起 我们一直努力工作 为大家带来更多 企业级功能
在探索新功能之前 我先回顾一下 企业 API 的基本要求
由于它们提供了广泛的实用功能 和更深层次的设备访问权限 访问它们需要 管理式授权 以及与开发者账户 关联的许可文件 这些 API 适用于 由组织为员工 开发的专有内部 App 或者开发者为其他企业构建并 在内部分发的自定 App
基于这些考量 我很高兴为大家 介绍全新的企业 API 以及对现有 API 的 一些重大改进
首先 我将介绍 能够简化开发流程、 让企业级功能 更易使用的变更 接下来 我将展示一种 提升用户体验的方法 通过提供与窗口 交互的新方式 与附近人员共享内容 并保护敏感信息 最后 我将探索 环境可视化方面的新功能
首先 我想介绍一些 让企业级功能更易访问、 开发流程更顺畅的方法
从更广泛的 API 访问开始 今年我们做出了一些调整 让开发者能更广泛地访问 去年推出的多个 API
我们之前推出了 使 App 通过 Apple Vision Pro 开发专用带访问 USB 视频类设备 外部视频的功能 这个 API 支持 App 利用 兼容 UVC 的网络摄像头 来增强视频会议体验 使用专用成像设备 进行远程诊断 或通过工业检测摄像头 实现质量控制
我们还开放了 对神经网络引擎的访问 支持先进的 设备端机器学习 我很高兴地宣布 在最新版 visionOS 中 这些 API 现在可供 所有开发者使用 无需企业许可或授权 即可访问 UVC 视频 和神经网络引擎
去年我们为 visionOS 推出了对象跟踪功能 使 App 能够识别 和跟踪现实对象 带来强大的体验 今年 我们将增加直接 从命令行训练的功能
这意味着现在可以 自动执行模型训练过程 将它集成到现有的管道中 更高效地管理 对象跟踪资源 所有这些都无需 为每个对象手动 使用 CreateML App 这个工具提供与 CreateML App 相同的所有控制功能 希望这能解锁新的工作流程 让对象跟踪功能的迭代 更快、更具可扩展性
我们还简化了 企业许可管理
现在可以直接 在 Apple 开发者账户中 访问许可文件 许可续订会自动 以无线方式推送到 App 并且我们创建了 Vision Entitlement Services 框架 借助这个框架 可轻松检查应用程序 是否已获得适当许可 并获批使用特定功能 使用 Vision Entitlement Services 可以确定 App 是否能 访问特定的企业 API、 比如主摄像头访问权限 查看许可状态 及它的到期日期 对于使用“提升 性能余量”授权的 App 可以在执行密集型任务 之前验证这个授权 以确保最佳性能
举个例子 我来展示一下 如何确定 App 是否配置正确 来访问主摄像头
首先导入这个框架 然后使用共享的 Enterprise License Details 单例 先确认许可有效 再确认许可已批准 mainCameraAccess
这就是最新 visionOS 如何扩展 API 访问 让模型开发和 企业 App 管理更轻松
现在 我来介绍一些通过 构建更直观、协作性更强 且更安全的空间应用程序 来提升用户体验的新方法 首先 我们推出了 一种使空间环境中 窗口交互更自然的方式 尤其是在佩戴 Apple Vision Pro 移动时
我们称之为“窗口跟随模式”
启用后 可确保 内容始终可访问 并与你的位置 保持相对关系 要启用这个行为 需要 window-body-follow 授权 这个授权作为许可授权 进行申请和管理 在授权被授予 并包含在 App 中后 设备上所有应用程序的 任何窗口都将启用这个行为
visionOS 中的标准窗口 会固定在空间中的放置位置 但试想一下 你有一个仪表盘 一组说明或参考资料 在执行需要移动的任务时 需要频繁查看
“窗口跟随模式” 允许选择一个窗口 使它随你移动而移动
我们来看看 “窗口跟随模式”的实际效果
我正在工作台 专注于一个项目 与此同时 我的操纵器在执行任务 我想监控操纵器状态 又不想频繁中断主要任务 为状态窗口启用 “窗口跟随模式”时 只需点按并按住窗口关闭控件 我选择了“开始跟随模式”
这就好了 状态窗口会 随我返回工作区
这就是“窗口跟随模式” 提升用户体验的 一个好方法 但空间计算的真正价值在于 实现共享协作体验 而这正是共享 坐标空间的设计初衷 这项功能让身处 同一物理空间的用户 能共享空间体验
每个人可以自然地 交互和讨论 App 内容 就像它们真实存在一样 我们通过同播共享提供高级 API 自动处理共享 坐标空间的发现、连接 和会话管理
我们有一整场 关于这个主题的讲座 “与附近的人 共享 visionOS 体验”
虽然同播共享 开箱即用非常方便 但我们知道有些场景 需要更多控制 你可能需要与自己的 自定网络基础设施集成 或者你的企业需求 可能意味着你必须 直接处理设备通信
针对这些用例 我们推出了新的 ARKit API 专门为企业客户建立 共享坐标空间 它称为 SharedCoordinateSpaceProvider 这个 API 允许多个参与者 对齐他们的坐标系 这通过在选定的本地网络传输中 交换 ARKit 生成的 特定数据来实现 每个参与者都会持续 与其他参与者共享这些数据 这种持续共享会创建 一个通用坐标系 使共享世界锚点能在 所有人的视图中一致显示
接下来我将演示 如何使用这个 API 构建自定共享体验
使用 SharedCoordinateSpaceProvider 对于熟悉 ARKit 数据提供程序的 开发者来说非常简单
与现实场景跟踪 或手部追踪类似 实例化后即可在 活跃的 ARKitSession 上运行 运行后 SharedCoordinateSpaceProvider 会生成必要的对齐信息 封装在 CoordinateSpaceData 对象中 你可以使用基于拉取的 API 来检索这些数据 即提供程序的 nextCoordinateSpaceData() 函数 我的应用程序负责 将这个 CoordinateSpaceData 传输给其他参与者 以建立共享坐标空间 这赋予你完全控制权 你可以使用 所需的任何网络层
相反 当 App 通过网络 从其他参与者接收 CoordinateSpaceData 时 你需要通过调用 push() 方法 将数据提供给本地 SharedCoordinateSpaceProvider 每条传入数据都标记有 发送方唯一的 participantID 最后 这个提供程序会帮助 管理会话生命周期 它提供了一个 eventUpdates 异步序列来通知重要变更 例如当参与者 离开共享空间时
让我通过一个代码示例 来演示这项功能的运作方式
首先创建一个 SharedCoordinateSpaceProvider 并在 ARKitSession 上运行 当从网络上的 其他参与者接收数据时 我使用 push 数据更新 本地提供程序的认识 为了获取设备需要共享的数据 我调用了 nextCoordinateSpaceData() 函数 这会获取表示本地状态的 CoordinateSpaceData 对象 准备通过网络进行广播
最后 这个逻辑构成了 自定共享空间管理的核心 将网络层与 ARKit 的 坐标对齐功能连接起来
这就是面向企业开发者的 ARKit Shared Coordinate API 为内部 App 添加 协作功能的绝佳方式 我要介绍的最后一项用户体验 增强功能完全关乎数据隐私与安全 许多企业 App 会处理 敏感信息、财务数据、 患者记录、专有设计 或机密通信 尽管同播共享、屏幕捕获和录制 甚至屏幕镜像 等功能非常实用 但可能会无意中 泄露这些敏感数据 因此今天推出了新的 API 让你能够控制 哪些内容可以被捕获 并与他人共享
这就是 SwiftUI 的新增视图修饰符 contentCaptureProtected 这项功能在拥有受保护 内容授权的 App 中受支持 只需将它添加到 任何用户界面元素 甚至整个 RealityKit 场景 当内容被标记为受保护时 系统会在任何截屏、录制、 镜像或共享视图中 自动模糊处理内容 但佩戴设备的用户 仍可清晰看到内容 下面是一个常见的 企业用例示例
我有一个 App 用作 公司文档中央存储库 所有员工均可访问 然而 系统内的某些文档 包含敏感信息 不应广泛分享 我正在与另一个办公室的 团队共享这些文档 在这里 团队可以查看 会议记录和明年的计划 这两份文档我都能看到 并且已共享给团队 这里可以看到 季度报告旁 有一个锁定图标
这份报告不应被共享 因此团队无法在 远程显示器上查看
现在你已经了解了 受保护内容的实际效果 下面我们来看看如何实现它 这个示例中有一个文档视图 其中包含一个子视图 我将它称为 SensitiveDataView 它包含只能在 Vision Pro 上查看的信息 只需附加 contentCaptureProtected 视图修饰符即可完成保护 现在 每当有人 试图共享传输的内容时 系统会自动模糊 处理这个内容 你还可以将这个内容 保护功能与认证流程集成 例如视控 ID 或公司单点登录
以上就是保护 App 2D 和 3D 内容的方法 它可以使用相同的 简单修饰符即可实现保护
这些功能增强了 数字空间内的体验 现在 我将重点介绍一些 旨在帮助实现环境可视化的功能 并在物理世界和 数字世界之间架起桥梁
首先 我们正在扩展 Apple Vision Pro 上的相机访问功能
Apple Vision Pro 利用 先进的摄像头系统 通过前置摄像头 捕获佩戴者的环境 提供透视体验
去年我们发布了 一个 API 用于访问 设备的左侧主摄像头视频源 今年 我们扩展了 这个 API 让用户能够直接访问 单个左摄像头或右摄像头 或者同时访问两个摄像头 以进行立体处理和分析 如果你已经熟悉 这就是 ARKit 中的 CameraFrameProvider API
现在 摄像头源支持 在沉浸式空间 和共享空间环境中使用 允许你的 App 与 其他 App 和窗口协同工作
这就是最新的 visionOS 如何使相机访问更加灵活
现在 我来展示一种将 周围环境细节可视化的新方法
专业人士通常需要监控 工作区域的特定细节 例如 技术人员需要读取 复杂机器上的小仪表板 或者检查人员可能需要 在光线不足的区域检查组件
为了解决这个问题 我们 将推出一项强大的新功能 允许佩戴 Apple Vision Pro 的用户 在真实世界视图中 选择特定区域 并在单独的窗口中提供 这个区域的专用视频源
这个视频源可以放大或增强 使关键细节清晰可见
VisionKit 新增一个 SwiftUI 视图 称为 CameraRegionView 你只需将这个窗口直观地 放置在要增强的区域上 然后 CameraRegionView 会利用自身位置 为虚拟摄像头提供 合适的区域和空间
如果你需要更精细的控制 可以使用 ARKit 中新的 CameraRegionProvider API
这使你能够直接访问并且 如果你已在使用 ARKit 熟悉锚点 或有更具体的 UI 需求 这将非常有用
下面通过我创建的一个 状态 App 示例来演示它的运作方式
在这里可以看到 我回到了我的项目中 这次 我想在工作时 监测系统中的压力
我将打开状态 App 的 检查器窗口 并将它放置在仪表板前面
如你所见 仪表板的视频源 已出现在我的状态 App 中 现在我可以返回工作 并在工作时留意压力情况
现在 我来展示一下如何使用 SwiftUI 和 VisionKit API 仅用几行代码就为 我的 App 添加摄像头区域
首先导入 VisionKit
接着定义标准的 SwiftUI 视图 命名为 InspectorView 用于包含相机区域 这个视图的核心 是 CameraRegionView 我使用 IsContrastAndVibrancyEnhancementEnabled 参数对它进行初始化 传入 true 以启用防抖 以及对比度和鲜艳度增强效果 正如我提到的 这个视图需要 存在于独立窗口中 因为它会根据窗口的位置 确定透视画面中 需要处理的部分 让我们来看看 App 结构体
这是我的 App 结构体 主 WindowGroup 用于 存放 App 主要内容 我将为 InspectorView 另外 创建一个 WindowGroup
这就足以在 App 中 添加一个相机区域 但对于更复杂的应用程序 CameraRegionView 支持闭包 因此我要更改代码 来使用这个闭包 以分析相机图像 之后还可添加 将图像保存到文件的功能
我将修改 CameraRegionView 以接受闭包 使我能够在每个相机帧 到达时对它进行处理
首先添加 cameraFeedDelivery 类 用于捕获相机帧 并将它们传递给 App 的其余部分
我的闭包将使用来自 CameraRegionView 的 pixelBuffer 在这里我将检查错误 并将 pixelBuffer 传递给 cameraFeedDelivery 类 我的闭包返回 nil 这表明 我没有修改 pixelBuffer 我还可以使用这个闭包 进行自定处理 如果我修改 pixelBuffer 并返回它 CameraRegionView 就会 渲染调整后的相机图像
因此 仅需几行代码 我就为 App 添加了相机区域 在我的示例中 我启用了 对比度和鲜艳度增强功能 但 Camera Region API 提供了 两种内置处理功能 首先是图像防抖功能 这可确保 在头部自然移动时 内容保持锚定和稳定 其次是对比度和 鲜艳度增强功能 其中包括防抖功能 并针对亮度和色彩表现 进行优化
现在我们来看看 ARKit 中 用于相机区域的 API 也许你的应用程序 需要将相机区域 与特定 3D 对象相关联 或者希望在识别环境中的 特定对象后 放置相机区域 如果你的应用程序需要 对锚点和 3D 对象进行 这种细粒度控制 这个 API 提供了底层原语 然后你需要定义锚点
在 ARKit 中 锚点通过指定变换 和物理尺寸 (以米为单位) 来定义一个通向 现实世界的虚拟窗口 这个窗口定义了一个区域 在其中可以看到透视 摄像头源的直接稳定视图
你可以把它想象成 在物理空间中放置 一个虚拟摄像机 这个虚拟摄像机不需要 附加到 visionOS 窗口 它可以生成 Apple Vision Pro 摄像头视野内任何位置的源
接下来 我们仔细看看这个 API
ARKit 提供了一种新型数据提供程序 称为 CameraRegionProvider 整合相机区域遵循 熟悉的 ARKit 模式 我首先在 ARKitSession 上 运行数据提供程序 就像使用其他 ARKit 功能一样 在提供程序启动并运行后 下一步是确定 相机区域的位置 这通过创建 CameraRegionAnchor 并将它添加到提供程序来实现 这些锚点用于 指定现实世界中需要 虚拟摄像机捕捉的区域范围 ARKit 运行时 提供程序 会向这些锚点发送更新 每次更新都附带 一个新的 pixelBuffer 这个缓冲区包含这个 特定空间区域的稳定视图
下面让我们深入了解 如何创建其中一个锚点
创建 CameraRegionAnchor 非常简单 我使用标准的 6 自由度变换定义 它在世界中的 位置和方向 然后指定它的物理尺寸 即宽度和高度 (以米为单位) 这些参数共同 定义了相机区域的 现实世界窗口 我还需要告诉 ARKit 是否希望这个窗口 进行对比度增强或仅进行稳定处理 然后我将它添加到 CameraRegionProvider 添加锚点后 我调用 anchorUpdates(forID:) 并传递 newAnchor 的锚点 ID 现在 摄像头源会正好 显示在锚点指定的位置 我的代码可以处理每次 更新时提供的 pixelBuffers
这就是 ARKit 中的相机区域 是跟踪环境中特定区域的 强大工具 但在结束这个话题之前 有几点需要记住 CameraRegionView 中的透视内容 与任何 SwiftUI 视图一样 可以使用标准技术进行缩放或平移 如果实现这些转换 请确保它们也应用于 保存或远程传输的 任何相机帧 重要的是要了解 增强算法 会动态调整帧速率 以提供最佳图像质量 选择防抖功能 而不是对比度增强功能 将导致更高的帧速率 因为防抖功能 需要的处理能力更少 虽然 ARKit 中的相机区域 功能强大且支持任意大小的区域 但注意资源使用情况很重要 较大的相机区域自然会对 内存和处理产生更大的影响
最后 强烈建议 在设计体验时评估 整体资源使用情况 尤其是在处理 大型增强区域时 作为准则 目标是让 CameraRegionAnchor 显示的透视内容使用 不超过整体可见区域的 六分之一
这些就是旨在连接物理世界 和数字世界的主题 也是我们今年增添的 一长串企业级增强功能中的 最后一部分 从使 UVC 访问 和对象跟踪等 核心功能更加灵活 到推出窗口跟随模式 受 App 保护的内容和相机区域 我相信你会找到无数种方法 在 App 中使用这些新功能
最后分享几点 重要指导说明
首先要注意环境安全 确保用户位于合适的位置 在佩戴 Apple Vision Pro 时 安全地执行任务 尤其是在与 现实世界设备交互时 请记住 随着访问权限的增强 尤其是对摄像头和传感器的访问 责任也随之增加 对用户透明地说明 正在访问哪些数据以及原因 将应用程序设计为仅收集 任务所需的信息 尊重工作场所的用户隐私 确保你的应用程序 和用例符合资格要求 这些功能适用于为自己员工 开发的专有内部 App 或为其他企业构建并 私下分发的自定 B2B App 确认这些事项后 如果符合条件 则仅请求应用程序 特定功能真正需要的企业授权
最后 请与我们分享你的反馈 我们不仅关注 这些特定 API 的使用反馈 更期待了解 你对在 visionOS 上构建出色 企业应用程序所需未来功能的意见
感谢观看 祝你在 WWDC 度过美妙的时光
-
-
3:00 - createml on the Mac command line
xcrun createml objecttracker -s my.usdz -o my.referenceobject
-
4:28 - VisionEntitlementServices
import VisionEntitlementServices func checkLicenseStatus() { // Get the shared license details instance let license = EnterpriseLicenseDetails.shared // First, you might check the overall license status guard license.licenseStatus == .valid else { print("Enterprise license is not valid: \(license.licenseStatus)") // Optionally disable enterprise features or alert the user return } // Then, check for a specific entitlement before using the feature if license.isApproved(for: .mainCameraAccess) { // Safe to proceed with using the main camera API print("Main Camera Access approved. Enabling feature...") // ... enable camera functionality ... } else { // Feature not approved for this license print("Main Camera Access not approved.") // ... keep feature disabled, potentially inform user ... } }
-
10:04 - SharedCoordinateSpaceModel
// // SharedCoordinateSpaceModel.swift // import ARKit class SharedCoordinateSpaceModel { let arkitSession = ARKitSession() let sharedCoordinateSpace = SharedCoordinateSpaceProvider() let worldTracking = WorldTrackingProvider() func runARKitSession() async { do { try await arkitSession.run([sharedCoordinateSpace, worldTracking]) } catch { reportError("Error: running session: \(error)") } } // Push data received from other participants func pushCoordinateSpaceData(_ data: Data) { if let coordinateSpaceData = SharedCoordinateSpaceProvider.CoordinateSpaceData(data: data) { sharedCoordinateSpace.push(data: coordinateSpaceData) } } // Poll data to be sent to other participants func pollCoordinateSpaceData() async { if let coordinateSpaceData = sharedCoordinateSpace.nextCoordinateSpaceData { // Send my coordinate space data } } // Be notified when participants connect or disconnect from the shared coordinate space func processEventUpdates() async { let participants = [UUID]() for await event in sharedCoordinateSpace.eventUpdates { switch event { // Participants changed case .connectedParticipantIdentifiers(participants: participants): // handle change print("Handle change in participants") case .sharingEnabled: print("sharing enabled") case .sharingDisabled: print("sharing disabled") @unknown default: print("handle future events") } } } // Be notified when able to add shared world anchors func processSharingAvailabilityUpdates() async { for await sharingAvailability in worldTracking.worldAnchorSharingAvailability where sharingAvailability == .available { // Able to add anchor } } // Add shared world anchor func addWorldAnchor(at transform: simd_float4x4) async throws { let anchor = WorldAnchor(originFromAnchorTransform: transform, sharedWithNearbyParticipants: true) try await worldTracking.addAnchor(anchor) } // Process shared anchor updates from local session and from other participants func processWorldTrackingUpdates() async { for await update in worldTracking.anchorUpdates { switch update.event { case .added, .updated, .removed: // Handle anchor updates print("Handle updates to shared world anchors") } } } }
-
12:50 - contentCaptureProtected
// Example implementing contentCaptureProtected struct SecretDocumentView: View { var body: some View { VStack { Text("Secrets") .font(.largeTitle) .padding() SensitiveDataView() .contentCaptureProtected() } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) } }
-
16:48 - CameraRegionView
// // InspectorView.swift // import SwiftUI import VisionKit struct InspectorView: View { @Environment(CameraFeedDelivery.self) private var cameraFeedDelivery: CameraFeedDelivery var body: some View { CameraRegionView(isContrastAndVibrancyEnhancementEnabled: true) { result in var pixelBuffer: CVReadOnlyPixelBuffer? switch result { case .success(let value): pixelBuffer = value.pixelBuffer case .failure(let error): reportError("Failure: \(error.localizedDescription)") cameraFeedDelivery.stopFeed() return nil } cameraFeedDelivery.frameUpdate(pixelBuffer: pixelBuffer!) return nil } } } @main struct EnterpriseAssistApp: App { var body: some Scene { WindowGroup { ContentView() } WindowGroup(id: "InspectorView") { InspectorView() } .windowResizability(.contentSize) } }
-
21:15 - CameraRegionAnchor
class CameraRegionHandler { let arkitSession = ARKitSession() var cameraRegionProvider: CameraRegionProvider? var cameraRegionAnchor: CameraRegionAnchor? func setUpNewAnchor(anchor: simd_float4x4, width: Float, height: Float) async { let anchor = CameraRegionAnchor(originFromAnchorTransform: anchor, width: width, height: height, cameraEnhancement: .stabilization) guard let cameraRegionProvider = self.cameraRegionProvider else { reportError("Missing CameraRegionProvider") return } do { try await cameraRegionProvider.addAnchor(anchor) } catch { reportError("Error adding anchor: \(error)") } cameraRegionAnchor = anchor Task { let updates = cameraRegionProvider.anchorUpdates(forID: anchor.id) for await update in updates { let pixelBuffer = update.anchor.pixelBuffer // handle pixelBuffer } } } func removeAnchor() async { guard let cameraRegionProvider = self.cameraRegionProvider else { reportError("Missing CameraRegionProvider") return } if let cameraRegionAnchor = self.cameraRegionAnchor { do { try await cameraRegionProvider.removeAnchor(cameraRegionAnchor) } catch { reportError("Error removing anchor: \(error.localizedDescription)") return } self.cameraRegionAnchor = nil } } }
-
-
- 0:04 - 简介
Apple 去年推出了企业 API,今年更是在此基础之上推出了众多新功能和改进。这类 API 专为内部专有 App 而设计,需配合管理式授权和许可文件使用。本次更新专注于简化开发流程、提升用户体验,并启用全新的环境可视化功能。
- 1:37 - 简化开发流程
最新版 visionOS 扩展了 API 访问权限,赋能开发者成就更多精彩。主要改进包括更广泛的 API 可用性、对象追踪增强功能,以及简化的企业许可管理。 去年推出的多个 API (包括用于访问 UVC 兼容网络摄像头和神经网络引擎的 API) 现已向所有开发者开放,无需企业许可。现在,你可直接从命令行训练对象追踪模型,实现训练流程自动化并将它集成到现有管道中。 许可文件现可直接在 Apple 开发者账户中访问,并且会自动进行续订。借助新框架,开发者还可轻松查看特定功能的许可状态和 App 审批情况。
- 4:54 - 提升用户体验
visionOS 26 推出多项新功能,可提升空间应用程序的用户体验。 其中一项功能是窗口跟随模式,它让用户在空间环境中导航时可选择某个窗口随自己一起移动。这项功能对于在移动时需要频繁参考相关信息的任务特别有用。要启用这种模式,你需要请求并管理特定的许可授权。 我们还增强了空间计算的协作体验。共享坐标空间让身处同一物理空间的多位用户能够共享空间体验。每个人都可以与 App 的内容进行交互并深度参与讨论,就像这些内容真实存在一样。 你可以利用同播共享轻松设置这项功能,也可使用专为企业客户设计的全新 ARKit API“SharedCoordinateSpaceProvider”实现更多控制。这个 API 允许多个参与者对齐坐标系,并通过选定的本地网络传输系统共享数据,从而为共享世界锚点创建通用坐标系。 此外,数据隐私和安全也至关重要,尤其是在需要处理敏感信息的企业应用程序中。借助“contentCaptureProtected”这个新 API,你可将特定的用户界面元素或整个场景标记为受保护。这样一来,系统便会在所有截屏、录制、镜像视图或共享会话中自动模糊处理这些受保护的内容,确保敏感数据仅对佩戴 Apple Vision Pro 的用户可见。
- 13:37 - 呈现环境
最新版 visionOS 进一步增强了 Apple Vision Pro 连接物理世界和数字世界的能力。我们进一步扩展了摄像头系统,让你能通过 ARKit 的“CameraFrameProvider”API 获取更灵活的设备摄像头访问权限。借助这项功能,无论用户身处沉浸式空间还是共享空间环境,你的 App 都可以利用摄像头源实现无限精彩。 我们还推出了一项新功能,让用户能够放大和增强现实世界视图的特定区域。使用 VisionKit 的“CameraRegionView”,开发者可以创建窗口来显示选定区域的专用视频源,更加清晰地呈现关键细节。这项功能对于需要在光线不足的区域持续监测小型仪表或组件的专业人员 (如技术人员和检查员) 特别有用。 只需几行 SwiftUI 代码,即可利用“CameraRegionView”和“CameraRegionProvider”API 实现这项功能。这些 API 提供了一些内置的处理选项 (如对比度和鲜艳度增强),还支持自定图像分析与修改,可灵活运用于各种应用程序中。ARKit 的“相机区域”功能增强了 Apple Vision Pro 的透视摄像头源,这些摄像头源可应用于“CameraRegionAnchors”虚拟窗口所定义的特定区域。 你可以通过指定这些锚点在现实世界中的位置、方向和大小来创建这些锚点。这样,ARKit 便会为这些区域提供经过防抖和增强处理的像素缓冲区。这项功能还支持缩放和平移,并可根据所选的增强算法来动态调整帧速率。请务必充分考虑资源使用情况,因为较大的相机区域会影响到内存和处理。
- 24:01 - 后续步骤
为了确保适用于 Apple Vision Pro 的企业 App 发挥最佳效果,请务必将安全性放在首位,仅收集必要的数据以尊重隐私,确保 App 符合资格要求 (无论是内部 App 还是自定 B2B App),并且仅请求特定功能所需的授权。