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。

相关推荐
problc25 分钟前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
青花瓷8 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
lqj_本人9 小时前
鸿蒙next选择 Flutter 开发跨平台应用的原因
flutter·华为·harmonyos
2401_8658548810 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
lqj_本人12 小时前
Flutter&鸿蒙next 状态管理框架对比分析
flutter·华为·harmonyos
起司锅仔16 小时前
Flutter启动流程(2)
flutter
hello world smile19 小时前
最全的Flutter中pubspec.yaml及其yaml 语法的使用说明
android·前端·javascript·flutter·dart·yaml·pubspec.yaml
lqj_本人19 小时前
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
flutter·harmonyos
iFlyCai19 小时前
极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果
flutter
lqj_本人20 小时前
Flutter&鸿蒙next 中使用 MobX 进行状态管理
flutter·华为·harmonyos