大多数浏览器和
Developer App 均支持流媒体播放。
-
为你介绍适用于 visionOS 的企业 API
探索如何利用适用于 visionOS 的全新企业 API 打造空间体验,帮助使用 Apple Vision Pro 的员工和顾客提升效率。
章节
- 0:00 - Introduction
- 2:36 - Enhanced sensor access
- 11:38 - Platform control
- 18:39 - Best practices
资源
- Building spatial experiences for business apps with enterprise APIs for visionOS
- Forum: Business & Education
相关视频
WWDC24
-
下载
大家好 我是 Kyle McEachern 我是 Vision Pro 企业团队的工程师 今天很高兴能和大家聊聊 我们即将为 visionOS 推出的 一系列企业 API 自从 Vision Pro 推出以来 我们一直在听取企业顾客的意见 他们希望获得更多的功能 以便构建能够真正改变 自身业务方式的 App 今天我很高兴向大家介绍 这些企业 API 将为 visionOS 带来的新功能 现在 Vision Pro 可以 在各种企业环境中 让工作变得更轻松、 更高效也更准确 我们推出了全新的空间体验 以加强协作和沟通 创建引导式工作活动 来简化复杂的任务 或者实现前所未有的全新空间体验 为了支持这些以及更多功能 今年我们将推出六个新 API 为企业顾客及其 App 解锁令人期待的新功能 听起来很不错 是吧? 现在 在详细介绍 API 之前 请务必注意 尽管这些 API 支持许多行业的广泛应用 但它们也提供 比现有 API 更高级的 设备功能访问权限 Apple 坚信 隐私是每个人的基本权利 因此 我们在设计时 充分考虑了隐私保护 为确保仅在适当的情况下使用隐私 需要使用管理式授权并提供 与开发者账户关联的许可文件 以便为 App 启用授权
由于这些 API 仅供企业使用 因此 授权仅适用于专有的内部 App 或为其他企业定制的 App 并且通过 Apple 商务管理 以非公开方式分发给企业用户 第一类 API 可提供增强的 传感器访问权限 并改进了 Vision Pro 的 视觉处理功能 其中包括 使用主摄像头、改进的拍摄和直播 功能 以及通过摄像头增强的功能
第二类侧重于平台控制 通过 Apple 神经网络引擎 实现先进机器学习功能、 增强了对象追踪功能 还能微调 App 性能 从而获得更强的 计算能力来处理繁重的工作任务 今天我们将逐一介绍六个新 API 了解它们的实现方式 并提供示例用例 最后 总结一些最佳做法 我们先从第一个类别开始 即增强的传感器访问权限 我们收到的最常见的请求之一 就是要求使用主摄像头 所以我将从这里开始讲起 启用这个新 API 后 你现在可以看到 Vision Pro 周围的整个环境 这个 API 可让 App 访问设备的主摄像头视频源 以便在你的 App 中使用
通过分析和解读视频源 然后 根据看到的情况决定采取什么行动 就能解锁许多增强的空间功能
例如 它可用于生产线 利用主摄像头源 和计算机视觉算法进行异常检测 快速识别不符合质量标准的部件 并将它突出显示以便用优质部件替换 接下来我们将深入了解如何 访问主摄像头源并将它嵌入 App 有了“main-camera-access.allow” 授权 以及使用 App 构建的 有效企业许可文件 我们就可以利用 API 并获取视频源 授权设置好后 我们将设置核心变量 首先设置 CameraFrameProvider 并将支持的格式定义为“main” 以便从主摄像头获取源 同时我们还会创建 ARKitSession 和 CVPixelBuffer 来存储和显示源 然后确保请求用户对 主摄像头访问权限进行授权 再将 CameraFrameProvider 传入 ARKit 会话并运行它
完成后 我们就可以向 CameraFrameUpdates 请求 “main”格式的数据 从 CameraFrameProvider 提取视频帧 并将它存储在一个变量中以便访问 最后我们可以从接收到的 每一帧中提取“.left”值的样本 因为我们使用的“主”摄像头 是用户左侧的摄像头 将它放入像素缓冲区 然后就可以在 App 中随意使用了! 就是这么简单 对主摄像头的访问 为企业 App 释放了巨大的潜力 我在这里只重点介绍了 其中几个 但它有可能 对各行各业产生真正的影响 所以 我很高兴今天能谈谈这个话题 接下来我们来了解一下如何 在截屏中包含透视视频 如今在使用 Vision Pro 进行截屏时 会截取用户打开的所有窗口 但会移除背景 不会包含用户周围环境的透视视频源 现在可以在 Vision Pro 中 捕捉并分享用户的整个视图 通过这个 API 我们将完整的 组合空间视图添加到 visionOS 的截屏中 包括透视摄像头源 用户所看到的一切都在那里 可以捕捉和存储 或者通过 App 传输给 不同设备上的其他用户 为了在捕捉用户的整个视图时 其中也包括打开的 App 更好地保护用户隐私 此功能要求使用 广播上传扩展程序来接收源 并通过 ReplayKit 使用 visionOS 的内置广播功能 这意味着 用户每次开始截屏或分享时 都需要特别使用 系统的“开始广播”按钮 例如 现场的技术员可以使用它 给办公室的专家打电话 他们可以通过“所见即所得”功能 分享自己的实际视图 包括透视摄像头和 上面的 visionOS 窗口 然后他们可以与专家开展协作 无需动手就能获得与他们的 体验完全匹配的反馈 那么 我们该如何实现呢? 我们来看看 与处理 Main Camera API 一样 我们在适当位置放置了 “include-passthrough”授权文件 以便在截屏时用透视摄像头 访问组合空间视图 这样就可以了! 通过具有这一授权的 App 对系统进行截屏时 系统会自动将常黑的背景 替换为透视摄像头的视图 让你的截屏能够实现 “所见即所得”的功能 就这么简单! 我喜欢这种一步到位的改变 有了这个 API App 能够支持用户 进行远程调试 或为不同地点的 工作人员提供专业指导 让知识丰富的个人能够 在不同场景下提供更有力的协助 要是几个月前我尝试自学焊接的时候 能有这个 API 就好了! 最后还有空间条形码和二维码扫描 Vision Pro 现在拥有自动检测 并解析条形码和二维码的功能 可根据检测到的代码 实现自定的 App 功能 检测到二维码或条形码时 App 会接收相关信息 其中包括检测到的代码类型、 该代码相对于用户的 空间位置以及该代码的有效负载内容 这有着无数的潜在用例 正如二维码和条形码 有无数的潜在应用一样
举例来说 这可应用于仓库 让正在检索所需物品的工人 只需查看包装的条形码就能确认 这就是他们要找的正确物品 无需再依靠人工识别 也不用随身携带扫码器 以免在携带或移动物品时造成不便 对于此 API 我们使用 “barcode-detection.allow”授权 接下来 我们来看看如何 在 App 中设置条形码检测
首先设置 ARKitSession 并确保启用 worldSensing 权限 因为检测条形码需要这项权限
然后我们启用 visionOS 的新增变量 BarcodeDetectionProvider 和现有的 HandDetectionProvider 设置方法一样 它将处理查找和追踪 这些条形码的具体细节 在本例中 通过传入这 3 个符号 我们将在此查找 Code-39 条形码、 二维码和 UPC-E 类型条形码 相关文档列出了此 Vision Pro 企业 API 支持的所有符号
然后 我们开始 ARKit 会话 连接到这个 BarcodeDetectionProvider 接下来 我们等待该提供程序的 更新 并在更新到达时进行处理
当检测到新代码时 API 将通过 “added”事件发送更新 例如可以高亮显示代码 当代码的位置发生移动时 “updated”事件可以 让我们更新 UI 以追踪代码 当我们再也看不到代码时 “removed”事件可以让我们清理 UI 这样就可以了! 空间条形码由系统自动检测 可在我们的 App 中使用 这在物流、错误检查、识别部件或 在特定点为用户提供背景数据 等方面可以有很多应用 现在 我想与大家分享 一个简短的演示 通过一个示例来说明 如何使用这些 新的 API 来打造前所未有的体验 具体的情景是 我正在 尝试组装一个新的电子元件 但未能成功 于是需要 我们支持中心的朋友 Naveen 提供一些协助 大家请看 最近我正努力 尝试组装一些电子元件 我本该准备好这些元件 以便在当天晚些时候的会议上演示 不幸的是我卡壳了 不过幸好我有 企业的“支持中心” App 遇到这类情况时 我可以通过它获得实时帮助! 打开“支持中心” 我就能联系到 支持专员获得实时帮助 好像是我在总部的朋友 Naveen! 他一定能够提供帮助 Naveen 想看看我在做什么 让我打开摄像头与他分享 点按“Enable Camera Sharing” 我就可以与 Naveen 共享主摄像头源 我可以在此处的窗口中预览 这样我就知道我所看到的内容 并发送给他
这个套件似乎不太容易识别 因此 Naveen 想看看套件的说明 包装盒上有一个码 可以自动调出相应套件的说明 我点按了 App 中的 “Enable Barcode Scanning” 然后拿起包装盒看向侧面的条形码 相关说明就出现在 App 中了!
我告知 Naveen 我找到了说明 他让我与他共享整个屏幕 这样他就能同时看到说明和我的视图 真正看到我所看的内容 为此 我点按了“Share Full View” 在菜单中选择 App 的名称 然后点按“Start Broadcast” 现在 Naveen 看到了我的完整视图 现在我们来看看 他那边看到的内容 在这里我们可以 看到 Naveen 的视图 在他的“支持中心”代理视图中 他可以看到我与他共享的完整视图 他看了看我的套件 将它与说明进行了比较 发现我遗漏了最后一步 需要在 45 号针脚上连接一根导线 才能完成工作 于是告诉了我
而在我这边 我将部件放到了 正确的位置 然后就成功了! 我的状态指示灯变绿 我们的套件准备就绪! Naveen 随后与我道别 我就可以关闭 App 了 现在我已经得到了帮助 可以去参加稍后的重要会议了 呼呼! 当然这个演示以特定的方式 将这些新功能整合到了一个 App 中 目的只是为了简要说明 如何使用这些功能 就你的情况而言 可能只需要其中一两个功能 并且用法可能完全不同 我们将它们设计得灵活而强大 可用于各行各业的企业环境 现在我们来看看第二个类别 即增强的平台控制 首先让 Vision Pro 可以访问 设备内置的 Apple 神经网络引擎 这样 机器学习任务就可以 通过 Apple 神经网络引擎 在设备上执行而不是按默认方式 仅通过 CPU 和 GPU 执行 这增强了 Vision Pro 现有的 CoreML 功能 通过允许设备运行那些需要 访问 Apple 神经网络引擎 或通过访问 Apple 神经网络引擎 得到增强的模型
例如 在实现我们讨论过的 主摄像头访问功能时 顾客可以使用 Vision Pro 识别有缺陷的产品 也可以 实现自定的机器学习模型 进行异常检测 该模型的功能需要 Apple 神经网络 引擎 才能在设备上完全运行 这样就可以完全在本地检测
Apple 芯片为我们的所有 机器学习平台提供强大支持 模型可在 CPU、GPU 和 Apple 神经网络引擎上运行 即使没有这项授权 visionOS 中的模型也能 在 Vision Pro 的 CPU 和 GPU 上运行 获得这项授权后 Apple 神经网络 引擎将以计算设备的形式解锁 供你的 App 运行模型 从而实现强大的机器学习功能
实现后 CoreML 将根据 各种因素 包括设备上的 当前资源使用情况、可用的计算设备 以及模型的特定需求来动态决定 模型在哪个处理单元上的运行 效率最高 并将模型计算引导至那里 我们来看看如何为模型 启用 Apple 神经网络引擎 要实现这一点 具体过程很简单 与所有这些 API 一样 你需要 设置授权和许可文件 对 Apple 神经网络引擎而言 需要的 是“neural-engine-access”授权 只需具备该授权便可 使用神经网络引擎运行模型 要在代码中验证你是否有权访问 Apple 神经网络引擎 可以使用类似这样的代码段 来查看 MLModel 类的 “availableComputeDevices”属性 然后根据结果进行操作 请注意 这些是 App 可能使用的 方法调用示例 并非 API 的一部分 然后在调用模型时 系统会在执行 模型时酌情利用神经网络引擎 如果神经网络引擎不可用 或者系统状态使其使用效率不高 CoreML 将回退到 GPU 和/或 CPU 进行计算
有了这一动态决策系统 在具有该授权的 App 上运行的 任何机器学习模型都将 尽可能高效地自动执行 很不错 对吧? 接下来 我们了解一下如何通过 参数调整来增强已知对象追踪 已知对象追踪是 visionOS 2.0 中的 一项新功能 让 App 可以在项目中 内置特定的参考对象 以便 在查看区域内进行检测和追踪 对于企业顾客 我们将通过 可配置的参数来增强这一新功能 从而调整和优化对象追踪 使其最适合顾客的用例 包括 更改一次性可追踪的对象数量上限 更改静态对象以及经过用户视野的 动态对象的追踪速率 并修改
检测速率以识别和定位 Vision Pro 视野中这些已知对象的新实例
但是这个 API 具有相同的 基准计算能力 因此 要让增加一个或多个最适合你用例的 参数这一做法充分发挥价值 可能需要减少其他参数以平衡 计算要求 并保持系统正常运行 同时提供你在 App 中 期望提供的功能
这可以在针对复杂维修环境 (需要 追踪和使用各种各样的工具和部件) 构建的 App 中使用 让技术人员能够按照引导式说明 更换机器上的部件 通过存储的 大量相关对象的知识来进行增强 在维修期间需要时 在适当的位置突出显示它们 这个在实践中的效果如何? 真的非常简单! 我们要对此 API 使用的授权是 “object-tracking-parameter -adjustment.allow” 准备好之后就可以 设置对象追踪代码了!
首先设置 TrackingConfiguration 然后在该配置变量上设置新的目标值 在本例中我们将追踪对象的数量上限 从默认值 10 提高到了 15
不需要每次都设置所有值 只需设置要更改的值 我们包含这段代码只是为了 展示你可以使用的选项 然后我们设置 ObjectTrackingProvider 将要查找的参考对象 与刚刚设置的自定 TrackingConfiguration 一起传入 与 visionOS 2.0 中的 所有已知对象追踪一样 这些参考对象都是 “.referenceObject”文件 有关这些文件的创建流程 请参阅本讲座相关文档中的链接
然后 我们只需使用 ObjectTrackingProvider 启动 ARKit 会话 就大功告成了! 追踪对象的数量上限就这样提高了 你的用例可能需要一次 追踪大量不同的对象 或者需要比默认检测率 更精细的追踪水平 因此我们进行了相应设计 使它能够灵活满足顾客的需求 允许进行调整以 在 App 中获得最佳体验 最后 我们可通过 App 计算设置 来提升性能余量 通过前面介绍的这些新企业 API 顾客可以充分发挥 其 App 和设备的性能 现在我们可通过 App 计算设置 进一步提升性能表现 有了这项授权 企业开发者 就能在其 Vision Pro 设备上 获得更强的计算能力 尽管设备噪音稍微大一点 风扇却能转得更快 以保持系统顺畅运行
在任何工作负载很高的情况下 开发者都需要在计算能力和 散热、电池续航时间以及 用户舒适度之间取得平衡 在采用默认设置的情况下 Vision Pro 经过调整 可在大多数用例中兼顾这三者 但通过这个授权 企业可以在其他 两方面的性能略有下降的同时 提高 CPU 和 GPU 的计算能力 前提是 企业需要 在特定的用例中权衡取舍 这样一来 顾客就可以充分 发挥 Vision Pro 的性能 并充分释放企业 App 的所有潜力 例如顾客可能想 将一个高度复杂、高保真的 三维设计加载到自己的空间 并在其周围走动 从而能查看该设计 结果发现启用 App 计算设置后 渲染和性能都得到了改善 要启用此设置 只需在适当的位置添加 “app-compute-category”授权 系统就会自动识别出 它能够利用增强的计算能力 并根据需要运行风扇 以确保设备流畅运行 此设置会作用于整个 App 而且不会由 App 代码开启或关闭 启用此授权后 系统可随时 根据工作负载的需要来自动调整 CPU 和 GPU 功耗以及风扇 由于此设置会作用于整个 App 并且无法通过代码中 调用的特定方法来控制 因此 请记住 这个系统将根据 Vision Pro 的状态和工作负载 随时动态启用和停用 在类似情况下 你的体验可能会 因这项功能的动态特性而有所不同 最后我们来看看在 visionOS 上 实现这些新企业 API 时 应遵循的最佳做法 请务必注意环境安全并确保 使用 Vision Pro 的人员 其所处区域方便他们佩戴设备 来安全完成所有工作
调查现有 API 并确保你的特定用例 所需的 API 并不包含在内 现有的 SDK 中已包含许多可帮助 构建出色体验的强大功能! 请只申请你的 App 所需的特定授权 我们希望确保开发者拥有实现其 企业 App 开发目标所需的功能 但同时也非常重视 用户隐私和用途限制
最后还要确保员工的隐私 有了这一额外的访问权限级别 特别是能够直接访问 主摄像头源的 API 会产生一些需要在你的工作场所 以及与你的员工一起考虑的场景 确保所构建的内容满足企业需求 同时尊重工作环境中相关人员的隐私 以上就是我针对 visionOS 企业 API 的简要概述 希望你能发现 这些全新 API 中的 一个或多个将帮助你 缩小你心目中完美空间 App 的构想与实现之间的差距 这些 API 解锁了众多强大的新功能 不仅可增强传感器访问体验 还能改进平台控制 我们将它们设计成 用途广泛的“构建块” 让你能够根据企业的业务需求 量身定制 App 希望你能和我们一样满怀兴奋地 看到了它们的广阔应用空间 在结束今天的讲座之前 我想给大家一些最后的指导建议 首先请查看这些 API 的相关文档 与本讲座相关的资源中 有一个文档链接 当你确定了一个或多个 符合自身需求的解决方案时 请务必确认自己的用例 是否符合资格要求 也就是说这些 API 适用于为员工 或顾客的员工设计的内部企业 App 检查上述项目后 根据你所需的 API 申请相应的授权 有关申请方式和地点的信息 另请参阅本讲座的资源 欢迎针对这些新 API 以及 你希望 visionOS 后续版本 推出的功能提供反馈 最后 别忘了观看今年的 “设备管理方面的新动向”讲座 了解用于在企业中管理 Apple Vision Pro 的最新技巧 感谢大家与我一起探讨 适用于 visionOS 的企业 API!
-
-
3:36 - Main Camera Feed Access Example
// Main Camera Feed Access Example let formats = CameraVideoFormat.supportedVideoFormats(for: .main, cameraPositions:[.left]) let cameraFrameProvider = CameraFrameProvider() var arKitSession = ARKitSession() var pixelBuffer: CVPixelBuffer? await arKitSession.queryAuthorization(for: [.cameraAccess]) do { try await arKitSession.run([cameraFrameProvider]) } catch { return } guard let cameraFrameUpdates = cameraFrameProvider.cameraFrameUpdates(for: formats[0]) else { return } for await cameraFrame in cameraFrameUpdates { guard let mainCameraSample = cameraFrame.sample(for: .left) else { continue } self.pixelBuffer = mainCameraSample.pixelBuffer }
-
7:47 - Spatial barcode & QR code scanning example
// Spatial barcode & QR code scanning example await arkitSession.queryAuthorization(for: [.worldSensing]) let barcodeDetection = BarcodeDetectionProvider(symbologies: [.code39, .qr, .upce]) do { try await arkitSession.run([barcodeDetection]) } catch { return } for await anchorUpdate in barcodeDetection.anchorUpdates { switch anchorUpdate.event { case .added: // Call our app method to add a box around a new barcode addEntity(for: anchorUpdate.anchor) case .updated: // Call our app method to move a barcode's box updateEntity(for: anchorUpdate.anchor) case .removed: // Call our app method to remove a barcode's box removeEntity(for: anchorUpdate.anchor) } }
-
13:17 - Apple Neural Engine access example
// Apple Neural Engine access example let availableComputeDevices = MLModel.availableComputeDevices for computeDevice in availableComputeDevices { switch computeDevice { case .cpu: setCpuEnabledForML(true) // Example method name case .gpu: setGpuEnabledForML(true) // Example method name case .neuralEngine: runMyMLModelWithNeuralEngineAvailable() // Example method name default: continue } }
-
15:39 - Object tracking enhancements example
// Object tracking enhancements example var trackingParameters = ObjectTrackingProvider.TrackingConfiguration() // Increasing our maximum items tracked from 10 to 15 trackingParameters.maximumTrackableInstances = 15 // Leaving all our other parameters at their defaults trackingParameters.maximumInstancesPerReferenceObject = 1 trackingParameters.detectionRate = 2.0 trackingParameters.stationaryObjectTrackingRate = 5.0 trackingParameters.movingObjectTrackingRate = 5.0 let objectTracking = ObjectTrackingProvider( referenceObjects: Array(referenceObjectDictionary.values), trackingConfiguration: trackingParameters) var arkitSession = ARKitSession() arkitSession.run([objectTracking])
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。