feat(macos+flutter): 新增 Impeller 渲染引擎开关与 Intel Mac 渲染兼容修复

本次提交包含以下核心变更:
1. 修复 RawKeyboard 断言错误,添加 HardwareKeyboard 事件处理器
2. 实现 Intel Mac 自动降级玻璃渲染质量,避免黑屏闪烁
3. 新增 macOS 端 Impeller 渲染引擎开关设置,支持动态切换
4. 修复 macOS 双标题栏问题,隐藏系统原生交通灯按钮
5. 更新多语言国际化支持,新增 Impeller 相关翻译
6. 优化 WebRTC 依赖下载,使用国内镜像避免超时
This commit is contained in:
22
2026-06-25 08:44:00 +08:00
parent f9401b99e7
commit 7ea4a068a1
39 changed files with 1196 additions and 83 deletions

View File

@@ -3,12 +3,14 @@
<plist version="1.0">
<dict>
<key>method</key>
<string>app-store</string>
<string>app-store-connect</string>
<key>teamID</key>
<string>5V9NVUU6K5</string>
<key>uploadSymbols</key>
<false/>
<true/>
<key>uploadBitcode</key>
<false/>
<key>signingStyle</key>
<string>automatic</string>
</dict>
</plist>

View File

@@ -17,7 +17,7 @@ import flutter_app_group_directory
import flutter_image_compress_macos
import flutter_inappwebview_macos
import flutter_local_notifications
import flutter_secure_storage_macos
import flutter_secure_storage_darwin
import flutter_tts
import flutter_webrtc
import gal
@@ -56,7 +56,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin"))
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
FlutterSecureStorageDarwinPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageDarwinPlugin"))
FlutterTtsPlugin.register(with: registry.registrar(forPlugin: "FlutterTtsPlugin"))
FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin"))
GalPlugin.register(with: registry.registrar(forPlugin: "GalPlugin"))

View File

@@ -35,6 +35,9 @@ target 'Runner' do
end
end
# WebRTC-SDK 通过国内镜像下载,避免 github.com 连接超时
pod 'WebRTC-SDK', :podspec => 'WebRTC-SDK.podspec.json'
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_macos_build_settings(target)

View File

