browserenginekit
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBrowserEngineKit
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 from the BrowserKit framework to check whether the device
is eligible for alternative browser engines:
BEAvailabilityswift
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框架中的检查设备是否支持使用替代浏览器引擎:
BEAvailabilityswift
import BrowserKit
BEAvailability.isEligible(for: .webBrowser) { eligible, error in
if eligible {
// 设备支持替代浏览器引擎
} else {
// 降级处理或展示说明
}
}资格状态取决于设备地区和操作系统版本,不要硬编码地区检查逻辑,请依赖系统API的返回结果。
Related Frameworks
相关框架
| Framework | Purpose |
|---|---|
| BrowserEngineKit | Process management, extensions, text/view integration |
| BrowserEngineCore | Low-level primitives: kernel events, JIT tag, audio session |
| BrowserKit | Eligibility checks, browser data import/export |
| 框架 | 用途 |
|---|---|
| BrowserEngineKit | 进程管理、扩展功能、文本/视图集成 |
| BrowserEngineCore | 底层原语:内核事件、JIT标记、音频会话 |
| BrowserKit | 资格检查、浏览器数据导入/导出 |
Entitlements
权限配置
Browser App (Host)
浏览器应用(宿主端)
The host app requires two entitlements:
| Entitlement | Purpose |
|---|---|
| Enables default-browser candidacy |
| Enables alternative engine extensions |
Both must be requested from Apple. The request process varies by region.
宿主应用需要两项权限:
| 权限 | 用途 |
|---|---|
| 获得默认浏览器候选资格 |
| 启用替代引擎扩展能力 |
两项权限都需要向Apple申请,申请流程随地区不同有所差异。
Extension Entitlements
扩展权限
Each extension target requires its type-specific entitlement set to :
true| Extension Type | Entitlement |
|---|---|
| Web content | |
| Networking | |
| Rendering | |
每个扩展目标都需要将对应类型的专属权限设置为:
true| 扩展类型 | 权限 |
|---|---|
| 网页内容 | |
| 网络 | |
| 渲染 | |
Optional Entitlements
可选权限
| Entitlement | Extension | Purpose |
|---|---|---|
| Web content | JIT compilation of scripts |
| Web content | Required alongside JIT |
| Rendering | Send memory attribution |
| Web content | Accept memory attribution |
| Web content | Restrict notification daemon access |
| 权限 | 适用扩展 | 用途 |
|---|---|---|
| 网页内容 | 脚本JIT编译 |
| 网页内容 | JIT功能的必备配套权限 |
| 渲染 | 发送内存归因信息 |
| 网页内容 | 接收内存归因信息 |
| 网页内容 | 限制通知守护进程访问权限 |
Embedded Browser Engine (Non-Browser Apps)
嵌入式浏览器引擎(非浏览器应用)
Apps that are not browsers but embed an alternative engine for in-app browsing
use different entitlements:
| Entitlement | Purpose |
|---|---|
| Enable embedded engine |
| Declare engine ownership |
Embedded engines use only (not ), cannot include browser
extensions, and cannot use JIT compilation.
arm64arm64e非浏览器类应用如果嵌入替代引擎用于应用内浏览,需要使用不同的权限:
| 权限 | 用途 |
|---|---|
| 启用嵌入式引擎 |
| 声明引擎所有权 |
嵌入式引擎仅支持架构(不支持),不能包含浏览器扩展,也不能使用JIT编译功能。
arm64arm64eJapan-Specific Requirements
日本地区专属要求
Browser apps distributed in Japan must enable hardware memory tagging via
. Apple strongly
recommends enabling this in the EU as well.
com.apple.security.hardened-process.checked-allocations在日本地区分发的浏览器应用必须通过启用硬件内存标记功能,Apple强烈建议欧盟地区的应用也启用该功能。
com.apple.security.hardened-process.checked-allocationsArchitecture
架构设计
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
启动序列
- Host launches web content, networking, and rendering extensions
- Host creates XPC connections to each extension
- Host requests anonymous XPC endpoints from networking and rendering
- Host sends both endpoints to the web content extension via a bootstrap message
- 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.
- 宿主启动网页内容、网络和渲染扩展
- 宿主创建与每个扩展的XPC连接
- 宿主向网络和渲染扩展请求匿名XPC端点
- 宿主通过启动消息将两个端点发送给网页内容扩展
- 网页内容扩展直接连接到网络和渲染扩展
该架构遵循最小权限原则:网页内容扩展处理不受信任的数据,但没有直接访问操作系统资源的权限。
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 for to use the default extension target. The
interruption handler fires if the extension crashes or is terminated by the OS.
nilbundleIdentifier每种扩展类型在宿主应用中都有对应的进程类:
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: {
// 处理中断
}
)bundleIdentifiernilCreating XPC Connections
创建XPC连接
swift
let connection = try contentProcess.makeLibXPCConnection()
// Use connection for inter-process messagingEach process type provides to create an
for communication.
makeLibXPCConnection()xpc_connection_tswift
let connection = try contentProcess.makeLibXPCConnection()
// 使用该连接进行进程间通信每个进程类型都提供方法,用于创建通信所需的实例。
makeLibXPCConnection()xpc_connection_tStopping Extensions
停止扩展
swift
contentProcess.invalidate()After calling , no further method calls on the process object
are valid.
invalidate()swift
contentProcess.invalidate()调用之后,该进程对象的所有方法调用都将无效。
invalidate()Extension Types
扩展类型
Web Content Extension
网页内容扩展
Hosts the browser engine's HTML parser, CSS engine, JavaScript interpreter,
and DOM. Subclass to handle incoming XPC connections:
WebContentExtensionswift
import BrowserEngineKit
final class MyWebContentExtension: WebContentExtension {
override func handle(xpcConnection: xpc_connection_t) {
// Set up message handlers on the connection
}
}Configure via in the extension's
.
WebContentExtensionConfigurationEXAppExtensionAttributes承载浏览器引擎的HTML解析器、CSS引擎、JavaScript解释器和DOM。继承来处理传入的XPC连接:
WebContentExtensionswift
import BrowserEngineKit
final class MyWebContentExtension: WebContentExtension {
override func handle(xpcConnection: xpc_connection_t) {
// 在连接上设置消息处理逻辑
}
}在扩展的中通过进行配置。
EXAppExtensionAttributesWebContentExtensionConfigurationNetworking Extension
网络扩展
Handles all network requests using or socket APIs. One instance
serves all tabs:
URLSessionswift
import BrowserEngineKit
final class MyNetworkingExtension: NetworkingExtension {
override func handle(xpcConnection: xpc_connection_t) {
// Handle network request messages
}
}Configure via .
NetworkingExtensionConfiguration使用或套接字API处理所有网络请求,一个实例为所有标签页提供服务:
URLSessionswift
import BrowserEngineKit
final class MyNetworkingExtension: NetworkingExtension {
override func handle(xpcConnection: xpc_connection_t) {
// 处理网络请求消息
}
}通过进行配置。
NetworkingExtensionConfigurationRendering 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)通过进行配置。
RenderingExtensionConfigurationCapabilities
能力授权
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
可用能力
| Capability | Use Case |
|---|---|
| Active tab rendering, visible content |
| Background tasks, prefetching |
| Minimal activity, pending cleanup |
| Audio/video playback, camera/mic capture |
| 能力 | 使用场景 |
|---|---|
| 活跃标签页渲染、可见内容处理 |
| 后台任务、预加载 |
| 最小活动状态、待清理 |
| 音视频播放、摄像头/麦克风采集 |
Media Environment
媒体环境
For media capabilities, create a tied to a page URL.
The environment supports for camera/mic access and is
XPC-serializable for cross-process transport:
MediaEnvironmentAVCaptureSessionswift
let mediaEnv = MediaEnvironment(webPage: pageURL)
let grant = try contentProcess.grantCapability(
.mediaPlaybackAndCapture(environment: mediaEnv)
)
try mediaEnv.activate()
let captureSession = try mediaEnv.makeCaptureSession()对于媒体能力,需要创建绑定到页面URL的实例。该环境支持用于摄像头/麦克风访问的,并且支持XPC序列化,可用于跨进程传输:
MediaEnvironmentAVCaptureSessionswift
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 and
provide .
WebContentProcessRenderingProcesscreateVisibilityPropagationInteraction()为浏览器视图添加可见性传播交互,以便扩展感知内容是否在屏幕上显示。和都提供方法。
WebContentProcessRenderingProcesscreateVisibilityPropagationInteraction()Layer Hosting and View Coordination
图层托管与视图协调
The rendering extension draws into a , whose content the
host app displays via . Handles are passed over
XPC. Use to synchronize layer
updates atomically across processes.
LayerHierarchyLayerHierarchyHostingViewLayerHierarchyHostingTransactionCoordinatorSee references/browserenginekit-patterns.md for detailed layer hosting
examples and transaction coordination.
渲染扩展绘制内容到中,宿主应用通过展示其内容,句柄通过XPC传递。使用跨进程同步图层更新,保证原子性。
LayerHierarchyLayerHierarchyHostingViewLayerHierarchyHostingTransactionCoordinator查看references/browserenginekit-patterns.md获取详细的图层托管示例和事务协调方法。
Text Interaction
文本交互
Adopt on custom text views to integrate with UIKit's text
system. This enables standard text selection, autocorrect, dictation, and
keyboard interactions.
BETextInputKey integration points:
- for communicating text changes to the system
asyncInputDelegate - for keyboard events
handleKeyEntry(_:completionHandler:) - for selection gestures, edit menus, and context menus
BETextInteraction - and
BEScrollViewfor custom scroll handlingBEScrollViewDelegate
See references/browserenginekit-patterns.md for detailed text interaction
implementation.
在自定义文本视图上实现协议,即可与UIKit的文本系统集成,实现标准的文本选择、自动更正、听写和键盘交互功能。
BETextInput核心集成点:
- 用于向系统传递文本变更信息
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 () for the strongest
restrictions.
.revision2初始化完成后,使用受限沙箱锁定内容扩展的权限:
swift
// 在网页内容扩展中,初始化完成后调用:
extension.applyRestrictedSandbox(revision: .revision2)该操作会移除扩展启动阶段需要、但后续不再使用的资源访问权限。使用最新版本()可以获得最严格的权限限制。
.revision2JIT Compilation
JIT编译
Web content extensions that JIT-compile JavaScript toggle memory between
writable and executable states. Use the from
BrowserEngineCore:
BE_JIT_WRITE_PROTECT_TAGswift
import BrowserEngineCore
// BE_JIT_WRITE_PROTECT_TAG is used with pthread_jit_write_protect_np
// to control JIT memory page permissionsRequires the and
entitlements on
the web content extension only.
com.apple.security.cs.allow-jitcom.apple.developer.kernel.extended-virtual-addressing需要JIT编译JavaScript的网页内容扩展需要在可写和可执行内存状态之间切换。使用BrowserEngineCore提供的:
BE_JIT_WRITE_PROTECT_TAGswift
import BrowserEngineCore
// BE_JIT_WRITE_PROTECT_TAG 与 pthread_jit_write_protect_np 配合使用
// 用于控制JIT内存页的权限该功能仅需要在网页内容扩展上配置和权限。
com.apple.security.cs.allow-jitcom.apple.developer.kernel.extended-virtual-addressingarm64e Requirement
arm64e要求
All executables (host app and extensions) must be built with the
instruction set for distribution. Build as a universal binary to also support
iPads.
arm64earm64In Xcode build settings or xcconfig:
ARCHS[sdk=iphoneos*]=arm64eDo not use for Simulator targets.
arm64e所有可执行文件(宿主应用和扩展)都必须使用指令集构建才能分发。可以构建通用二进制包来同时支持架构的iPad设备。
arm64earm64在Xcode构建设置或xcconfig文件中添加:
ARCHS[sdk=iphoneos*]=arm64e不要为模拟器目标设置架构。
arm64eDownloads
下载管理
Report download progress to the system using . Create an
access token, initialize the monitor with source/destination URLs and a
object, then call to show the system download
UI. Use to resume interrupted downloads.
BEDownloadMonitorProgressbeginMonitoring()resumeMonitoring(placeholderURL:)See references/browserenginekit-patterns.md for full download management
examples.
使用向系统上报下载进度。创建访问令牌,使用源/目标URL和对象初始化监控器,然后调用即可展示系统下载UI。使用恢复中断的下载。
BEDownloadMonitorProgressbeginMonitoring()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 connectionsswift
// 错误 - 扩展不能启动其他扩展
// (在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 () are valid
only on web content extensions. Adding them to the host app, rendering
extension, or networking extension causes App Store rejection.
com.apple.security.cs.allow-jitJIT编译权限()仅对网页内容扩展有效,为宿主应用、渲染扩展或网络扩展添加该权限会导致App Store审核被拒。
com.apple.security.cs.allow-jitDON'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 in , users on
unsupported devices can download the app and hit runtime failures.
web-browser-engineUIRequiredDeviceCapabilities如果中没有包含,不支持该功能的设备用户也可以下载应用,导致运行时故障。
UIRequiredDeviceCapabilitiesweb-browser-engineReview Checklist
审核清单
- entitlement on host app
com.apple.developer.web-browser-engine.host - Each extension has its type-specific entitlement
- includes
UIRequiredDeviceCapabilitiesweb-browser-engine - instruction set configured for all iOS device targets
arm64e - is not set for Simulator targets
arm64e - Swift packages built with workspace setting
iOSPackagesShouldBuildARM64e - 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
- used for eligibility checks instead of manual region logic
BEAvailability - Memory attribution configured if rendering extension memory is high
- Download progress reported via for active downloads
BEDownloadMonitor - Memory tagging enabled for Japan distribution (recommended for EU)
- 宿主应用配置了权限
com.apple.developer.web-browser-engine.host - 每个扩展都配置了对应类型的专属权限
- 包含
UIRequiredDeviceCapabilitiesweb-browser-engine - 所有iOS设备目标都配置了指令集
arm64e - 模拟器目标未设置指令集
arm64e - Swift包通过工作区设置构建
iOSPackagesShouldBuildARM64e - 每个扩展的Info.plist中都正确设置了扩展点标识符
- 所有进程类型都实现了中断处理函数
- 启动序列已将内容扩展连接到网络和渲染扩展
- 任务开始前授予对应能力,任务完成后释放能力
- 浏览器内容视图已添加可见性传播交互
- 内容扩展初始化完成后应用了受限沙箱
- 使用进行资格检查,而非手动判断地区
BEAvailability - 如果渲染扩展内存占用较高,已配置内存归因
- 活跃下载的进度通过上报
BEDownloadMonitor - 日本地区分发的应用已启用内存标记(欧盟地区推荐启用)
References
参考资料
- Extended patterns (text interaction, layer hosting, scroll views, XPC communication, content filtering): references/browserenginekit-patterns.md
- BrowserEngineKit framework
- Designing your browser architecture
- Creating browser extensions in Xcode
- Managing the browser extension life cycle
- Using XPC to communicate with browser extensions
- Web Browser Engine Entitlement
- BrowserKit framework
- BrowserEngineCore framework
- Sample: Developing a browser app with an alternative engine
- 扩展实践(文本交互、图层托管、滚动视图、XPC通信、内容过滤):references/browserenginekit-patterns.md
- BrowserEngineKit框架
- 设计浏览器架构
- 在Xcode中创建浏览器扩展
- 管理浏览器扩展生命周期
- 使用XPC与浏览器扩展通信
- 网页浏览器引擎权限
- BrowserKit框架
- BrowserEngineCore框架
- 示例:开发使用替代引擎的浏览器应用