Flutter集成youtube_player_flutter时iOS编译失败问题求助
Flutter集成YouTube播放器iOS编译失败(flutter_inappwebview依赖报错)
问题说明
我在Flutter应用中集成YouTube播放器,使用youtube_player_flutter: ^8.0.0包,但iOS编译失败。由于设备是MacBook Mid 2012,无法安装最新版Xcode,当前Xcode版本为12.4,因此使用Flutter 2.5.3版本。编译错误来自依赖的flutter_inappwebview-5.5.0+2,核心问题是MyCookieManager.swift中domainUrl.host()调用失败(提示“无法调用非函数类型'String?'”),同时伴随多处API弃用警告。已修改Podfile设置IPHONEOS_DEPLOYMENT_TARGET为'9.0',但问题未解决。
编译报错详情
Xcode build done. 43.0s Failed to build iOS app Error output from Xcode build: ↳ ** BUILD FAILED ** Xcode's output: ↳ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppBrowser/InAppBrowserWebViewController.swift:562:13: warning: setter for 'statusBarStyle' was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle] UIApplication.shared.statusBarStyle = UIStatusBarStyle(rawValue: previousStatusBarStyle)! ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppWebView/InAppWebView.swift:521:31: warning: 'mediaPlaybackRequiresUserAction' was deprecated in iOS 9.0 configuration.mediaPlaybackRequiresUserAction = options.mediaPlaybackRequiresUserGesture ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppWebView/InAppWebView.swift:932:31: warning: 'mediaPlaybackRequiresUserAction' was deprecated in iOS 9.0 configuration.mediaPlaybackRequiresUserAction = newOptions.mediaPlaybackRequiresUserGesture ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppWebView/InAppWebViewOptions.swift:103:81: warning: 'mediaPlaybackRequiresUserAction' was deprecated in iOS 9.0 realOptions["mediaPlaybackRequiresUserGesture"] = configuration.mediaPlaybackRequiresUserAction ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/MyCookieManager.swift:260:44: error: cannot call value of non-function type 'String?' domain = domainUrl.host() ^ ~~ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/MyCookieManager.swift:294:44: error: cannot call value of non-function type 'String?' domain = domainUrl.host() ^ ~~ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/Types/URLCredential.swift:14:25: warning: comparing non-optional value of type '[Any]' to 'nil' always returns true if certificates != nil { ~~~~~~~~~~~~ ^ ~~~ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/Util.swift:216:21: warning: immutable value 'j' was never used; consider replacing with '_' or removing it for j in ipv6.count...8 { ^ _ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppBrowser/InAppBrowserWebViewController.swift:562:13: warning: setter for 'statusBarStyle' was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle] UIApplication.shared.statusBarStyle = UIStatusBarStyle(rawValue: previousStatusBarStyle)! ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppWebView/InAppWebView.swift:521:31: warning: 'mediaPlaybackRequiresUserAction' was deprecated in iOS 9.0 configuration.mediaPlaybackRequiresUserAction = options.mediaPlaybackRequiresUserGesture ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppWebView/InAppWebView.swift:932:31: warning: 'mediaPlaybackRequiresUserAction' was deprecated in iOS 9.0 configuration.mediaPlaybackRequiresUserAction = newOptions.mediaPlaybackRequiresUserGesture ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/InAppWebView/InAppWebViewOptions.swift:103:81: warning: 'mediaPlaybackRequiresUserAction' was deprecated in iOS 9.0 realOptions["mediaPlaybackRequiresUserGesture"] = configuration.mediaPlaybackRequiresUserAction ^ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/MyCookieManager.swift:260:44: error: cannot call value of non-function type 'String?' domain = domainUrl.host() ^ ~~ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/MyCookieManager.swift:294:44: error: cannot call value of non-function type 'String?' domain = domainUrl.host() ^ ~~ /Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/ Classes/Types/URLCredential.swift:14:25: warning: comparing non-optional value of type '[Any]' to 'nil' always returns true if certificates != nil { ~~~~~~~~~~~~ ^ ~~~ Command CompileSwift failed with a nonzero exit code ... Could not build the application for the simulator. Error launching application on iPhone 12 Pro Max.
已尝试的Podfile配置
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0' end end end
环境信息
[✓] Flutter (Channel stable, 2.5.3, on Mac OS X 10.15.7 19H15 darwin-x64, locale en-ET) • Flutter version 2.5.3 at /Users/mobix/Development/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 18116933e7 (1 year ago), 2021-10-15 10:46:35 -0700 • Engine revision d3ea636dc5 • Dart version 2.14.4 [✓] Xcode - develop for iOS and macOS • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 12.4, Build version 12D4e • CocoaPods version 1.11.3 ...
解决方案
1. 直接修改flutter_inappwebview源码修复语法错误
报错核心是Swift版本兼容性:Xcode 12对应的Swift版本中,URL.host是属性而非方法,不需要加括号。操作步骤:
- 找到本地pub缓存文件:
/Users/mobix/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_inappwebview-5.5.0+2/ios/Classes/MyCookieManager.swift - 定位第260行和第294行,将
domainUrl.host()修改为domainUrl.host - 执行以下命令重新构建:
flutter clean && flutter pub get && cd ios && pod install && cd .. && flutter run
2. 锁定兼容版本的flutter_inappwebview
如果不想修改源码,可在pubspec.yaml中指定与Xcode 12兼容的flutter_inappwebview版本,比如4.0.0+4(需确认与youtube_player_flutter: ^8.0.0兼容):
dependencies: youtube_player_flutter: ^8.0.0 flutter_inappwebview: 4.0.0+4
然后执行:
flutter clean && flutter pub get && cd ios && pod update && cd ..
3. 消除API弃用警告(可选)
弃用警告不影响编译,若要消除,可在Podfile的post_install块中添加Swift版本指定:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0' config.build_settings['SWIFT_VERSION'] = '5.3' # Xcode 12.4支持的Swift版本 end end end
内容的提问来源于stack exchange,提问作者Mohammed Bekele
相关产品推荐
相关产品推荐