@@ -36,7 +36,7 @@ PODS:
- FlutterMacOS
- flutter_webrtc (1.4.0):
- FlutterMacOS
- WebRTC-SDK (= 144.7559.01)
- WebRTC-SDK (= 144.7559.09)
- FlutterMacOS (1.0.0)
- gal (1.0.0):
- Flutter
@@ -58,7 +58,6 @@ PODS:
- package_info_plus (0.0.1):
- FlutterMacOS
- pro_image_editor (12.0.8):
- Flutter
- FlutterMacOS
- quill_native_bridge_macos (0.0.1):
- FlutterMacOS
@@ -91,7 +90,7 @@ PODS:
- FlutterMacOS
- wakelock_plus (0.0.1):
- FlutterMacOS
- WebRTC-SDK (144.7559.01)
- WebRTC-SDK (144.7559.09)
- window_manager (0.5.0):
- FlutterMacOS
@@ -119,7 +118,7 @@ DEPENDENCIES:
- nearby_service (from `Flutter/ephemeral/.symlinks/plugins/nearby_service/darwin`)
- network_info_plus (from `Flutter/ephemeral/.symlinks/plugins/network_info_plus/macos`)
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
- pro_image_editor (from `Flutter/ephemeral/.symlinks/plugins/pro_image_editor/darwin`)
- pro_image_editor (from `Flutter/ephemeral/.symlinks/plugins/pro_image_editor/macos`)
- quill_native_bridge_macos (from `Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos`)
- record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`)
- rive_native (from `Flutter/ephemeral/.symlinks/plugins/rive_native/macos`)
@@ -133,6 +132,7 @@ DEPENDENCIES:
- video_compress (from `Flutter/ephemeral/.symlinks/plugins/video_compress/macos`)
- video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`)
- wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`)
- WebRTC-SDK (from `WebRTC-SDK.podspec.json`)
- window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
SPEC REPOS:
@@ -140,7 +140,6 @@ SPEC REPOS:
- CwlCatchException
- CwlCatchExceptionSupport
- OrderedSet
- WebRTC-SDK
EXTERNAL SOURCES:
app_links:
@@ -190,7 +189,7 @@ EXTERNAL SOURCES:
package_info_plus:
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
pro_image_editor:
:path: Flutter/ephemeral/.symlinks/plugins/pro_image_editor/darwin
:path: Flutter/ephemeral/.symlinks/plugins/pro_image_editor/macos
quill_native_bridge_macos:
:path: Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos
record_macos:
@@ -217,6 +216,8 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin
wakelock_plus:
:path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos
WebRTC-SDK:
:podspec: WebRTC-SDK.podspec.json
window_manager:
:path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
@@ -237,7 +238,7 @@ SPEC CHECKSUMS:
flutter_local_notifications: 1fc7ffb10a83d6a2eeeeddb152d43f1944b0aad0
flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23
flutter_tts: ae915565cc6948444b513acc8ee021993281e027
flutter_webrtc: f1fb1a00c6080461bb2bc6caa5b93d07ddb68466
flutter_webrtc: fec3dc9284a1f6d21ec2caa91c90bb4c1824eb04
FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
gal: baecd024ebfd13c441269ca7404792a7152fde89
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
@@ -247,11 +248,11 @@ SPEC CHECKSUMS:
network_info_plus: 21d1cd6a015ccb2fdff06a1fbfa88d54b4e92f61
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: f0052d280d17aa382b932f399edf32507174e870
pro_image_editor: e57a76b305fd8c2e06d57f92aec82b9c6a6e8d9f
pro_image_editor: e4f2ca0bcf5d755d81620d531b00e0906ccaa0ae
quill_native_bridge_macos: 2b005cb56902bb740e0cd9620aa399dfac6b4882
record_macos: 5d55909f9650314be6424ffd6b123ac75a08c3c1
rive_native: 7c43020540833c8258564b726317daf39d2c3bda
screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f
screen_retriever_macos: c5508cc3c66ff0d4db650480cf0ab691e220d933
share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
speech_to_text: 3b313d98516d3d0406cea424782ec25470c59d19
@@ -261,9 +262,9 @@ SPEC CHECKSUMS:
video_compress: 752b161da855df2492dd1a8fa899743cc8fe9534
video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52
wakelock_plus: 917609be14d812ddd9e9528876538b2263aaa03b
WebRTC-SDK: ab9b5319e458c2bfebdc92b3600740da35d5630d
WebRTC-SDK: 4a9a5db10ced18b045ffe9e31a74db47eae9f2df
window_manager: b729e31d38fb04905235df9ea896128991cad99e
PODFILE CHECKSUM: da7153fcdbf00f48b745928f1db268024c39f8e4
PODFILE CHECKSUM: 8d56010d72ffd0e8cc2b1391c301e2d755b5f9d9
COCOAPODS: 1.16.2

View File

@@ -753,7 +753,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD)";
ARCHS = "x86_64 arm64";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;

View File

@@ -1,9 +1,11 @@
/// ============================================================
/// APP macOS
/// : 2026-06-02
/// : 2026-06-19
/// : MethodChannelDock //Spotlight
/// : NSStatusItem NSDockTile CoreSpotlight
/// : 2026-06-25
/// : MethodChannelDock //Spotlight /CPU /Impeller /
/// : 1. getImpellerRunningStatus Impeller
/// getImpellerEnabled UserDefaults
/// 2. restartApp 800ms
/// ============================================================
import Cocoa
@@ -29,22 +31,77 @@ class AppDelegate: FlutterAppDelegate {
// MARK: -
// ============================================================
/// MethodChannel
/// channel MainFlutterWindow.awakeFromNib
override func applicationDidFinishLaunching(_ notification: Notification) {
super.applicationDidFinishLaunching(notification)
}
// FlutterViewController NIB
guard let controller = NSApplication.shared.windows.first?.contentViewController as? FlutterViewController else {
return
}
/// MethodChannelapps.xy.xianyan/macos.app
///
/// Flutter Dart Dart getCpuArchitecture
/// MissingPluginException
/// MainFlutterWindow.awakeFromNib FlutterViewController
static func registerAppChannel(controller: FlutterViewController) {
let appDelegate = NSApp.delegate as? AppDelegate
methodChannel = FlutterMethodChannel(
let channel = FlutterMethodChannel(
name: "apps.xy.xianyan/macos.app",
binaryMessenger: controller.engine.binaryMessenger
)
methodChannel?.setMethodCallHandler { [weak self] call, result in
channel.setMethodCallHandler { call, result in
switch call.method {
// ---------- CPU ----------
case "getCpuArchitecture":
let arch = getCpuArchitecture()
result(arch)
// ---------- Impeller ----------
// / Impeller
// Apple Silicon Intel Mac Metal bug
// Impeller UserDefaults
//
case "getImpellerEnabled":
let enabled = getImpellerEnabledWithDefault()
result(enabled)
// Impeller
// MainFlutterWindow.currentImpellerEnabled
// UI ""
case "getImpellerRunningStatus":
let running = MainFlutterWindow.currentImpellerEnabled
result(running)
case "setImpellerEnabled":
let args = call.arguments as? [String: Any]
let enabled = args?["enabled"] as? Bool ?? false
UserDefaults.standard.set(enabled, forKey: "xianyan_enable_impeller")
result(nil)
// ---------- ----------
// Impeller 使
//
case "restartApp":
let url = URL(fileURLWithPath: Bundle.main.bundlePath)
let config = NSWorkspace.OpenConfiguration()
config.activates = true
NSLog("[restartApp] 正在启动新实例: \(url.path)")
NSWorkspace.shared.openApplication(at: url, configuration: config) { newApp, error in
if let error = error {
NSLog("[restartApp] 启动新实例失败: \(error.localizedDescription)")
return
}
NSLog("[restartApp] 新实例已启动,延迟 800ms 后终止当前实例")
// 800ms
//
DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) {
NSLog("[restartApp] 终止当前实例")
NSApp.terminate(nil)
}
}
result(nil)
// ---------- Dock NSDockTile ----------
case "setDockBadge":
let args = call.arguments as? [String: Any]
@@ -56,14 +113,14 @@ class AppDelegate: FlutterAppDelegate {
case "updateStatusBarSentence":
let args = call.arguments as? [String: Any]
let sentence = args?["sentence"] as? String ?? ""
self?.updateStatusItem(sentence: sentence)
appDelegate?.updateStatusItem(sentence: sentence)
result(nil)
// ---------- Spotlight CoreSpotlight ----------
case "indexSpotlightItems":
let args = call.arguments as? [String: Any]
let items = args?["items"] as? [[String: Any]] ?? []
self?.indexSpotlightItems(items: items)
appDelegate?.indexSpotlightItems(items: items)
result(nil)
case "clearSpotlightIndex":
@@ -97,7 +154,7 @@ class AppDelegate: FlutterAppDelegate {
// ============================================================
/// 30
private func updateStatusItem(sentence: String) {
func updateStatusItem(sentence: String) {
if statusItem == nil {
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
statusItem?.button?.target = self
@@ -115,12 +172,50 @@ class AppDelegate: FlutterAppDelegate {
NSPasteboard.general.setString(currentSentence, forType: .string)
}
// ============================================================
// MARK: - CPU
// ============================================================
/// CPU Dart Intel Mac
///
/// `uname`
/// - `arm64` Apple Silicon (M1/M2/M3+)
/// - `x86_64` Intel CPU
///
/// Dart MethodChannel
/// Intel Mac
static func getCpuArchitecture() -> String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
return machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
}
/// Impeller
///
/// MainFlutterWindow.shouldEnableImpeller()
/// -
/// - Apple Silicon Intel Mac
///
/// Dart UI
static func getImpellerEnabledWithDefault() -> Bool {
let defaults = UserDefaults.standard
if defaults.object(forKey: "xianyan_enable_impeller") != nil {
return defaults.bool(forKey: "xianyan_enable_impeller")
}
// Apple Silicon Intel Mac
return getCpuArchitecture() != "x86_64"
}
// ============================================================
// MARK: - Spotlight CoreSpotlight
// ============================================================
/// Spotlight
private func indexSpotlightItems(items: [[String: Any]]) {
func indexSpotlightItems(items: [[String: Any]]) {
let searchableItems = items.map { item in
let attributeSet = CSSearchableItemAttributeSet(itemContentType: "public.text")
attributeSet.title = item["title"] as? String

View File

@@ -42,8 +42,7 @@
<string>NSApplication</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>闲言需要访问您的相册以选择和保存壁纸图片。</string>
<key>FLTEnableImpeller</key>
<true/>
<!-- FLTEnableImpeller 不在此声明,由原生代码根据用户设置动态控制 -->
<!-- URL Scheme — 供 xianyan:// 深度链接跳转 -->
<key>CFBundleURLTypes</key>
<array>

View File

@@ -1,21 +1,24 @@
/// ============================================================
/// APP macOS
/// : 2026-06-02
/// : 2026-06-24
/// : apps.xy.xianyan/macos MethodChannel
/// : menuItemIds XIB objectId
/// assignMenuItemIdentifiers menuItem identifier
/// setMenuLanguage languageId lproj/MainMenu.strings
/// NSApp.mainMenu
///
/// awakeFromNib
/// MainFlutterWindowManipulator.start(mainFlutterWindow: self)
/// reset() start(nil)
/// contentViewController FlutterViewController
/// MacOSWindowUtilsViewController 使 setMaterial/
/// setNSVisualEffectViewState
/// setExtraFlag fullSizeContentView + titlebarAppearsTransparent
/// 绿 Flutter DesktopWindowTitleBar
/// : 2026-06-25
/// : Impeller
/// apps.xy.xianyan/macos MethodChannel
/// : 1. currentImpellerEnabled Impeller
///
/// 2. getCurrentImpellerRunningStatus() AppDelegate channel
/// 3. setenv("FLUTTER_ENGINE_SWITCH_0") Impeller
/// Apple Silicon Intel Mac
/// 4. "" hideSystemTrafficButtons(of:)
/// awakeFromNib / setDarkMode / handleFullScreenExit
/// 绿 Flutter DesktopWindowTitleBar
/// 5. Intel Mac Apple Silicon
/// Mac Intel Mac使 MacOSWindowUtilsViewController
/// isOpaque/backgroundColorMainFlutterWindowManipulator.start()
/// titlebarAppearsTransparent/titleVisibility/fullSizeContentView
/// Intel Mac
/// Flutter Impeller
/// Apple Silicon Intel Mac
/// ============================================================
import Cocoa
@@ -33,10 +36,79 @@ class MainFlutterWindow: NSWindow, NSTouchBarDelegate {
/// Touch Bar [{label: "", action: "bold"}, ...]
private var touchBarItems: [[String: String]] = []
/// Impeller
///
/// awakeFromNib shouldEnableImpeller()
/// Flutter 使 Impeller
/// UserDefaults
/// UserDefaults
///
static var currentImpellerEnabled: Bool = false
// ============================================================
// MARK: - CPU
// ============================================================
/// Intel Macx86_64
///
/// Intel Mac GPU + NSVisualEffectView
///
/// Intel Mac 使
private static func isIntelMac() -> Bool {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let machine = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
return machine == "x86_64"
}
/// Impeller
///
/// Impeller Flutter Metal
/// Intel Mac /
///
///
/// - Apple Silicon (arm64): Impeller Metal
/// - Intel Mac (x86_64): Metal bug
///
///
///
/// - Returns: Impeller
private static func shouldEnableImpeller() -> Bool {
let defaults = UserDefaults.standard
//
// UserDefaults.bool key false""""
// object(forKey:) key
if defaults.object(forKey: "xianyan_enable_impeller") != nil {
return defaults.bool(forKey: "xianyan_enable_impeller")
}
// Apple Silicon Intel Mac
return !Self.isIntelMac()
}
override func awakeFromNib() {
let flutterViewController = FlutterViewController()
let windowFrame = self.frame
// Impeller FlutterViewController
// Flutter FLUTTER_ENGINE_SWITCH_<N>
// Info.plist FLTEnableImpeller
// Apple Silicon Intel Mac Metal bug
let enableImpeller = Self.shouldEnableImpeller()
let impellerArg = enableImpeller ? "--enable-impeller" : "--no-enable-impeller"
setenv("FLUTTER_ENGINE_SWITCH_0", impellerArg, 1)
// Impeller
// Dart
// UserDefaults UserDefaults
//
Self.currentImpellerEnabled = enableImpeller
// FlutterViewController
let flutterViewController = FlutterViewController()
// 使 MacOSWindowUtilsViewController FlutterViewController
// macos_window_utils setMaterial/setNSVisualEffectViewState/
// addVisualEffectSubview
@@ -46,6 +118,9 @@ class MainFlutterWindow: NSWindow, NSTouchBarDelegate {
// 'MacOSWindowUtilsViewController'"
// MacOSWindowUtilsViewController.loadView() NSVisualEffectView
// addChild(flutterViewController)
//
// Mac Intel Mac使 NSVisualEffectView
// macOS
let macOSWindowUtilsViewController = MacOSWindowUtilsViewController(
flutterViewController: flutterViewController
)
@@ -57,13 +132,20 @@ class MainFlutterWindow: NSWindow, NSTouchBarDelegate {
// [NSWindow setBackgroundColor:] NSThemeFrame._updateBackdropView removeFromSuperview
// Impeller raster 线 SetupRenderPass Release
// Dart
self.isOpaque = false
self.backgroundColor = NSColor.clear
//
// titlebarAppearsTransparent / titleVisibility / fullSizeContentView
// Mac Flutter DesktopWindowTitleBar
// "" + Flutter
//
// isOpaque / backgroundColor Mac
// NSVisualEffectView
self.titlebarAppearsTransparent = true
self.titleVisibility = .hidden
if !self.styleMask.contains(.fullSizeContentView) {
self.styleMask.insert(.fullSizeContentView)
}
self.isOpaque = false
self.backgroundColor = NSColor.clear
// MainFlutterWindowManipulator.start(mainFlutterWindow: self)
// macos_window_utils mainFlutterWindow
@@ -82,22 +164,38 @@ class MainFlutterWindow: NSWindow, NSTouchBarDelegate {
// configureMainFlutterWindow() contentViewController
// MacOSWindowUtilsViewController FlutterViewController
// configure
//
// Mac Intel Mac start() macos_window_utils
// mainFlutterWindow
MainFlutterWindowManipulator.start(mainFlutterWindow: self)
// start()
self.isOpaque = false
self.backgroundColor = NSColor.clear
// Mac start()
self.titlebarAppearsTransparent = true
self.titleVisibility = .hidden
if !self.styleMask.contains(.fullSizeContentView) {
self.styleMask.insert(.fullSizeContentView)
}
self.isOpaque = false
self.backgroundColor = NSColor.clear
// 绿
// Flutter DesktopWindowTitleBar macOS 绿
// ""
// setDarkMode setDarkMode
//
// Intel Mac Flutter
hideSystemTrafficButtons(of: self)
RegisterGeneratedPlugins(registry: flutterViewController)
// Flutter MethodChannel MissingPluginException
registerPlatformChannel(controller: flutterViewController)
// MethodChannelapps.xy.xianyan/macos.app
// Dart getCpuArchitecture MissingPluginException
AppDelegate.registerAppChannel(controller: flutterViewController)
// 退退
// macOS 退
NotificationCenter.default.addObserver(
@@ -141,11 +239,15 @@ class MainFlutterWindow: NSWindow, NSTouchBarDelegate {
@objc private func handleFullScreenExit(_ notification: Notification) {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
// NSVisualEffectView
// Mac
// macOS 退
self.titlebarAppearsTransparent = true
self.isOpaque = false
self.backgroundColor = NSColor.clear
// Flutter
self.titlebarAppearsTransparent = true
// 绿
// macOS standardWindowButton
// 退 Flutter
self.hideSystemTrafficButtons(of: self)
//
self.contentView?.needsDisplay = true
// Dart NSVisualEffectView
@@ -307,15 +409,35 @@ class MainFlutterWindow: NSWindow, NSTouchBarDelegate {
window.appearance = appearance
// Flutter
window.titlebarAppearsTransparent = true
// 绿 Flutter
window.standardWindowButton(.closeButton)?.isHidden = true
window.standardWindowButton(.miniaturizeButton)?.isHidden = true
window.standardWindowButton(.zoomButton)?.isHidden = true
// 0
if let contentView = window.contentView {
contentView.superview?.wantsLayer = true
}
}
// 绿
// hideSystemTrafficButtons()
hideSystemTrafficButtons()
}
/// 绿closeButton/miniaturizeButton/zoomButton
///
/// Flutter DesktopWindowTitleBar macOS 绿
/// ""
///
///
/// 1. `awakeFromNib`
/// 2. `setDarkMode`
/// 3. `handleFullScreenExit` 退
///
/// - Parameter window: nil `NSApplication.shared.windows`
/// setDarkMode
private func hideSystemTrafficButtons(of window: NSWindow? = nil) {
let windows = window.map { [$0] } ?? NSApplication.shared.windows
for win in windows {
win.standardWindowButton(.closeButton)?.isHidden = true
win.standardWindowButton(.miniaturizeButton)?.isHidden = true
win.standardWindowButton(.zoomButton)?.isHidden = true
}
}
/// light / dark

View File

@@ -0,0 +1,26 @@
{
"name": "WebRTC-SDK",
"version": "144.7559.09",
"summary": "WebRTC pre-compiled library for Darwin.",
"description": "WebRTC pre-compiled library for Darwin.\nThe binary files in this repository are compiled using Google WebRTC source code M version,\nand a series of optimization patches from the webrtc-sdk community have been added.",
"homepage": "https://github.com/webrtc-sdk/Specs",
"license": {
"type": "BSD",
"file": "WebRTC.xcframework/LICENSE"
},
"authors": "webrtc-sdk",
"platforms": {
"ios": "13.0",
"osx": "10.15",
"tvos": "17.0",
"visionos": "26.0"
},
"source": {
"http": "https://ghfast.top/https://github.com/webrtc-sdk/Specs/releases/download/144.7559.09/WebRTC.xcframework.zip"
},
"vendored_frameworks": "WebRTC.xcframework",
"pod_target_xcconfig": {
"EXCLUDED_ARCHS[sdk=appletvsimulator*]": "x86_64",
"EXCLUDED_ARCHS[sdk=xrsimulator*]": "x86_64"
}
}