View in English

  • 打开菜单 关闭菜单
  • Apple Developer
搜索
关闭搜索
  • Apple Developer
  • 新闻
  • 探索
  • 设计
  • 开发
  • 分发
  • 支持
  • 账户
在“”范围内搜索。

快捷链接

5 快捷链接

视频

打开菜单 关闭菜单
  • 专题
  • 相关主题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 转写文稿
  • 代码
  • 借助 Wi-Fi Aware 增强设备连接性能

    了解如何使用 Wi-Fi Aware 建立对等网络连接。我们还将介绍如何以带宽更高、延迟更低的网络连接性能实时共享视频、传输大文件,以及操控配件。此外,你将了解如何借助 DeviceDiscoveryUI、AccessorySetupKit 和 Network 框架,在自己的 App 中使用 Wi-Fi Aware。

    章节

    • 0:00 - 简介
    • 1:01 - 概览
    • 7:46 - 配对
    • 15:05 - 连接
    • 19:01 - 优化
    • 22:26 - 准则

    资源

    • Accessory Design Guidelines
    • Wi-Fi Aware
      • 高清视频
      • 标清视频

    相关视频

    WWDC24

    • 了解 AccessorySetupKit
  • 搜索此视频…

    大家好 我叫 Swetank 我是 Wi-Fi 团队的工程师 今天我将介绍 Wi-Fi Aware 框架 并展示如何使用它来增强 App 中的设备间交互 首先 我会简要介绍 Wi-Fi Aware 为后续内容奠定基础 接下来 我将深入探讨如何 在 App 中集成 Wi-Fi Aware

    然后 我将介绍如何使用 DeviceDiscoveryUI 和 AccessorySetupKit 框架 安全地发现和配对设备 配对完成后 我将讨论 设备如何使用 Network 框架 建立 Wi-Fi Aware 连接 连接建立后 我将探讨如何监控 和优化 Wi-Fi Aware 连接的性能 最后 我将讨论一些重要的后续步骤 让我们从概述开始 Wi-Fi Aware 支持设备间的直接通信 与依赖路由器或中央服务器 的传统模式不同 这是真正的点对点连接

    这些连接是动态且按需的 设备可以在运行时相互查找 并建立安全连接 非常适合本地临时场景 比如文件共享 或设置配件 Wi-Fi Aware 可与常规 Wi-Fi 并行运行 这意味着设备在 使用 Wi-Fi Aware 的同时 仍能保持与互联网和本地网络的连接 Wi-Fi Aware 是一个全球标准 由 Wi-Fi 联盟维护 具备跨平台和互操作性 可被任何设备制造商采用 借助 Wi-Fi Aware 你可以解锁全新体验 让 App 无缝发现并连接附近设备 例如:媒体流、高速文件传输、 配件控制、屏幕共享 如果需要 你可以同时运行这些任务

    我们推出了 Wi-Fi Aware 这是一个全新的框架 可在 iPhone 和 iPad 上实现这些体验 借助 Wi-Fi Aware 框架 你的 App 可以连接到其他 Apple 设备、 第三方设备 甚至配件

    使用 Wi-Fi Aware 时 连接在 Wi-Fi 层进行完整身份验证 和加密 可以支持高吞吐量和低延迟 并与附近其他设备的连接共存

    要使用 Wi-Fi Aware 你的 App 只需 处理两个高级流程 第一个流程是配对设备

    配对是一次性设置过程 用于建立信任 并促进安全通信 第二个流程是连接已配对的设备 系统会自动保护设备之间的连接 包括密钥交换和链路加密 因此你完全不需要管理安全协议 配对成功后 只要设备在附近并正在运行 App App 就可以安全地重新连接 重新连接设备变得 顺畅、快速且安全 现在 我们来看看如何设置 App 以使用 Wi-Fi Aware 我们将首先讨论 Wi-Fi Aware 的核心概念:服务 服务用于发现并连接设备 可以将服务视为 App 提供或从其他设备使用的 特定功能 在 App 中声明服务之前 让我们先了解服务的一些关键约定

    服务通过名称标识

    服务名称必须唯一 仅包含字母、数字和短横线 长度不超过 15 个字符

    完整的服务名称由两部分组成

    唯一名称 + 协议 对于使用 TCP 的服务 协议是 tcp 对于使用任何其他协议的服务 则是 udp

    为避免与其他 App 的服务名冲突 你可以向 IANA 注册服务名称

    接下来谈谈服务角色 对于给定服务 Wi-Fi Aware 支持两种角色 第一种是发布者 App 托管服务并充当服务器 侦听来自其他设备的传入连接

    第二种是订阅者 App 使用服务并充当客户端 浏览以发现其他可连接设备

    根据场景需求 App 可以同时充当发布者 和订阅者

    App 的 Info.plist 指定 要使用的服务 为此 请添加 WiFiAwareServices 键 这是一个字典 其中的键是服务名称 对应的值是服务的配置 在这个示例中 App 声明了两个服务: 文件服务和无人机服务

    每个服务都有一个配置属性字典

    要使服务可发布 请添加 Publishable 键 要使服务可订阅 请添加 Subscribable 键 在这里 文件服务被声明为 即可发布又可订阅 这在构建 App 到 App 用例时很常见

    相比之下 无人机服务仅可订阅 这在开发与配件通信的 App 时 很常见 请记住 App 只能发布 或订阅已在 Info.plist 中 声明的服务 现在 让我们通过代码看看如何访问 已在 Info.plist 中声明的 设备功能和服务

    在 App 使用 Wi-Fi Aware 之前 它应该首先检查设备是否支持 这可以通过检查 WACapabilities 的 supportedFeatures 属性来完成

    Info.plist 中定义的可发布服务 通过 WAPublishableService 提供 这个示例中定义了 静态属性 fileService 以方便后续访问这个服务 可订阅服务通过 WASubscribableService 访问 为方便起见 定义了两个静态属性 分别引用 fileService 和 droneService 以供之后使用

    现在你已经了解如何 将 Wi-Fi Aware 服务添加到 App 中 接下来我们讨论 如何配对 Wi-Fi Aware 设备 我们首先来讨论 从 App 用户的视角看 配对流程是什么样的 如前所述 在使用 Wi-Fi Aware 设备之前 App 会与设备配对 App 可以通过调用 API 来显示系统配对 UI 从而触发配对流程 对于 App 用户来说 配对过程非常简单

    首先 系统会提示用户 从匹配 App 提供的参数的 附近设备列表中选择一个设备

    然后 用户将授权配对 只需输入对方设备提供的 PIN 码

    最后 系统将完成配对 并在配对成功时通知用户 这将使设备可供 App 使用 在这之后 App 就可以按需 连接到这个设备 无需再次调用配对流程

    有两个系统框架可用于配对设备: DeviceDiscoveryUI 和 AccessorySetupKit

    DeviceDiscoveryUI 用于在 App 之间 以及从 App 到另一个设备建立连接 它支持与 Apple 和第三方设备配对 AccessorySetupKit 供配件制造商 快速接入配件 它是推荐硬件配件制造商使用的框架 让我们更详细地讨论 DeviceDiscoveryUI

    使用 DeviceDiscoveryUI 的用户 首先会轻点 App UI 中的按钮 来添加或选择设备 在发布者端 App 将调用 API 来显示广播器 UI 如左图所示 在另一台设备上 App 将调用 API 来显示设备选择器 UI 如右图所示

    浏览器 UI 将查找与你的 Wi-Fi Aware 服务匹配的附近设备 并展示给用户选择 如果用户选择未配对的设备 系统将自动启动配对流程

    当需要配对时 传入请求 和 PIN 码会显示在发布者端 并在订阅者端输入

    用户确认 PIN 码后 系统将设备配对 完成后 App 即可连接到另一台设备

    现在我们已经了解 DeviceDiscoveryUI 流程 我们来看一些代码

    在侦听器端 App 将创建 DevicePairingView 并传入要广播的服务

    在浏览器端 App 将创建 DevicePickerView 并传入要发现的服务 当用户轻点发现的设备时 DeviceDiscoveryUI 将向 App 呈现 可连接的网络端点 如果需要 DeviceDiscoveryUI 将在提供网络端点之前 执行配对

    如果你是配件制造商 那么 AccessorySetupKit 是与 App 配对的推荐方法 如果你的配件支持多种传输方式 例如蓝牙和 Wi-Fi Aware AccessorySetupKit 将同时配对 和设置这两种方式 我们来看看使用 AccessorySetupKit 和 Wi-Fi Aware 时的配对流程 使用 AccessorySetupKit 的用户 首先会轻点 App UI 中的按钮 以添加或选择设备 App 将填写发现描述符 指定服务和用于发现设备的过滤条件 然后它显示 AccessorySetupKit UI

    AccessorySetupKit 将查找 与服务和发现过滤条件匹配的 附近设备 并显示在 UI 中 然后 用户选择想要设置的设备

    在设置过程中 用户输入 PIN 码 以确认 Wi-Fi Aware 配对 PIN 码显示在发布者端 并在订阅者端输入

    然后 系统代表 App 执行配对

    现在我们已经了解 AccessorySetupKit 流程 我们来看一下代码 要将 Wi-Fi Aware 设备 与 AccessorySetupKit 配对 首先创建 ASDiscoveryDescriptor 在其中提供服务名称 和设备属性过滤条件 比如型号和供应商 然后通过创建 ASAccessorySession 并调用 showPicker 来显示 AccessorySetupKit UI 系统将完成发现和配对过程 配对完成后 将返回一个新的 ASAccessory 代表新配对的设备 它包含 ASAccessoryWiFiAwarePairedDeviceID 即配对设备的 ID App 可以使用这个 ID 通过 Wi-Fi Aware 框架 查找相应的 WAPairedDevice 设备可用于 通过 Network 框架发起连接

    要进一步了解 AccessorySetupKit 请观看 WWDC24 讲座 “了解 AccessorySetupKit” 介绍完如何配对设备后 我们来探索 App 如何访问 配对设备列表

    Wi-Fi Aware 将配对设备 表示为 WAPairedDevice 结构体 你可以使用 WAPairedDevice 上的 allDevices API 获取设备列表 你可以访问设备属性 如供应商 和型号名称 这些属性在配对过程中获取

    API 可以获取所有设备或 与提供的过滤条件匹配的设备

    例如 要获取供应商名称为 “Example Inc”的所有设备 请创建这里所展示的过滤条件

    App 的配对设备列表 可能会随时变化 例如 如果某个设备从设置中移除 App 可以侦听这些变化 并相应地更新 UI 和其他状态 这个框架提供了一种简单的实现方法 即通过 WaPairedDevice.allDevices 提供异步序列

    请注意 这里讨论的 API 会提供 App 可用的所有配对设备 无论它们当前是否可连接 第一个流程:配对 就介绍到这里 现在让我们关注第二个流程 App 与配对设备建立连接 在查看代码之前 让我们先了解 建立 Wi-Fi Aware 连接的大概流程 建立连接需要两台设备 一台设备发布服务 并侦听来自特定配对设备的连接

    另一台设备订阅服务 并浏览要连接的特定配对设备 为了节省电量 侦听和浏览 应限于用例所需的时长

    浏览器发现 你提供的服务和设备组合后 它将向 App 提供 可连接的网络端点 接下来 App 将检查端点 并与一个或多个端点建立连接 侦听器收到连接请求 并转发到 App 从而完成连接 此时 可以开始交换数据

    让我们来探索如何使用 App 中的 Network 框架 建立 Wi-Fi Aware 连接 在发布或订阅之前 App 需要选择感兴趣的配对设备 在这里的示例中 发布者创建一个过滤条件 用于筛选 名称以“My Device”开头的设备

    同样 订阅者过滤条件会挑选 供应商名称以“Example Inc”开头 的设备

    现在所需的参数已经就位 可以使用 Network 框架 启动侦听器和浏览器实例

    要构造 NetworkListener 请提供之前创建的服务对象 和设备过滤条件

    以这种方式创建的 NetworkListener 将只接受指定服务 以及与所提供的过滤条件匹配的 配对设备的连接

    除了 Wi-Fi Aware 参数外 App 还可以配置网络参数 并设置状态更新处理程序

    同样 NetworkBrowser 使用 之前创建的服务 和设备过滤条件创建

    这个浏览器将仅发现正在广播服务 且匹配过滤条件的配对设备

    成功创建侦听器和浏览器后 App 现在可以建立连接了 要开始在侦听器上接受传入连接 请对侦听器对象调用 run 操作

    启动侦听器后 其他设备即可发现 App

    要开始在浏览器上订阅服务 请对浏览器对象调用 run 操作

    启动浏览器会发现 提供这个服务的附近设备 浏览器会将已发现设备的列表 作为网络端点返回给 App

    然后 App 将检查已发现的端点 并确定是否存在感兴趣的端点

    使用 NetworkConnection API 启动与所需端点的连接

    连接建立后 侦听器将收到 新连接的回调并提供给 App App 现在可以使用 Network 框架 API 交换数据 为了节省无线连接资源和电量 请在所有必需的连接建立后 停止侦听器和浏览器

    我已介绍了建立 Wi-Fi Aware 连接 需要的所有步骤 接下来 我们来看如何优化连接性能 以获得最佳的 App 体验 优化性能需要平衡吞吐量、 延迟和功耗 在大多数情况下 系统会应用合理的默认值 但如果需要 App 可以调整某些连接参数

    一个是 Wi-Fi Aware 性能模式 它影响 Wi-Fi Aware 占空比

    另一个是流量服务类 它设置数据包传输的优先级 默认设置为“尽力而为” 但可以设置为“交互式视频” 或“交互式语音”以降低延迟

    如果你的数据优先级较低 利用“后台”服务类 来避免干扰其他流量

    通常 “批量”性能模式 与“尽力而为” 或“后台”服务类搭配使用 这种组合可以降低功耗 但会增加延迟

    另一方面“实时”与“交互式语音” 或“交互式视频”服务类搭配使用 这种组合延迟低 但功耗较高 在决定使用实时模式之前 请仔细考虑 你的用例是否需要它 因为它会加速电池电量消耗 除了提供可调的连接性能设置外 Wi-Fi Aware 框架还为每个网络连接 提供按需性能报告 性能报告包括这些指标:信号强度、 吞吐量和延迟 你可以参考这些反馈来调整 App 的性能 由于 Wi-Fi 连接强度、环境干扰 和设备性能 在现实世界中可能会有很大差异 请务必测试 App 在繁忙的 Wi-Fi 环境中的性能 此外 在 App 中整合 来自 TCP 等网络协议的连接反馈

    让我们深入研究一些代码 了解如何运用可调参数 如前所述 Wi-Fi Aware 连接 默认使用“批量”性能模式 和“尽力而为”服务类 如果性能分析表明你的用例 更适合其他配置 你可以设置发布者的参数 和订阅者的连接实例 以配置性能模式和服务类

    在这个示例中 发布者设置为使用实时性能模式 和交互式视频流量服务类

    在订阅者端 App 创建的 NetworkConnection 对象 也需要相同的配置

    要监控 App 的 Wi-Fi Aware 连接 访问当前路径并阅读性能报告 然后 App 可以根据报告采取行动 并优化整体用户体验

    现在我已经介绍了使用 Wi-Fi Aware 构建 App 的所有相关内容 我已经迫不及待想要一睹你的成果 但在结束之前 让我来介绍一些重要的后续步骤 如果你是硬件制造商 正在开发支持 Wi-Fi Aware 的设备 请参考《配件设计指南》 以确保与 Apple 设备的互操作性 指南文档可在 Apple 开发者网站上找到 遵循指南的做法可使你的设备 可靠地发现并配对 Apple 设备 保持强大的安全性 并最大限度地提高连接性能 这份指南是帮助你打造 一致且优质的 Wi-Fi Aware 体验 的最佳资源

    我们建议你查看 Wi-Fi Aware 框架文档 了解更多详细信息 我们还提供了一个示例 App 展示了如何使用 Wi-Fi Aware 构建 App 以及不同的性能配置 如何影响我们的行为

    最后 如果你正在构建 Wi-Fi Aware 设备 《互作性指南》可以帮助你 为用户打造最佳体验

    感谢观看

    • 6:57 - Access capabilities and services

      import WiFiAware
      
      // Check if Wi-Fi Aware is supported on your device
      guard WACapabilities.supportedFeatures.contains(.wifiAware) else { return }
      
      // Publishable service declared in Info.plist
      extension WAPublishableService {
          public static var fileService: WAPublishableService {
              allServices["_file-service._tcp"]!
          }
      }
      
      // Subscribable services declared in Info.plist
      extension WASubscribableService {
          public static var fileService: WASubscribableService {
              allServices["_file-service._tcp"]!
          }
          public static var droneService: WASubscribableService {
              allServices["_drone-service._udp"]!
          }
      }
    • 10:33 - Pair with DeviceDiscoveryUI

      import DeviceDiscoveryUI
      import WiFiAware
      import SwiftUI
      
      // Listener (Publisher) Device
      // Invoke Listener UI
      DevicePairingView(.wifiAware(.connecting(to: .fileService, from: .selected([])))) {
          // Provide a view to display to user before launching System UI
      } fallback: {
          // Provide a view in case of error
      }
      
      // Browser (Subscriber) Device
      // Invoke Browser UI
      DevicePicker(.wifiAware(.connecting(to: .selected([]), from: .fileService))) { endpoint in
          // Process the paired network endpoint
      } label: {
          // Provide a view to display to user before launching System UI
      } fallback: {
          // Provide a view in case of error
      }
    • 12:29 - Pair with AccessorySetupKit

      import AccessorySetupKit
      
      // Configure ASDiscoveryDescriptor (Subscriber)
      let descriptor = ASDiscoveryDescriptor()
      descriptor.wifiAwareServiceName = "_drone-service._udp"
      descriptor.wifiAwareModelNameMatch = .init(string: "Example Model")
      descriptor.wifiAwareVendorNameMatch = .init(string: "Example Inc", compareOptions: .literal)
      let item = ASPickerDisplayItem(name: "My Drone",
                                     productImage: UIImage(named: "DroneProductImage")!,
                                     descriptor: descriptor)
      
      // Create and activate session
      let session = ASAccessorySession()
      session.activate(on: sessionQueue) { event in
          // Closure will execute when device is added with event: .accessoryAdded
          // ASAccessoryWiFiAwarePairedDeviceID can be used to lookup a WAPairedDevice
      }
      // Present Picker UI
      session.showPicker(for: [item]) { error in
          // Handle error
      }
    • 13:51 - Access paired devices

      import Foundation
      import WiFiAware
      
      // WAPairedDevice
      var device: WAPairedDevice // Get using WAPairedDevice.allDevices
      
      // Access WAPairedDevice properties
      let pairingName = device.pairingInfo?.pairingName
      let vendorName = device.pairingInfo?.vendorName
      let modelName = device.pairingInfo?.modelName
      
      // Create a filter to select devices of interest
      let filter = #Predicate<WAPairedDevice> {
          $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false
      }
      
      // Get all paired devices, matching the filter, at the current moment
      // A new snapshot of all paired devices each time a device is added, changed, or removed
      for try await devices in WAPairedDevice.allDevices(matching: filter) {
          // Process new snapshot of all paired devices
      }
    • 16:23 - Filter paired devices

      import Foundation
      import WiFiAware
      
      // Listener (Publisher) Device
      // Specify the paired devices of interest for the use case
      let deviceFilter = #Predicate<WAPairedDevice> {
          $0.name?.starts(with: "My Device") ?? false
      }
      
      // Browser (Subscriber) Device
      // Specify the paired devices of interest for the use case
      let deviceFilter = #Predicate<WAPairedDevice> {
          $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false
      }
    • 16:54 - Create listener and browser

      import WiFiAware
      import Network
      
      // Listener (Publisher) Device: Construct a NetworkListener
      let listener = try NetworkListener(for:
              .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))),
          using: .parameters {
              TLS()
          })
          .onStateUpdate { listener, state in
              // Process state update
          }
      
      // Browser (Subscriber) Device: Construct a NetworkBrowser
      let browser = NetworkBrowser(for:
              .wifiAware(.connecting(to: .matching(deviceFilter), from: .fileService))
          )
          .onStateUpdate { browser, state in
              // Process state update
          }
    • 17:44 - Establish a connection

      // Listener (Publisher) Device: Start NetworkListener
      try await listener.run { connection in  // Radio resources in use
          // Closure executes for each incoming connection
          connection.onStateUpdate { connection, state in
              // Process state update
          }
      }
      
      // Browser (Subscriber) Device: Start NetworkBrowser
      let endpoint = try await browser.run { waEndpoints in // Radio resources in use
              // Review endpoints, decide whether to return or skip
              if let endpoint = self.endpoint(in: waEndpoints) { return .finish(endpoint) }
              else { return .continue }
          }
      // Create the connection
      let connection = NetworkConnection(to: endpoint, using: .parameters {
              TLS()
          })
          .onStateUpdate { connection, state in
              // Process state update
          }
    • 21:11 - Tune performance

      // Listener (Publisher) Device
      // Configure .realtime + .interactiveVideo on NetworkListener
      let listener = try NetworkListener(for:
              .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))),
          using: .parameters {
              TLS()
          }
          .wifiAware { $0.performanceMode = .realtime }
          .serviceClass(.interactiveVideo))
      
      // Browser (Subscriber) Device
      // Configure .realtime + .interactiveVideo on NetworkConnection
      let connection = NetworkConnection(to: endpoint, using: .parameters {
              TLS()
          }
          .wifiAware { $0.performanceMode = .realtime }
          .serviceClass(.interactiveVideo))
      
      // Listener (Publisher) Device & Browser (Subscriber) Device
      // Read performance report
      let performanceReport = try await connection.currentPath?.wifiAware?.performance
    • 0:00 - 简介
    • 了解如何在 iOS 和 iPadOS 上使用 Wi-Fi Aware 来建立低延迟、高吞吐量的点对点网络连接。

    • 1:01 - 概览
    • Wi-Fi Aware 是一种无需路由器或中央服务器即可实现设备间直接通信的标准。它与常规 Wi-Fi 连接协同运行,使设备能够安全、动态地执行发现与连接,从而实现文件共享、媒体流式传输、配件控制和屏幕共享等短暂的本地体验。 Wi-Fi Aware 具有跨平台和互操作性的特点,连接经过完整身份验证和加密。App 可以定义服务,指定发布者或订阅者角色 (或两者兼有),以及进行设备配对。配对的两个设备可在距离较近时实现无缝快速的重新连接。

    • 7:46 - 配对
    • 设备可以使用 DeviceDiscoveryUI 框架或 AccessorySetupKit 框架进行配对。 DeviceDiscoveryUI 适用于 App 间配对,同时支持 Apple 设备和第三方设备。AccessorySetupKit 适用于 App 与配件的配对。 设备配对后,这两个框架都支持 App 访问和管理已配对设备的列表、检索设备的属性并侦听配对状态的变化,从而让 App 能相应更新自身用户界面和状态。

    • 15:05 - 连接
    • 配对后,设备可以相互连接。一个设备充当发布者角色,另一个设备充当订阅者角色。 发布者会筛选特定设备并开始侦听,而订阅者则会筛选并开始浏览。订阅者找到发布者后,会向 App 提供终结点,然后 App 会建立连接。 侦听器会接收并转发这些连接请求,从而实现数据交换。

    • 19:01 - 优化
    • 为了优化 App 的连接性能,Wi-Fi Aware 框架允许开发者调整某些参数。这一框架提供两种主要的性能模式:批量模式和实时模式。批量模式节能,但延迟较高;实时模式延迟较低,但功耗较高。 开发者还可以设置流量服务类 (包括“尽力而为”、“交互式视频”或“交互式语音”选项) 优先处理数据包传输,以及设置后台服务类。 这一框架提供按需性能报告,其中包含信号强度、吞吐量和延迟等指标,以便开发者根据实际测试和环境因素来优化 App 的性能。

    • 22:26 - 准则
    • 开发 Wi-Fi Aware 设备的硬件制造商可以参考开发者网站上的《Apple 配件设计准则》,以实现互操作性、安全性和性能优化。这份指南以及相应的框架文档和示例 App 提供了打造高质量用户体验所需的重要资源。

Developer Footer

  • 视频
  • WWDC25
  • 借助 Wi-Fi Aware 增强设备连接性能
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载 (英文)
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    获取 Apple Developer App。
    版权所有 © 2025 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则