browserenginekit

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

BrowserEngineKit

BrowserEngineKit

Framework for building web browsers with alternative (non-WebKit) rendering engines on iOS and iPadOS. Provides process isolation, XPC communication, capability management, and system integration for browser apps that implement their own HTML/CSS/JavaScript engine. Targets Swift 6.3 / iOS 26+.
BrowserEngineKit is a specialized framework. Alternative browser engines are currently supported for distribution in the EU. Japan requires Memory Integrity Enforcement (MIE) for alternative browser engine distribution. Development and testing can occur anywhere. The companion frameworks BrowserEngineCore (low-level primitives) and BrowserKit (eligibility checks, data transfer) support the overall browser engine workflow.
用于在iOS和iPadOS上构建使用替代(非WebKit)渲染引擎的网页浏览器的框架。为实现了自研HTML/CSS/JavaScript引擎的浏览器应用提供进程隔离、XPC通信、能力管理和系统集成功能。适配Swift 6.3 / iOS 26及以上版本。
BrowserEngineKit是一个专项框架。替代浏览器引擎目前仅支持在欧盟地区分发。日本地区分发替代浏览器引擎需要满足内存完整性强制(MIE)要求。开发和测试可以在任意地区进行。配套框架BrowserEngineCore(底层原语)和BrowserKit(资格检查、数据传输)为完整的浏览器引擎工作流提供支持。

Contents

目录

Overview and Eligibility

概述与资格检查

Eligibility Checking

资格检查

Use
BEAvailability
from the BrowserKit framework to check whether the device is eligible for alternative browser engines:
swift
import BrowserKit

BEAvailability.isEligible(for: .webBrowser) { eligible, error in
    if eligible {
        // Device supports alternative browser engines
    } else {
        // Fall back or show explanation
    }
}
Eligibility depends on the device region and OS version. Do not hard-code region checks; rely on the system API.
使用BrowserKit框架中的
BEAvailability
检查设备是否支持使用替代浏览器引擎:
swift
import BrowserKit

BEAvailability.isEligible(for: .webBrowser) { eligible, error in
    if eligible {
        // 设备支持替代浏览器引擎
    } else {
        // 降级处理或展示说明
    }
}
资格状态取决于设备地区和操作系统版本,不要硬编码地区检查逻辑,请依赖系统API的返回结果。

Related Frameworks

相关框架

FrameworkPurpose
BrowserEngineKitProcess management, extensions, text/view integration
BrowserEngineCoreLow-level primitives: kernel events, JIT tag, audio session
BrowserKitEligibility checks, browser data import/export
框架用途
BrowserEngineKit进程管理、扩展功能、文本/视图集成
BrowserEngineCore底层原语:内核事件、JIT标记、音频会话
BrowserKit资格检查、浏览器数据导入/导出

Entitlements

权限配置

Browser App (Host)

浏览器应用(宿主端)

The host app requires two entitlements:
EntitlementPurpose
com.apple.developer.web-browser
Enables default-browser candidacy
com.apple.developer.web-browser-engine.host
Enables alternative engine extensions
Both must be requested from Apple. The request process varies by region.
宿主应用需要两项权限:
权限用途
com.apple.developer.web-browser
获得默认浏览器候选资格
com.apple.developer.web-browser-engine.host
启用替代引擎扩展能力
两项权限都需要向Apple申请,申请流程随地区不同有所差异。

Extension Entitlements

扩展权限

Each extension target requires its type-specific entitlement set to
true
:
Extension TypeEntitlement
Web content
com.apple.developer.web-browser-engine.webcontent
Networking
com.apple.developer.web-browser-engine.networking
Rendering
com.apple.developer.web-browser-engine.rendering
每个扩展目标都需要将对应类型的专属权限设置为
true
扩展类型权限
网页内容
com.apple.developer.web-browser-engine.webcontent
网络
com.apple.developer.web-browser-engine.networking
渲染
com.apple.developer.web-browser-engine.rendering

Optional Entitlements

可选权限

EntitlementExtensionPurpose
com.apple.security.cs.allow-jit
Web contentJIT compilation of scripts
com.apple.developer.kernel.extended-virtual-addressing
Web contentRequired alongside JIT
com.apple.developer.memory.transfer_send
RenderingSend memory attribution
com.apple.developer.memory.transfer_accept
Web contentAccept memory attribution
com.apple.developer.web-browser-engine.restrict.notifyd
Web contentRestrict notification daemon access
权限适用扩展用途
com.apple.security.cs.allow-jit
网页内容脚本JIT编译
com.apple.developer.kernel.extended-virtual-addressing
网页内容JIT功能的必备配套权限
com.apple.developer.memory.transfer_send
渲染发送内存归因信息
com.apple.developer.memory.transfer_accept
网页内容接收内存归因信息
com.apple.developer.web-browser-engine.restrict.notifyd
网页内容限制通知守护进程访问权限

Embedded Browser Engine (Non-Browser Apps)

嵌入式浏览器引擎(非浏览器应用)

Apps that are not browsers but embed an alternative engine for in-app browsing use different entitlements:
EntitlementPurpose
com.apple.developer.embedded-web-browser-engine
Enable embedded engine
com.apple.developer.embedded-web-browser-engine.engine-association
Declare engine ownership
Embedded engines use
arm64
only (not
arm64e
), cannot include browser extensions, and cannot use JIT compilation.
非浏览器类应用如果嵌入替代引擎用于应用内浏览,需要使用不同的权限:
权限用途
com.apple.developer.embedded-web-browser-engine
启用嵌入式引擎
com.apple.developer.embedded-web-browser-engine.engine-association
声明引擎所有权
嵌入式引擎仅支持
arm64
架构(不支持
arm64e
),不能包含浏览器扩展,也不能使用JIT编译功能。

Japan-Specific Requirements

日本地区专属要求

Browser apps distributed in Japan must enable hardware memory tagging via
com.apple.security.hardened-process.checked-allocations
. Apple strongly recommends enabling this in the EU as well.
在日本地区分发的浏览器应用必须通过
com.apple.security.hardened-process.checked-allocations
启用硬件内存标记功能,Apple强烈建议欧盟地区的应用也启用该功能。

Architecture

架构设计

A browser built with BrowserEngineKit consists of four components running in separate processes:
Host App (UI, coordination)
  |
  |-- XPC --> Web Content Extension (HTML parsing, JS, DOM)
  |-- XPC --> Networking Extension (URLSession, sockets)
  |-- XPC --> Rendering Extension (Metal, GPU, media)
The host app launches and manages all extensions. Extensions cannot launch other extensions. Extensions communicate with each other through anonymous XPC endpoints brokered by the host app.
基于BrowserEngineKit构建的浏览器由四个运行在独立进程中的组件组成:
宿主应用(UI、协调逻辑)
  |
  |-- XPC --> 网页内容扩展(HTML解析、JS、DOM)
  |-- XPC --> 网络扩展(URLSession、套接字)
  |-- XPC --> 渲染扩展(Metal、GPU、媒体)
宿主应用负责启动和管理所有扩展,扩展不能启动其他扩展。扩展之间通过宿主应用代理的匿名XPC端点进行通信。

Bootstrap Sequence

启动序列

  1. Host launches web content, networking, and rendering extensions
  2. Host creates XPC connections to each extension
  3. Host requests anonymous XPC endpoints from networking and rendering
  4. Host sends both endpoints to the web content extension via a bootstrap message
  5. Web content extension connects directly to networking and rendering
This architecture follows the principle of least privilege: the web content extension works with untrusted data but has no direct OS resource access.
  1. 宿主启动网页内容、网络和渲染扩展
  2. 宿主创建与每个扩展的XPC连接
  3. 宿主向网络和渲染扩展请求匿名XPC端点
  4. 宿主通过启动消息将两个端点发送给网页内容扩展
  5. 网页内容扩展直接连接到网络和渲染扩展
该架构遵循最小权限原则:网页内容扩展处理不受信任的数据,但没有直接访问操作系统资源的权限。

Process Management

进程管理

Launching Extensions

启动扩展

Each extension type has a corresponding process class in the host app:
swift
import BrowserEngineKit

// Web content (one per tab or iframe)
let contentProcess = try await WebContentProcess(
    bundleIdentifier: nil,
    onInterruption: {
        // Handle crash or OS interruption
    }
)

// Networking (typically one instance)
let networkProcess = try await NetworkingProcess(
    bundleIdentifier: nil,
    onInterruption: {
        // Handle interruption
    }
)

// Rendering / GPU (typically one instance)
let renderingProcess = try await RenderingProcess(
    bundleIdentifier: nil,
    onInterruption: {
        // Handle interruption
    }
)
Pass
nil
for
bundleIdentifier
to use the default extension target. The interruption handler fires if the extension crashes or is terminated by the OS.
每种扩展类型在宿主应用中都有对应的进程类:
swift
import BrowserEngineKit

