Flutter问题记录 - 适配Xcode 16和iOS 18

文章目录

  • 前言
  • 开发环境
  • 问题及解决方案
    • [1. Upload Symbols Failed](#1. Upload Symbols Failed)
    • [2. type 'UIApplication' does not conform to protocol 'Launcher'](#2. type 'UIApplication' does not conform to protocol 'Launcher')
    • [3. method does not override any method from its superclass](#3. method does not override any method from its superclass)
  • 最后

前言

为了新的镜像功能升级了macOS 15和iOS 18,Xcode也不可避免的需要升级到Xcode 16,老版本没办法在新系统上使用。每次大版本升级,带来新功能的同时也会带来一些问题,需要去适配去修复。

但有一说一,这个镜像功能真好用,声音/通知都会转发到电脑上,最重要的是,真机调试可以直接在电脑上操作,无需拿起手机

开发环境

  • Flutter: 3.22.3
  • Xcode: 16.0
  • iOS: 18.0

问题及解决方案

1. Upload Symbols Failed

项目打包上传到AppStore出现如下警告提示:

看提示是缺少符号文件。这个问题已经修复了,相关issuePR如下:

可以将Flutter升级到当前最新版本3.24.3解决该问题。不过,由于该版本的字体渲染有问题,所以我还是继续降级使用,毕竟只是个警告,目前暂时还不影响提交上架。

2. type 'UIApplication' does not conform to protocol 'Launcher'

这是关于url_launcher库的报错:

text 复制代码
.../url_launcher_ios-6.3.0/ios/url_launcher_ios/Sources/url_launcher_ios/Launcher.swift:22:1: error: type 'UIApplication' does not conform to protocol 'Launcher'
extension UIApplication: Launcher {}
^
UIKit.UIApplication:24:15: note: candidate has non-matching type '(URL, [UIApplication.OpenExternalURLOptionsKey : Any], (@MainActor @Sendable (Bool) -> Void)?) -> Void'
    open func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:], completionHandler completion: (@MainActor @Sendable (Bool) -> Void)? = nil)
              ^
.../url_launcher_ios-6.3.0/ios/url_launcher_ios/Sources/url_launcher_ios/Launcher.swift:15:8: note: protocol requires function 'open(_:options:completionHandler:)' with type '(URL, [UIApplication.OpenExternalURLOptionsKey : Any], ((Bool) -> Void)?) -> ()'; add a stub for conformance
  func open(
       ^

结合源码,可知问题出在了Launcher协议中的open方法,UIApplicationopen方法新增了@MainActor@Sendable修饰,导致方法签名不匹配报错。

目前通过定义新包装类DefaultLauncher的方式,修复了该问题,详情请看:

除了定义新包装类的方式,Launcher协议中的open方法增加@MainActor@Sendable修饰应该也能修复问题。

按理说,升级项目中的url_launcher库后该问题应该就解决了,但是针对这个问题,url_launcher库并没有发布新版本,只有它所依赖的url_launcher_ios库发布了6.3.1新版本。你可以参考以下两种方法解决这个问题:

  1. 修改pubspec.lock文件:
yaml 复制代码
url_launcher_ios:
  dependency: transitive
  description:
    name: url_launcher_ios
    sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
    url: "https://pub.flutter-io.cn"
  source: hosted
  version: "6.3.0"

删除sha256这一行以及将version改为6.3.1,然后重新运行pub get

  1. 修改pubspec.yaml文件:
yaml 复制代码
dependency_overrides:
  url_launcher_ios: ^6.3.1

增加以上内容,强制指定url_launcher_ios库的版本。

3. method does not override any method from its superclass

这是关于flutter_inappwebview库的报错(截取部分):

text 复制代码
.../flutter_inappwebview_ios-1.0.13/ios/Classes/InAppWebView/InAppWebView.swift:1432:26: error: method does not override any method from its superclass
    public override func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil) {
                         ^
WebKit.WKWebView:46:26: note: potential overridden instance method 'evaluateJavaScript(_:completionHandler:)' here
    @MainActor open func evaluateJavaScript(_ javaScriptString: String, completionHandler: (@MainActor @Sendable (Any?, (any Error)?) -> Void)? = nil)
                         ^

.../flutter_inappwebview_ios-1.0.13/ios/Classes/InAppWebView/InAppWebView.swift:1036:21: error: ambiguous use of 'evaluateJavaScript(_:completionHandler:)'
                    evaluateJavaScript(NOT_ENABLE_VIEWPORT_SCALE_JS_SOURCE)
                    ^

这错误看上去和第二个问题很像,没错,又是因为方法增加了@MainActor@Sendable修饰导致的。该问题已经通过增加@MainActor@Sendable修饰的方式修复了,详情请看:

flutter_inappwebview库新版本发布前可以先通过以下方式解决:

yaml 复制代码
dependency_overrides:
  flutter_inappwebview_ios:
    git:
      url: https://github.com/andychucs/flutter_inappwebview.git
      ref: master
      path: flutter_inappwebview_ios

pubspec.yaml文件中增加以上内容,强制指定flutter_inappwebview_ios库的来源。

最后

如果这篇文章对你有所帮助,点赞👍收藏🌟支持一下吧,谢谢~


本篇文章由@crasowas发布于CSDN。

相关推荐
TT_Close36 分钟前
别劝退了!5秒搞定 Flutter 鸿蒙 FVM 起跑线
flutter·harmonyos·visual studio code
你听得到114 小时前
用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台
前端·flutter·性能优化
编程范式1 天前
SwiftUI 中图片如何适配可用空间
ios
stringwu2 天前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
程序员老刘3 天前
Flutter版本选择指南:3.44系列继续观望 | 2026年6月
flutter·ai编程·客户端
songgeb3 天前
启发式 UI 自动化:从线性剧本到每步读屏决策
ios·测试
用户965597361904 天前
Provider vs Bloc vs GetX vs Riverpod:Flutter 状态管理方案怎么选?
flutter
恋猫de小郭4 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter
程序员老刘5 天前
跑分第一的编程大模型,我为啥不用?
flutter·ai编程·vibecoding
恋猫de小郭5 天前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter