使用 BrowserEngineKit 建置第三方瀏覽器引擎。適用於在支援地區開發適用於 iOS/iPadOS 的非 WebKit 瀏覽器引擎、管理網頁內容/渲染/網路擴充程序(Extension Process)、設定 GPU 與網路程序的 Capability 功能、檢查第三方引擎的裝置相容資格,以及審閱 BrowserEngineKit Entitlements 與 Info.plist 設定。
BrowserEngineKit
用於在 iOS 與 iPadOS 上建置替代(非 WebKit)渲染引擎瀏覽器的框架。為自行實作 HTML/CSS/JavaScript 引擎的瀏覽器應用程式提供程序隔離(Process Isolation)、XPC 通訊、Capability 管理與系統整合功能。範例程式碼針對 Swift 6.3 與最新的 Apple SDK。
BrowserEngineKit 屬於特殊用途框架。第三方瀏覽器引擎僅能透過 Apple 核准的 Entitlement 設定檔以及支援地區的裝置資格使用。歐盟(EU)支援適用於 iOS 17.4+ 和 iPadOS 18+ 的符合資格使用者;日本支援則自 iOS 26.2 起提供,並對瀏覽器應用程式提出了明確的 PAC/MIE 安全性要求。開發與測試可以在任何地方進行。配套框架 BrowserEngineCore(低階基元)與 BrowserKit(資格檢查、資料傳輸)共同支援整體工作流程。
目錄
概述與資格證明
檢查使用資格
使用 BrowserKit 框架中的 BEAvailability 來檢查裝置是否符合使用第三方瀏覽器引擎的資格。BEAvailability 支援 iOS/iPadOS 18.4+:
import BrowserKit
do {
let eligible = try await BEAvailability.isEligible(for: .webBrowser)
guard eligible else { return /* 降級處理或顯示說明 */ }
// 裝置支援第三方瀏覽器引擎
} catch {
// 處理資格查詢失敗
}
使用資格取決於裝置所在地區與 OS 版本。請勿將地區檢查寫死在程式碼中,應依賴系統 API。
可用性時間點:程序 API 支援 iOS/iPadOS 17.4+、BEDownloadMonitor 支援 iOS 18.2+、.revision2 受限沙盒支援 iOS 26+,而 RenderingExtensionFeature.coreML 則支援 iOS 26.2+。
Entitlements
瀏覽器應用程式(主應用程式)
主應用程式需要以下兩種 Entitlements:
| Entitlement | 用途 |
|---|---|
com.apple.developer.web-browser |
啟用預設瀏覽器候選資格 |
com.apple.developer.web-browser-engine.host |
啟用第三方引擎擴充元件 |
兩者皆必須向 Apple 申請。申請流程因地區而異。
擴充元件 Entitlements
每個擴充元件 Target 皆需要將其特定類型的 Entitlement 設定為 true:
| 擴充元件類型 | Entitlement |
|---|---|
| 網頁內容 | com.apple.developer.web-browser-engine.webcontent |
| 網路 | com.apple.developer.web-browser-engine.networking |
| 渲染 | com.apple.developer.web-browser-engine.rendering |
可選 Entitlements
| Entitlement | 擴充元件 | 用途 |
|---|---|---|
com.apple.security.cs.allow-jit |
網頁內容 | 指令碼的 JIT 即時編譯 |
com.apple.developer.kernel.extended-virtual-addressing |
網頁內容 | 使用 JIT 時的必備設定 |
com.apple.developer.memory.transfer_send |
渲染 | 發送記憶體歸屬(Memory Attribution);值為主應用程式的 Bundle ID |
com.apple.developer.memory.transfer_accept |
網頁內容 | 接收記憶體歸屬(Memory Attribution);值為主應用程式的 Bundle ID |
com.apple.developer.web-browser-engine.restrict.notifyd |
網頁內容 | 限制 Notification Daemon 的存取權限 |
嵌入式瀏覽器引擎(非瀏覽器應用程式)
非瀏覽器但需要嵌入第三方引擎以提供 App 內瀏覽功能的應用程式,需使用不同的 Entitlements:
| Entitlement | 用途 |
|---|---|
com.apple.developer.embedded-web-browser-engine |
啟用嵌入式引擎 |
com.apple.developer.embedded-web-browser-engine.engine-association |
宣告引擎所有權 |
engine-association 自 iOS/iPadOS/Mac Catalyst 26.2 起提供,若您擁有該引擎請設為 first-party,若由其他開發者擁有則設為 third-party。嵌入式引擎僅支援 arm64(不支援 arm64e),無法包含瀏覽器擴充元件,且無法使用 JIT 即時編譯。
日本地區特定要求
在日本發行的瀏覽器應用程式支援 iOS 26.2+,且必須採用 Apple 為日本列出的最新安全性防護措施,包含針對相關記憶體分配器與擴充程序的指標驗證碼(PAC)及記憶體完整性強制執行(MIE)。請使用 com.apple.security.hardened-process.checked-allocations 啟用硬體記憶體標籤功能;Apple 也強烈建議在歐盟地區啟用此功能。
架構
使用 BrowserEngineKit 建置的瀏覽器由四個運行在獨立程序中的元件組成:
Host App 主應用程式 (UI、協調)
|
|-- XPC --> 網頁內容擴充元件 Web Content Extension (HTML 解析、JS、DOM)
|-- XPC --> 網路擴充元件 Networking Extension (URLSession、sockets)
|-- XPC --> 渲染擴充元件 Rendering Extension (Metal、GPU、媒體)
主應用程式負責啟動並管理所有擴充元件。擴充元件無法啟動其他擴充元件。擴充元件之間透過主應用程式撮合的匿名 XPC 端點互相通訊。
啟動引導順序 (Bootstrap Sequence)
- 主應用程式啟動網頁內容、網路與渲染擴充元件
- 主應用程式建立與各擴充元件的 XPC 連線
- 主應用程式向網路與渲染擴充元件請求匿名 XPC 端點
- 主應用程式透過引導訊息(Bootstrap Message)將這兩個端點傳送給網頁內容擴充元件
- 網頁內容擴充元件直接連線至網路與渲染擴充元件
此架構遵循最小權限原則:網頁內容擴充元件處理不可信的資料,但無法直接存取作業系統資源。
程序管理
啟動擴充元件
主應用程式中每種擴充元件類型都有對應的程序類別:
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 可使用預設的擴充元件 Target。當擴充元件當機或被 OS 終止時,會觸發中斷處理常式。
建立 XPC 連線
let connection = try contentProcess.makeLibXPCConnection()
// 使用 connection 進行跨程序訊息傳遞
每種程序類型皆提供 makeLibXPCConnection() 用於建立通訊所需的 xpc_connection_t。
停止擴充元件
contentProcess.invalidate()
呼叫 invalidate() 後,該程序物件上的所有方法呼叫皆不再有效。
擴充元件類型
網頁內容擴充元件
託管瀏覽器引擎的 HTML 解析器、CSS 引擎、JavaScript 解譯器與 DOM。遵從 WebContentExtension 協定以處理傳入的 XPC 連線:
import BrowserEngineKit
@main
struct MyWebContentExtension: WebContentExtension {
func handle(xpcConnection: xpc_connection_t) {
// 在連線上設定訊息處理常式
}
}
透過擴充元件 EXAppExtensionAttributes 中的 WebContentExtensionConfiguration 進行設定。
網路擴充元件
使用 URLSession 或 Socket API 處理所有網路請求。單一實例服務所有分頁:
import BrowserEngineKit
@main
struct MyNetworkingExtension: NetworkingExtension {
func handle(xpcConnection: xpc_connection_t) {
// 處理網路請求訊息
}
}
透過 NetworkingExtensionConfiguration 進行設定。
渲染擴充元件
透過 Metal 存取 GPU 以進行影片解碼、圖層合成與複雜渲染。單一實例通常服務整個瀏覽器:
import BrowserEngineKit
@main
struct MyRenderingExtension: RenderingExtension {
init() {
if #available(iOS 26.2, macOS 26.2, *) {
enableFeature(.coreML)
}
}
func handle(xpcConnection: xpc_connection_t) {
// 處理渲染指令
}
}
透過 RenderingExtensionConfiguration 進行設定。
Capabilities
授予擴充元件 Capabilities,使 OS 能進行適當的排程:
// 授予擴充元件前景優先權
let grant = try contentProcess.grantCapability(.foreground)
// ... 擴充元件執行前景工作 ...
// 完成後釋放
grant.invalidate()
可用的 Capabilities
| Capability | 使用情境 |
|---|---|
.foreground |
活動分頁渲染、可見內容 |
.background |
背景任務、預取資料 |
.suspended |
最少活動、等待清理 |
.mediaPlaybackAndCapture(environment:) |
影音播放、攝影機/麥克風擷取 |
媒體環境
若要使用媒體能力,需建立綁定至網頁 URL 的 MediaEnvironment。該環境支援用於存取攝影機/麥克風的 AVCaptureSession,且支援 XPC 序列化以進行跨程序傳送:
let mediaEnv = MediaEnvironment(webPage: pageURL)
let grant = try contentProcess.grantCapability(
.mediaPlaybackAndCapture(environment: mediaEnv)
)
try mediaEnv.activate()
let captureSession = try mediaEnv.makeCaptureSession()
可見度傳播
將可見度傳播互動(Visibility Propagation Interaction)附加至瀏覽器檢視,使擴充元件知道內容何時出現在螢幕上。WebContentProcess 與 RenderingProcess 皆提供 createVisibilityPropagationInteraction()。
圖層託管與檢視協調
渲染擴充元件會繪製至 LayerHierarchy 中,主應用程式則透過 LayerHierarchyHostingView 顯示其內容。控制代碼(Handle)透過 XPC 傳送。使用 LayerHierarchyHostingTransactionCoordinator 可跨程序原子化同步圖層更新。
請參閱 references/browserenginekit-patterns.md 取得詳細的圖層託管範例與事務協調說明。
文字互動
在自訂文字檢視上採用 BETextInput 以整合 UIKit 的文字系統。這能啟用標準的文字選取、自動修正、聽寫與鍵盤互動。
關鍵整合點:
asyncInputDelegate:用於向系統傳達文字變更handleKeyEntry(_:completionHandler:):用於處理鍵盤事件BETextInteraction:用於選取手勢、編輯功能表與快顯功能表BEScrollView與BEScrollViewDelegate:用於自訂捲動處理
請參閱 references/browserenginekit-patterns.md 取得詳細的文字互動實作說明。
沙盒與安全性
受限沙盒
初始化完成後,使用受限沙盒鎖定內容擴充元件:
// 在網頁內容擴充元件中,完成設定後:
if #available(iOS 26.0, macOS 26.0, *) {
applyRestrictedSandbox(revision: .revision2)
} else {
applyRestrictedSandbox(revision: .revision1)
}
這會移除擴充元件在啟動期間使用但不再需要的資源存取權限。請使用最新可用的修訂版本以獲得最強的限制保護。
JIT 編譯
對 JavaScript 進行 JIT 編譯的網頁內容擴充元件,必須使用 BrowserEngineKit 的見證 API 切換頁面狀態:
import BrowserEngineCore
be_memory_inline_jit_restrict_rwx_to_rw_with_witness(...)
// 寫入產生的程式碼
be_memory_inline_jit_restrict_rwx_to_rx_with_witness(...)
需要 `com.appl
<!-- truncated for translation batch; full body continues in source -->