// 网页内容(每个标签页或iframe对应一个实例)
let contentProcess = try await WebContentProcess(
    bundleIdentifier: nil,
    onInterruption: {
        // 处理崩溃或系统中断
    }
)

// 网络(通常仅需一个实例)
let networkProcess = try await NetworkingProcess(
    bundleIdentifier: nil,
    onInterruption: {
        // 处理中断
    }
)

// 渲染/GPU(通常仅需一个实例)
let renderingProcess = try await RenderingProcess(
    bundleIdentifier: nil,
    onInterruption: {
        // 处理中断
    }
)
bundleIdentifier
传入
nil
即可使用默认的扩展目标。如果扩展崩溃或被系统终止,中断处理函数会被触发。

Creating XPC Connections

创建XPC连接

swift
let connection = try contentProcess.makeLibXPCConnection()
// Use connection for inter-process messaging
Each process type provides
makeLibXPCConnection()
to create an
xpc_connection_t
for communication.
swift
let connection = try contentProcess.makeLibXPCConnection()
// 使用该连接进行进程间通信
每个进程类型都提供
makeLibXPCConnection()
方法,用于创建通信所需的
xpc_connection_t
实例。

Stopping Extensions

停止扩展

swift
contentProcess.invalidate()
After calling
invalidate()
, no further method calls on the process object are valid.
swift
contentProcess.invalidate()
调用
invalidate()
之后,该进程对象的所有方法调用都将无效。

Extension Types

扩展类型

Web Content Extension

网页内容扩展

Hosts the browser engine's HTML parser, CSS engine, JavaScript interpreter, and DOM. Subclass
WebContentExtension
to handle incoming XPC connections:
swift
import BrowserEngineKit

final class MyWebContentExtension: WebContentExtension {
    override func handle(xpcConnection: xpc_connection_t) {
        // Set up message handlers on the connection
    }
}
Configure via
WebContentExtensionConfiguration
in the extension's
EXAppExtensionAttributes
.
承载浏览器引擎的HTML解析器、CSS引擎、JavaScript解释器和DOM。继承
WebContentExtension
来处理传入的XPC连接:
swift
import BrowserEngineKit

final class MyWebContentExtension: WebContentExtension {
    override func handle(xpcConnection: xpc_connection_t) {
        // 在连接上设置消息处理逻辑
    }
}
在扩展的
EXAppExtensionAttributes
中通过
WebContentExtensionConfiguration
进行配置。

Networking Extension

网络扩展

Handles all network requests using
URLSession
or socket APIs. One instance serves all tabs:
swift
import BrowserEngineKit

final class MyNetworkingExtension: NetworkingExtension {
    override func handle(xpcConnection: xpc_connection_t) {
        // Handle network request messages
    }
}
Configure via
NetworkingExtensionConfiguration
.
使用
URLSession
或套接字API处理所有网络请求,一个实例为所有标签页提供服务:
swift
import BrowserEngineKit

final class MyNetworkingExtension: NetworkingExtension {
    override func handle(xpcConnection: xpc_connection_t) {
        // 处理网络请求消息
    }
}
通过
NetworkingExtensionConfiguration
进行配置。

Rendering Extension

渲染扩展

Accesses the GPU via Metal for video decoding, compositing, and complex rendering. One instance typically serves the entire browser:
swift
import BrowserEngineKit

final class MyRenderingExtension: RenderingExtension {
    override func handle(xpcConnection: xpc_connection_t) {
        // Handle rendering commands
    }
}
The rendering extension can enable optional features:
swift
// Enable CoreML in the rendering extension
extension.enableFeature(.coreML)
Configure via
RenderingExtensionConfiguration
.
通过Metal访问GPU,实现视频解码、合成和复杂渲染功能,一个实例通常为整个浏览器提供服务:
swift
import BrowserEngineKit

final class MyRenderingExtension: RenderingExtension {
    override func handle(xpcConnection: xpc_connection_t) {
        // 处理渲染命令
    }
}
渲染扩展可以启用可选功能:
swift
// 在渲染扩展中启用CoreML
extension.enableFeature(.coreML)
通过
RenderingExtensionConfiguration
进行配置。

Capabilities

能力授权

Grant capabilities to extensions so the OS schedules them appropriately:
swift
// Grant foreground priority to an extension
let grant = try contentProcess.grantCapability(.foreground)

