This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

iOS 能力

编辑页面

了解 EAS Build 支持的内置 iOS 能力,以及如何启用或禁用它们。


当你对 iOS entitlements 进行更改时,在生成生产构建之前,这些更改需要先远程更新到 Apple 的服务器上。EAS Build 会在你运行 eas build 时,自动将 Apple Developer Console 上的 capabilities 与你的本地 entitlements 配置同步。Capabilities 是 Apple 提供的网络服务,可以把它们理解为 AWS 或 Firebase 这类服务。

权限

在 Expo 应用中,权限会从 introspected app config 中读取。要编辑这些权限,请查看 app config 文件中的 ios.entitlements 字段。你可以在项目中运行 npx expo config --type introspect 来查看 introspected config,然后在结果中查找 ios.entitlements 对象。

在一个现有的 React Native 项目中,权限会从你的 ios/**/*.entitlements 文件中读取。

启用

如果 entitlements 文件中存在受支持的 entitlement,那么运行 eas build 时会在 Apple Developer Console 上启用它。如果该 capability 已经启用,EAS Build 会跳过它。

禁用

如果某个 capability 已在远程为你的应用启用,但原生 entitlements 文件中不存在它,那么运行 eas build 时会自动将其禁用。

支持的能力

EAS Build 只会启用它内置支持的能力,任何不受支持的权限都必须通过 Apple 开发者控制台 手动启用。

支持能力权限字符串
访问 Wi-Fi 信息com.apple.developer.networking.wifi-info
App Attestcom.apple.developer.devicecheck.appattest-environment
App Groupscom.apple.security.application-groups
Apple Pay Later Merchandisingcom.apple.developer.pay-later-merchandising
Apple Pay 支付处理com.apple.developer.in-app-payments
关联域名com.apple.developer.associated-domains
AutoFill Credential Providercom.apple.developer.authentication-services.autofill-credential-provider
ClassKitcom.apple.developer.ClassKit-environment
与驱动程序通信com.apple.developer.driverkit.communicates-with-drivers
通知式通信com.apple.developer.usernotifications.communication
自定义网络协议com.apple.developer.networking.custom-protocol
数据保护com.apple.developer.default-data-protection
DriverKit 允许第三方 UserClientscom.apple.developer.driverkit.allow-third-party-userclients
DriverKit Audio 家族(开发版)com.apple.developer.driverkit.family.audio
DriverKit HID Device 家族(开发版)com.apple.developer.driverkit.family.hid.device
DriverKit HID EventService 家族(开发版)com.apple.developer.driverkit.family.hid.eventservice
DriverKit Networking 家族(开发版)com.apple.developer.driverkit.family.networking
DriverKit SCSIController 家族(开发版)com.apple.developer.driverkit.family.scsicontroller
DriverKit Serial 家族(开发版)com.apple.developer.driverkit.family.serial
DriverKit Transport HID(开发版)com.apple.developer.driverkit.transport.hid
DriverKit USB Transport(开发版)com.apple.developer.driverkit.transport.usb
用于开发的 DriverKitcom.apple.developer.driverkit
扩展虚拟地址空间com.apple.developer.kernel.extended-virtual-addressing
家庭控制com.apple.developer.family-controls
FileProvider 测试模式com.apple.developer.fileprovider.testing-mode
字体com.apple.developer.user-fonts
群组活动com.apple.developer.group-session
HealthKitcom.apple.developer.healthkit
HomeKitcom.apple.developer.homekit
热点com.apple.developer.networking.HotspotConfiguration
增加内存限制com.apple.developer.kernel.increased-memory-limit
应用间音频inter-app-audio
日志建议com.apple.developer.journal.allow
低延迟 HLScom.apple.developer.low-latency-streaming
MDM 管理的关联域名com.apple.developer.associated-domains.mdm-managed
托管应用安装 UIcom.apple.developer.managed-app-distribution.install-ui
地图com.apple.developer.maps
Matter 允许设置负载com.apple.developer.matter.allow-setup-payload
媒体设备发现com.apple.developer.media-device-discovery-extension
Messages 协作com.apple.developer.shared-with-you.collaboration
多路径com.apple.developer.networking.multipath
NFC 标签读取com.apple.developer.nfc.readersession.formats
网络扩展com.apple.developer.networking.networkextension
5G 网络切片com.apple.developer.networking.slicing.appcategory or com.apple.developer.networking.slicing.trafficcategory
App Clip 扩展的按需安装能力com.apple.developer.on-demand-install-capable
个人 VPNcom.apple.developer.networking.vpn.api
推送通知aps-environment
按住说话com.apple.developer.push-to-talk
重新校准估算com.apple.developer.healthkit.recalibrate-estimates
敏感内容分析com.apple.developer.sensitivecontentanalysis.client
浅水与压力com.apple.developer.submerged-shallow-depth-and-pressure
与你共享com.apple.developer.shared-with-you
使用 Apple 登录com.apple.developer.applesignin
SiriKitcom.apple.developer.siri
系统扩展com.apple.developer.system-extension.install
在 iPhone 上轻点支付com.apple.developer.proximity-reader.payment.acceptance
在 iPhone 上轻点出示 ID(仅显示)com.apple.developer.proximity-reader.identity.display
TV 服务com.apple.developer.user-management
时间敏感通知com.apple.developer.usernotifications.time-sensitive
Walletcom.apple.developer.pass-type-identifiers
WeatherKitcom.apple.developer.weatherkit
无线配件配置com.apple.external-accessory.wireless-configuration
iCloudcom.apple.developer.icloud-container-identifiers
HLS 插播预览未知

