2025 年 7 月 13 日
iOS iPadOS macOS Network Privacy&Security System Services tvOS visionOS watchOS WiFiAware WWDC WWDC25突破連線壁壘:WWDC25 深度解析 Wi-Fi Aware,開啟 P2P 去中心化連線新紀元
身為長期在 Apple 生態系統中打磨 P2P 連線功能的開發者,我們都深知其中的痛點:Multipeer Connectivity 雖然方便但限制多,傳統 Wi-Fi 則極度依賴路由器,而 Core Bluetooth 在處理大數據傳輸時的頻寬又顯得捉襟見肘。對於追求「短暫體驗 Ephemeral Experiences」,例如在音樂節快速分享高畫質原圖,或是與無人機建立即時低延遲控制鏈路,我們急需一種更具彈性、效能更強且具備工業標準的方案。
在 WWDC25 中,Apple 正式推出了 Wi-Fi Aware 框架。這不僅僅是一個新 API,它代表了 iPhone 與 iPad 邁向真正去中心化連線的一大步。透過 Wi-Fi Aware,設備能在無需任何存取點(Access Point)的情況下,於運行時動態發現彼此並建立高強度的安全連結。更重要的是,它是基於 Wi-Fi Alliance 的全球標準,這意味著跨平台的互通性將不再是開發者的噩夢。
基礎架構:Wi-Fi Aware 的去中心化優勢
Wi-Fi Aware 的核心技術架構在於其真正的 Peer-to-Peer(P2P)模式,它徹底擺脫了對傳統基礎設施的依賴。
- 動態與按需連線:設備無需預先加入同一個區域網路,即可在毫秒級別內發現周遭服務並建立加密鏈路
- 與現有網路共存:這是技術上的關鍵突破。Wi-Fi Aware 能與常規 Wi-Fi 連線並行,意即使用者的 iPhone 在保持 5G 或家用 Wi-Fi 上網的同時,還能透過另一條 P2P 軌道與附近的設備或配件交換數據,兩者互不干擾
- 跨平台互通性:講者明確指出,這是一個由 Wi-Fi Alliance 維護的全球標準,可被任何硬體製造商採用。對於開發者而言,這意味著你的 App 未來能無縫連接至各種支援此標準的 Android 設備或第三方嵌入式硬體
服務宣告:從 Info.plist 建立開發契約
在 Wi-Fi Aware 的世界中,一切始於「服務 Services」。在進行任何發現流程前,你必須先在 App 中定義好通訊的契約。
作為資深開發者,你必須留意其嚴格的命名規範:服務名稱長度上限為 15 個字元,且格式必須遵循 [Unique Name].[Protocol]。其中 Protocol 必須是 _tcp 或 _udp。為了避免全球範圍內的命名衝突,Apple 強烈建議開發者將服務名稱向 IANA(Internet Assigned Numbers Authority)進行註冊。
Info.plist 配置範例:
<key>WiFiAwareServices</key>
<dict>
<key>_file-service._tcp</key>
<dict>
<key>Publishable</key>
<dict/>
<key>Subscribable</key>
<dict/>
</dict>
<key>_drone-service._udp</key>
<dict>
<key>Subscribable</key>
<true/>
</dict>
</dict>
在撰寫程式碼前,務必先檢查硬體支援度,因為並非所有運行 iOS 19 的設備都具備必要的硬體組件。
import WiFiAware
// 在 App 啟動、View 載入或任何使用 Wi-Fi Aware 前,先檢查硬體支援度
//(若不支援則需優雅降級,例如提示使用者或切換回 Multipeer Connectivity)
guard WACapabilities.supportedFeatures.contains(.wifiAware) else {
print("⚠️ 此設備不支援 Wi-Fi Aware(需 iOS 19+ 且硬體相容)")
// 可在此處 return、顯示 alert,或切換備用方案
return
}
// 定義靜態服務屬性(強烈建議這樣做!後續呼叫超方便,且避免字串硬編碼)
// 注意:allServices 的 key 必須與 Info.plist 中的 key 完全一致(包含開頭的「_」)
extension WAPublishableService {
public static var fileService: WAPublishableService {
allServices["_file-service._tcp"]! // 對應你 plist 中的 publishable 服務
}
}
extension WASubscribableService {
public static var fileService: WASubscribableService {
allServices["_file-service._tcp"]! // 同時支援 publish/subscribe 的服務
}
public static var droneService: WASubscribableService {
allServices["_drone-service._udp"]! // 僅訂閱的無人機控制服務
}
}
使用方式:
// 範例:發佈服務
let listener = try NWListener(using: .tcp, on: .any)
listener.service = WAPublishableService.fileService.service // 超乾淨!
let browser = NWBrowser(for: .wifiAware, using: WASubscribableService.droneService.parameters)
安全配對與設備管理
Apple 透過系統級 UI 封裝了複雜的安全邏輯。值得注意的是,Wi-Fi Aware 的加密是發生在 Wi-Fi 層(Layer 2),系統會自動處理金鑰交換與鏈路加密,開發者完全不需要自行管理 Socket 級別的加密協議。
- DeviceDiscoveryUI:適用於通用的 App 間連線,系統會導引使用者透過 PIN 碼授權建立信任
- AccessorySetupKit:這是硬體配件廠商的「黃金標準」。它支援雙傳輸層(Dual-transport)設置,能同時完成藍牙與 Wi-Fi Aware 的配對流程,提供最流暢的開箱即用體驗
除了初始配對,管理已配對設備也是架構設計的重點。透過 WAPairedDevice.allDevices API,開發者可以獲取一個 AsyncSequence,這讓你能夠即時監聽設備列表的變化(如使用者在系統設定中移除設備),並根據 vendor 或 modelName 進行過濾。
建立連線:運用 Network 框架實現數據交換
完成配對後,我們將回到熟悉的 Network.framework。其核心流程為:定義過濾器 → 啟動 Listener/Browser → 建立 NWConnection。
- 設定過濾器 Filter:根據配對資訊篩選特定的目標
- 啟動服務:發布端使用 WAPublishableService 初始化 NWListener;訂閱端則使用 WASubscribableService 初始化 NWBrowser
- 效能管理:這裡有個「專家建議」:由於 P2P 搜尋極其耗電,一旦成功建立 NWConnection 並開始傳輸數據,務必立即停止 Listener 和 Browser 的運作,以節省無線電資源
發布端 Publisher:檔案分享服務
import WiFiAware
import Network
let filePublishService = WAPublishableService.fileService
// 關鍵注入:將 WAPublishableService 透過 .wifiAware descriptor 注入 NetworkListener
// 同時使用 .allPairedDevices 作為配對過濾器(根據 2.3 的已配對設備自動篩選)
let listener = try await NetworkListener(
for: .wifiAware(
.connecting(
to: filePublishService, // 注入 PublishableService
from: .allPairedDevices // 配對資訊過濾器
)
),
using: .parameters {
// 可自訂傳輸層(你的服務是 _tcp,所以這裡預設即可)
}
)
// 監聽狀態(可選)
listener.onStateUpdate { listener, state in
print("Listener 狀態:\(state)")
}
// 啟動並接受連線(成功後會自動呼叫 closure)
listener.run { connection in
print("✅ 訂閱端已連上!建立 NWConnection(或 NetworkConnection)")
// 這裡開始實際數據傳輸(例如 send 高畫質原圖)
// connection.send(...) 或 for try await event in connection.messages { ... }
// Pro-tip:連線建立後立即停止 Listener(省電)
// listener.cancel()
}
訂閱端 Subscriber:無人機控制服務
let droneSubscribeService = WASubscribableService.droneService
// 關鍵注入:將 WASubscribableService 透過 .wifiAware descriptor 注入 NetworkBrowser
let browser = NetworkBrowser(
for: .wifiAware(
.connecting(
to: .allPairedDevices, // 配對資訊過濾器
from: droneSubscribeService // 注入 SubscribableService
)
)
)
// 啟動 Browser 並等待發現結果
let discoveredEndpoint = try await browser.run { endpoints in
if let firstEndpoint = endpoints.first {
return .finish(firstEndpoint) // 找到第一個配對設備就結束搜尋
}
return .continue
}
// 最終建立連線(使用剛發現的 WAEndpoint)
let connection = NetworkConnection(
to: discoveredEndpoint,
using: .parameters {
// 可自訂傳輸層(你的服務是 _udp,適合低延遲控制)
}
)
connection.onStateUpdate { connection, state in
if case .ready = state {
print("🚀 P2P 連線就緒!可開始即時控制無人機")
// 這裡開始 send 控制指令或 receive 狀態
}
}
// 啟動連線
connection.start(queue: .main)
// 連線成功後立即停止 Browser(省電)
browser.cancel()
效能優化:平衡「占空比 Duty Cycle」與電力
Wi-Fi Aware 允許開發者精細控制無線電的行為。這裡涉及一個核心概念:占空比 Duty Cycle。
- Performance Mode:
- Bulk 預設:低占空比,適合對延遲不敏感的背景數據傳輸
- Real-time:高占空比,提供最低延遲,但對電池損耗極大
- Traffic Service Class:必須與效能模式對應。對於即時控制,建議使用 Interactive Video 或 Interactive Voice 類別
效能設定必須具備對稱性。在發布端設定了 Real-time 模式,訂閱端的 NWConnection 也必須同步設定,否則無法達到預期效能。此外,透過讀取 Performance Report,你可以獲得訊號強度與吞吐量的即時反饋,從而動態調整傳輸策略。
import Network
import WiFiAware
// 定義效能模式與服務類別(雙端必須一致)
let appPerformanceMode: WAPerformanceMode = .realtime // 或 .bulk(預設,低功耗但延遲較高)
let appServiceClass: WAAccessCategory = .interactiveVideo // 即時控制建議使用 .interactiveVideo 或 .interactiveVoice
// 發布端(Publisher):使用 WAPublishableService 相關服務初始化 NWListener
let publishableService = WAPublishableService(name: "file-service._tcp") // 對應 Info.plist 中的服務
let listener = try await NetworkListener(
for: .wifiAware(.connecting(to: publishableService, from: .allPairedDevices)),
using: .parameters {
TLS() // 系統自動處理 Layer 2 加密
}
.wifiAware { config in
config.performanceMode = appPerformanceMode // 設定 Performance Mode(影響 Duty Cycle)
}
.serviceClass(appServiceClass) // 設定 Traffic Service Class(封包優先順序)
)
// 訂閱端(Subscriber):使用 WASubscribableService 相關服務初始化 NWConnection
let subscribableService = WASubscribableService(name: "file-service._tcp")
let connection = NetworkConnection(
to: endpoint, // 從 NWBrowser 發現的 endpoint
using: .parameters {
TLS()
}
.wifiAware { config in
config.performanceMode = appPerformanceMode // 必須與發布端相同!
}
.serviceClass(appServiceClass) // 必須與發布端相同!
)
// 讀取 Performance Report(雙端皆可呼叫,取得即時訊號強度與延遲回饋)
Task {
if let wifiAwarePath = try await connection.currentPath?.wifiAware {
let performanceReport: WAPerformanceReport = wifiAwarePath.performance
// 訊號強度(0.0~1.0,愈接近 1.0 愈強)
let signalStrength = performanceReport.signalStrength
print("訊號強度: \(signalStrength)")
// 傳輸延遲(依服務類別查詢平均值)
if let latencyStats = performanceReport.transmitLatency[appServiceClass] {
let avgLatency = latencyStats.average
print("平均傳輸延遲: \(avgLatency) ms")
}
// 可動態調整策略,例如訊號弱時切換回 .bulk 模式
if signalStrength < 0.5 {
// 動態調整邏輯...
}
}
}
// 連線建立後立即停止 Listener/Browser 以節省電力
listener.cancel()
結論與展望
Wi-Fi Aware 的加入,填補了 Apple 生態系統中「高頻寬、低延遲、去中心化」的技術空白。對於硬體供應商而言,這是一個向 Apple 設備敞開大門的契機。我強烈建議相關廠商參考官方的《Accessory Design Guidelines》,這是確保第三方硬體與 iOS 設備達成最佳互通性的唯一指南。
這項技術將改變我們對「連線」的定義:它不再需要網路基礎設施,而是以人與設備為中心。
延伸思考:
在你目前的專案中,是否有任何功能因為藍牙速度太慢或 Wi-Fi 配對太繁瑣而被迫妥協?Wi-Fi Aware 的 Layer 2 安全加密與跨平台特性,是否能成為你突破現狀的關鍵?歡迎在下方留言,與我一起探討這項技術的實戰應用。
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。