// ... extension does foreground work ...

// Relinquish when done
grant.invalidate()
为扩展授予对应能力,以便系统合理调度资源:
swift
// 为扩展授予前台优先级
let grant = try contentProcess.grantCapability(.foreground)

// ... 扩展执行前台任务 ...

// 任务完成后释放权限
grant.invalidate()

Available Capabilities

可用能力

CapabilityUse Case
.foreground
Active tab rendering, visible content
.background
Background tasks, prefetching
.suspended
Minimal activity, pending cleanup
.mediaPlaybackAndCapture(environment:)
Audio/video playback, camera/mic capture
能力使用场景
.foreground
活跃标签页渲染、可见内容处理
.background
后台任务、预加载
.suspended
最小活动状态、待清理
.mediaPlaybackAndCapture(environment:)
音视频播放、摄像头/麦克风采集

Media Environment

媒体环境

For media capabilities, create a
MediaEnvironment
tied to a page URL. The environment supports
AVCaptureSession
for camera/mic access and is XPC-serializable for cross-process transport:
swift
let mediaEnv = MediaEnvironment(webPage: pageURL)
let grant = try contentProcess.grantCapability(
    .mediaPlaybackAndCapture(environment: mediaEnv)
)
try mediaEnv.activate()
let captureSession = try mediaEnv.makeCaptureSession()
对于媒体能力,需要创建绑定到页面URL的
MediaEnvironment
实例。该环境支持用于摄像头/麦克风访问的
AVCaptureSession
,并且支持XPC序列化,可用于跨进程传输:
swift
let mediaEnv = MediaEnvironment(webPage: pageURL)
let grant = try contentProcess.grantCapability(
    .mediaPlaybackAndCapture(environment: mediaEnv)
)
try mediaEnv.activate()
let captureSession = try mediaEnv.makeCaptureSession()

Visibility Propagation

可见性传播

Attach a visibility propagation interaction to browser views so extensions know when content is on screen. Both
WebContentProcess
and
RenderingProcess
provide
createVisibilityPropagationInteraction()
.
为浏览器视图添加可见性传播交互,以便扩展感知内容是否在屏幕上显示。
WebContentProcess
RenderingProcess
都提供
createVisibilityPropagationInteraction()
方法。

Layer Hosting and View Coordination

图层托管与视图协调

The rendering extension draws into a
LayerHierarchy
, whose content the host app displays via
LayerHierarchyHostingView
. Handles are passed over XPC. Use
LayerHierarchyHostingTransactionCoordinator
to synchronize layer updates atomically across processes.
See references/browserenginekit-patterns.md for detailed layer hosting examples and transaction coordination.
渲染扩展绘制内容到
LayerHierarchy
中,宿主应用通过
LayerHierarchyHostingView
展示其内容,句柄通过XPC传递。使用
LayerHierarchyHostingTransactionCoordinator
跨进程同步图层更新,保证原子性。
查看references/browserenginekit-patterns.md获取详细的图层托管示例和事务协调方法。

Text Interaction

文本交互

Adopt
BETextInput
on custom text views to integrate with UIKit's text system. This enables standard text selection, autocorrect, dictation, and keyboard interactions.
Key integration points:
  • asyncInputDelegate
    for communicating text changes to the system
  • handleKeyEntry(_:completionHandler:)
    for keyboard events
  • BETextInteraction
    for selection gestures, edit menus, and context menus
  • BEScrollView
    and
    BEScrollViewDelegate
    for custom scroll handling
See references/browserenginekit-patterns.md for detailed text interaction implementation.
在自定义文本视图上实现
BETextInput
协议,即可与UIKit的文本系统集成,实现标准的文本选择、自动更正、听写和键盘交互功能。
核心集成点:
  • asyncInputDelegate
    用于向系统传递文本变更信息
  • handleKeyEntry(_:completionHandler:)
    用于处理键盘事件
  • BETextInteraction
    用于实现选择手势、编辑菜单和上下文菜单
  • BEScrollView
    BEScrollViewDelegate
    用于自定义滚动处理
查看references/browserenginekit-patterns.md获取详细的文本交互实现方案。

Sandbox and Security

沙箱与安全

Restricted Sandbox

受限沙箱

