browserenginekit

browserenginekit

熱門

使用 BrowserEngineKit 建置第三方瀏覽器引擎。適用於在支援地區開發適用於 iOS/iPadOS 的非 WebKit 瀏覽器引擎、管理網頁內容/渲染/網路擴充程序(Extension Process)、設定 GPU 與網路程序的 Capability 功能、檢查第三方引擎的裝置相容資格,以及審閱 BrowserEngineKit Entitlements 與 Info.plist 設定。

967星標
49分支
更新於 2026/7/31
SKILL.md
唯讀
名稱
browserenginekit
描述

使用 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)

  1. 主應用程式啟動網頁內容、網路與渲染擴充元件
  2. 主應用程式建立與各擴充元件的 XPC 連線
  3. 主應用程式向網路與渲染擴充元件請求匿名 XPC 端點
  4. 主應用程式透過引導訊息(Bootstrap Message)將這兩個端點傳送給網頁內容擴充元件
  5. 網頁內容擴充元件直接連線至網路與渲染擴充元件

此架構遵循最小權限原則:網頁內容擴充元件處理不可信的資料,但無法直接存取作業系統資源。

程序管理

啟動擴充元件

主應用程式中每種擴充元件類型都有對應的程序類別:

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)附加至瀏覽器檢視,使擴充元件知道內容何時出現在螢幕上。WebContentProcessRenderingProcess 皆提供 createVisibilityPropagationInteraction()

圖層託管與檢視協調

渲染擴充元件會繪製至 LayerHierarchy 中,主應用程式則透過 LayerHierarchyHostingView 顯示其內容。控制代碼(Handle)透過 XPC 傳送。使用 LayerHierarchyHostingTransactionCoordinator 可跨程序原子化同步圖層更新。

請參閱 references/browserenginekit-patterns.md 取得詳細的圖層託管範例與事務協調說明。

文字互動

在自訂文字檢視上採用 BETextInput 以整合 UIKit 的文字系統。這能啟用標準的文字選取、自動修正、聽寫與鍵盤互動。

關鍵整合點:

  • asyncInputDelegate:用於向系統傳達文字變更
  • handleKeyEntry(_:completionHandler:):用於處理鍵盤事件
  • BETextInteraction:用於選取手勢、編輯功能表與快顯功能表
  • BEScrollViewBEScrollViewDelegate:用於自訂捲動處理

請參閱 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 -->