#!/usr/bin/env bash # 补齐 stasel/WebRTC 原生 macOS 切片缺失的头文件。 # # 背景:stasel/WebRTC 149.0.0 的 macos-x86_64_arm64 切片随包只带 umbrella WebRTC.h,缺全部 80+ 子头 # (ios-arm64 / maccatalyst / simulator 三切片各 93 头齐全)——umbrella `#import ` 的子头 # 找不到,`import WebRTC` 在原生 macOS target 无法编译。切片二进制本身有效(arm64+x86_64 dylib, # 环回 DataChannel 20MB 逐字节端到端实测通过)。 # # 修法:从同包 ios-arm64 切片补齐 macOS 切片的头——这些子头是平台守卫(#if TARGET_OS_IPHONE / #else) # 的 ObjC 声明,跨切片同构,可直接复用。排除 3 个 UIKit 绑定视图头(RTCCameraPreviewView / # RTCEAGLVideoView / RTCMTLVideoView,macOS umbrella 本就不引用它们),并从 macOS umbrella 去掉本包 # 缺失且无处可取的 RTCMTLNSVideoView.h(Metal NSView 视图,数据面不用)。 # # 幂等:已补齐(macOS 头数 > 1)则跳过。SPM 每次 re-resolve 会重置切片为原始(残缺)状态,故须在 # resolve 之后、build 之前跑(Justfile 的 mac-prep 已 chain)。 set -euo pipefail DD="${1:?用法: patch-macos-webrtc-headers.sh }" XCF="$(find "$DD/SourcePackages/artifacts" -type d -name 'WebRTC.xcframework' 2>/dev/null | head -1)" [ -n "$XCF" ] || { echo "未找到 WebRTC.xcframework(先跑 xcodebuild -resolvePackageDependencies)"; exit 1; } IOSH="$XCF/ios-arm64/WebRTC.framework/Headers" MACH="$XCF/macos-x86_64_arm64/WebRTC.framework/Versions/A/Headers" [ -d "$IOSH" ] || { echo "未找到 ios-arm64 切片头:$IOSH"; exit 1; } [ -d "$MACH" ] || { echo "未找到 macos 切片头:$MACH"; exit 1; } if [ "$(ls -1 "$MACH" | wc -l | tr -d ' ')" -gt 1 ]; then echo "macOS WebRTC 头已补齐($(ls -1 "$MACH" | wc -l | tr -d ' ') 个),跳过。" exit 0 fi for h in "$IOSH"/*.h; do b="$(basename "$h")" case "$b" in WebRTC.h | RTCCameraPreviewView.h | RTCEAGLVideoView.h | RTCMTLVideoView.h) continue ;; esac cp "$h" "$MACH/$b" done grep -v 'RTCMTLNSVideoView.h' "$MACH/WebRTC.h" > "$MACH/WebRTC.h.tmp" && mv "$MACH/WebRTC.h.tmp" "$MACH/WebRTC.h" echo "已补齐 macOS WebRTC 头:$(ls -1 "$MACH" | wc -l | tr -d ' ') 个。"