After initialization, lock down content extensions using the restricted sandbox:
swift
// In the web content extension, after setup:
extension.applyRestrictedSandbox(revision: .revision2)
This removes access to resources the extension used during startup but no longer needs. Use the latest revision (
.revision2
) for the strongest restrictions.
初始化完成后,使用受限沙箱锁定内容扩展的权限:
swift
// 在网页内容扩展中,初始化完成后调用:
extension.applyRestrictedSandbox(revision: .revision2)
该操作会移除扩展启动阶段需要、但后续不再使用的资源访问权限。使用最新版本(
.revision2
)可以获得最严格的权限限制。

JIT Compilation

JIT编译

Web content extensions that JIT-compile JavaScript toggle memory between writable and executable states. Use the
BE_JIT_WRITE_PROTECT_TAG
from BrowserEngineCore:
swift
import BrowserEngineCore

// BE_JIT_WRITE_PROTECT_TAG is used with pthread_jit_write_protect_np
// to control JIT memory page permissions
Requires the
com.apple.security.cs.allow-jit
and
com.apple.developer.kernel.extended-virtual-addressing
entitlements on the web content extension only.
需要JIT编译JavaScript的网页内容扩展需要在可写和可执行内存状态之间切换。使用BrowserEngineCore提供的
BE_JIT_WRITE_PROTECT_TAG
swift
import BrowserEngineCore

// BE_JIT_WRITE_PROTECT_TAG 与 pthread_jit_write_protect_np 配合使用
// 用于控制JIT内存页的权限
该功能仅需要在网页内容扩展上配置
com.apple.security.cs.allow-jit
com.apple.developer.kernel.extended-virtual-addressing
权限。

arm64e Requirement

arm64e要求

All executables (host app and extensions) must be built with the
arm64e
instruction set for distribution. Build as a universal binary to also support
arm64
iPads.
In Xcode build settings or xcconfig:
ARCHS[sdk=iphoneos*]=arm64e
Do not use
arm64e
for Simulator targets.
所有可执行文件(宿主应用和扩展)都必须使用
arm64e
指令集构建才能分发。可以构建通用二进制包来同时支持
arm64
架构的iPad设备。
在Xcode构建设置或xcconfig文件中添加:
ARCHS[sdk=iphoneos*]=arm64e
不要为模拟器目标设置
arm64e
架构。

Downloads

下载管理

Report download progress to the system using
BEDownloadMonitor
. Create an access token, initialize the monitor with source/destination URLs and a
Progress
object, then call
beginMonitoring()
to show the system download UI. Use
resumeMonitoring(placeholderURL:)
to resume interrupted downloads.
See references/browserenginekit-patterns.md for full download management examples.
使用
BEDownloadMonitor
向系统上报下载进度。创建访问令牌,使用源/目标URL和
Progress
对象初始化监控器,然后调用
beginMonitoring()
即可展示系统下载UI。使用
resumeMonitoring(placeholderURL:)
恢复中断的下载。
查看references/browserenginekit-patterns.md获取完整的下载管理示例。

Common Mistakes

常见错误

DON'T: Skip the bootstrap sequence

错误:跳过启动序列

swift
// WRONG - content extension has no path to other extensions
let contentProcess = try await WebContentProcess(
    bundleIdentifier: nil, onInterruption: {}
)
// Immediately start sending work without connecting to networking/rendering

// CORRECT - broker connections through the host app
let networkEndpoint = try await networkProxy.getEndpoint()
let renderEndpoint = try await renderProxy.getEndpoint()
try await contentProxy.bootstrap(
    renderingExtension: renderEndpoint,
    networkExtension: networkEndpoint
)
swift
// 错误 - 内容扩展没有连接到其他扩展的路径
let contentProcess = try await WebContentProcess(
    bundleIdentifier: nil, onInterruption: {}
)
// 未连接网络/渲染扩展就直接发送任务

// 正确 - 通过宿主应用代理连接
let networkEndpoint = try await networkProxy.getEndpoint()
let renderEndpoint = try await renderProxy.getEndpoint()
try await contentProxy.bootstrap(
    renderingExtension: renderEndpoint,
    networkExtension: networkEndpoint
)

DON'T: Launch extensions from other extensions

错误:从其他扩展中启动扩展

swift
// WRONG - extensions cannot launch other extensions
// (inside a WebContentExtension)
let network = try await NetworkingProcess(...)

// CORRECT - only the host app launches extensions
// Host app creates all processes, then brokers connections
swift
// 错误 - 扩展不能启动其他扩展
// (在WebContentExtension内部)
let network = try await NetworkingProcess(...)