不受支持的能力要么不支持 iOS,要么没有对应的权限值。以下是所有 Apple 官方能力 的列表。

广播推送通知

Apple 的“广播”选项位于“推送通知”功能中,并没有单独的权利要求。要启用它,请在您的应用配置中将 ios.usesBroadcastPushNotifications 设置为 true

app.json
{ "expo": { "ios": { "usesBroadcastPushNotifications": true } } }

EAS Build 仅会在启用“推送通知”功能时设置“广播”选项,因此您的权利要求中也需要包含 aps-environment。Apple 将广播推送通知限制为 iOS 18 及更高版本中的实时活动。

如果您仅在 Apple Developer Console 中启用“广播”,下一次运行 eas build 时会将“推送通知”功能重置为其默认选项,并关闭“广播”。随后,Apple 推送通知服务(APNs)会因 FeatureNotEnabled 错误拒绝您的频道管理请求。

能力标识符

商家 ID、App 组和 CloudKit 容器都可以自动注册并分配给你的应用。这些分配需要 Apple cookies 身份验证(在本地运行),因为官方的 App Store Connect API 不支持这些操作。

iOS 能力调试

你可以运行 EXPO_DEBUG=1 eas build 来获取有关能力同步的更详细日志。

如果你在使用此功能时遇到问题,可以通过环境变量 EXPO_NO_CAPABILITY_SYNC=1 将其禁用。

要查看当前已启用的所有能力,请访问 Apple Developer Console,并找到与你的应用匹配的 bundle identifier;如果你点击它,应该会看到当前所有已启用能力的列表。

手动设置

有两种方式可以手动启用 Apple 能力,这两种方式都需要重新生成任何现有的 Apple provisioning profiles。

Xcode

  1. 使用 xed ios 在 Xcode 中打开 ios 目录。如果你没有 ios 目录,请运行 npx expo prebuild -p ios 来生成一个。
  2. 然后按照 添加能力 中提到的步骤进行操作。

Apple Developer Console

第一步是在你的 ios/[app]/[app].entitlements 中添加相应的键值对(对于多目标应用,则添加到更具体的 entitlements 文件中)。你可以参考 支持的能力 来确定应添加哪些 entitlements 键。

  1. 登录 Apple Developer Console。点击“证书、标识符与配置文件”,然后进入“标识符”页面。
  2. 选择与你的应用 bundle identifier 匹配的 bundle identifier。
  3. 向下滚动并启用某项能力,某些能力可能需要额外设置。
  4. 滚动到顶部并点击“保存”。你会看到一个写着“修改应用能力”的对话框,点击“确认”继续。你需要重新生成任何使用此 bundle identifier 的 provisioning profiles,之后它们才会在构建已签名代码的生产 .ipa 时有效。

如果添加能力的过程没有正确完成,那么你的 iOS 原生构建将会失败,并出现类似如下的错误:

❌ error: Provisioning profile "*[expo] app.bacon.hello AppStore ..." doesn't support the Associated Domains capability. ❌ error: Provisioning profile "*[expo] app.bacon.hello AppStore ..." doesn't include the com.apple.developer.associated-domains entitlement.