// 正确 - 仅宿主应用可以启动扩展
// 宿主应用创建所有进程,然后代理连接

DON'T: Use extension process objects after invalidation

错误:失效后仍使用扩展进程对象

swift
// WRONG
contentProcess.invalidate()
let conn = try contentProcess.makeLibXPCConnection()  // Error

// CORRECT - create a new process if needed
let newProcess = try await WebContentProcess(
    bundleIdentifier: nil, onInterruption: {}
)
swift
// 错误
contentProcess.invalidate()
let conn = try contentProcess.makeLibXPCConnection()  // 报错

// 正确 - 需要时创建新的进程实例
let newProcess = try await WebContentProcess(
    bundleIdentifier: nil, onInterruption: {}
)

DON'T: Apply JIT entitlements to non-content extensions

错误:为非内容扩展配置JIT权限

JIT compilation entitlements (
com.apple.security.cs.allow-jit
) are valid only on web content extensions. Adding them to the host app, rendering extension, or networking extension causes App Store rejection.
JIT编译权限(
com.apple.security.cs.allow-jit
)仅对网页内容扩展有效,为宿主应用、渲染扩展或网络扩展添加该权限会导致App Store审核被拒。

DON'T: Hard-code region eligibility

错误:硬编码地区资格判断

swift
// WRONG
if Locale.current.region?.identifier == "DE" {
    useAlternativeEngine()
}

// CORRECT - use the system eligibility API
BEAvailability.isEligible(for: .webBrowser) { eligible, _ in
    if eligible { useAlternativeEngine() }
}
swift
// 错误
if Locale.current.region?.identifier == "DE" {
    useAlternativeEngine()
}

// 正确 - 使用系统资格检查API
BEAvailability.isEligible(for: .webBrowser) { eligible, _ in
    if eligible { useAlternativeEngine() }
}

DON'T: Forget to set UIRequiredDeviceCapabilities

错误:忘记设置UIRequiredDeviceCapabilities

Without
web-browser-engine
in
UIRequiredDeviceCapabilities
, users on unsupported devices can download the app and hit runtime failures.
如果
UIRequiredDeviceCapabilities
中没有包含
web-browser-engine
,不支持该功能的设备用户也可以下载应用,导致运行时故障。

Review Checklist

审核清单

  • com.apple.developer.web-browser-engine.host
    entitlement on host app
  • Each extension has its type-specific entitlement
  • UIRequiredDeviceCapabilities
    includes
    web-browser-engine
  • arm64e
    instruction set configured for all iOS device targets
  • arm64e
    is not set for Simulator targets
  • Swift packages built with
    iOSPackagesShouldBuildARM64e
    workspace setting
  • Extension point identifiers set correctly in each extension's Info.plist
  • Interruption handlers implemented for all process types
  • Bootstrap sequence connects content extension to networking and rendering
  • Capabilities granted before work begins and invalidated when done
  • Visibility propagation interaction added to browser content views
  • Restricted sandbox applied to content extensions after initialization
  • BEAvailability
    used for eligibility checks instead of manual region logic
  • Memory attribution configured if rendering extension memory is high
  • Download progress reported via
    BEDownloadMonitor
    for active downloads
  • Memory tagging enabled for Japan distribution (recommended for EU)
  • 宿主应用配置了
    com.apple.developer.web-browser-engine.host
    权限
  • 每个扩展都配置了对应类型的专属权限
  • UIRequiredDeviceCapabilities
    包含
    web-browser-engine
  • 所有iOS设备目标都配置了
    arm64e
    指令集
  • 模拟器目标未设置
    arm64e
    指令集
  • Swift包通过
    iOSPackagesShouldBuildARM64e
    工作区设置构建
  • 每个扩展的Info.plist中都正确设置了扩展点标识符
  • 所有进程类型都实现了中断处理函数
  • 启动序列已将内容扩展连接到网络和渲染扩展
  • 任务开始前授予对应能力,任务完成后释放能力
  • 浏览器内容视图已添加可见性传播交互
  • 内容扩展初始化完成后应用了受限沙箱
  • 使用
    BEAvailability
    进行资格检查,而非手动判断地区
  • 如果渲染扩展内存占用较高,已配置内存归因
  • 活跃下载的进度通过
    BEDownloadMonitor
    上报
  • 日本地区分发的应用已启用内存标记(欧盟地区推荐启用)

References

参考资料