Flutter 小技巧之升级适配 Xcode15

news2024/11/27 20:59:32

美好的 2024 从「适配」开始,按照苹果的尿性,2024 春季开始大家将不得使用 Xcode15 来构建 App ,另外根据《2024 的 iOS 的隐私清单》 要求,使用 Flutter 的开发者是无法逃避适配 Xcode15 更新的命运。

另外,众所周知,安装 Xcode15 需要系统升级到 macOS Sonoma ,而 Sonoma 版本无法直接使用 Xcode14 ,所以升级到 Sonoma 系统后你会看到 Xcode 无法打开,不要急,因为升级 Xcode15 现在只要 3G+ ,模拟器(7G+)部分可以下载完成后再手动二次下载,老板再也不用当心我更新 Xcode 时「摸鱼」了。

PS,如果因为特殊情况,你想先升级 Sonoma 又暂时想使用 Xcode14,但是不想降级系统 ,可以在命令行通过 /Applications/Xcode.app/Contents/MacOS/Xcode 执行激活 14 安装,然后通过命令行编译。

那么,接下来开始适配 Xcode15 吧~

Crash 问题

使用 Xcode 15 构建 Flutter 的时候,你可能会有低于 iOS 17 的真机设备上发现 App 运行崩溃,这个问题提交在 #136060 ,直接引发问题的点大部分来自引入的 Plugin,例如 connectivity_plus ,而核心问题其实算是 Xcode 本身的一个 bug。

解决问题的点很简单,就是将 IPHONEOS_DEPLOYMENT_TARGET 设置为 12.0 , 另外有时候 Xcode 可能会删除不受支持的IPHONEOS_DEPLOYMENT_TARGET 值,而导致使用了最新的 (17.0),这将导致二进制文件只能在 iOS 17+ 上启动。

类似问题也体现在如 connectivity_plus 4.xx 的 IPHONEOS_DEPLOYMENT_TARGET 为11.0,而现在connectivity_plus 5.0.0 中也调整到 12 从而规避问题。

另外,如果 Plugin 的 IPHONEOS_DEPLOYMENT_TARGET 影响编译,你也可以在 Profile 下添加 config.build_settings.delete 来强制移除。

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.delete 'IPHONEOS_DEPLOYMENT_TARGET' <--- add this

目前这个问题在模拟器上运行一般不会出现,主要是 Xcode 15 带有 IPHONEOS_DEPLOYMENT_TARGET 的 iOS 11(以前 Flutter 默认最低版本)在使用该 Networking 框架时会崩溃 ,具体表现在:

  • 16.x -> 崩溃
  • 17.0.x -> 正常

所以在升级到 Xcode 15 的时候,最好将 App 运行到 16.x 的真机上测试一下是否存在同样问题,目前看来主要是 iOS 的 Network 在存在 target iOS 11 导致,能够用 NWProtocolIP.Metadata NWEndpoint.hostPort 去复现,其实编译时也会有一些警告,只是一般都被大家忽略:

…/Test737672.xcodeproj The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 11.0, but the range of supported deployment target versions is 12.0 to 17.0.99.

Flutter/Flutter.h file not found

Flutter 在 Xcode 15 上的这个问题提交于 #135099 ,其实算是 Cocoapods 的问题,这个问题可能涉及DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead

根据反馈,基本上就是你升级 Cocoapods 升级到 v1.13.0 之后的版本就可以解决,注意升级之后记得手动重新运行 pod install 来确保正确执行,当然,如果你因为某些原因不想升级 Cocoapods ,那么可以临时通过CocoaPods 的 #12012#issuecomment-1659803356 ,在 Profile 下添加相关路径:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
    xcconfig_path = config.base_configuration_reference.real_path
    xcconfig = File.read(xcconfig_path)
    xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")
    File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
    end
  end
end

PS ,如果更新 pod 的时候,不知道卡在那里,可以通过 gem install cocoapods -v 1.13.0 -V 后面的 -V 看详细操作日志,如果是网络问题,可以通过 gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ 来解决,可以通过 gem sources -l 查看镜像地址。

Library ‘iconv.2.4.0’ not found

如果你在 Xcode 15 上运行发现如下所示错误,不要相信什么 other link flags add "-ld64" ,而是应该在 Build Phases > Link Binary With Libraries 下找到 iconv.2.4.0 ,然后删除它,然后添加 iconv.2,因为在 Xcode15 里,现在只有 iconv.2 。

Error (Xcode): Library 'iconv.2.4.0' not found

Error (Xcode): Linker command failed with exit code 1 (use -v to see invocation)

如果还有问题,可以全局搜索 ‘iconv.2.4.0’,在出来的文件里将 iconv.2.4.0 替换为 iconv.2 即可

最后

好了,Xcode 15 的适配上主要就这些问题,更多的还是《2024 的 iOS 的隐私清单》 部分的适配,属于审核要求,相比起代码上能解决的,平台要求就需要精神领会了,因为这些的要求内容其实很主观理解,总的来说, Flutter & Xcode 15 ,跑得通,可以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1365661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NFS 共享存储实验

一、服务器部署 第一步、安装nfs和rpcbind包 [rootserver ~]# yum install -y nfs-utils rpcbind截图&#xff1a; 第二步、这里选择一个 lvm 挂载点做 NFS 共享目录 [rootserver ~]# df -HT截图&#xff1a; 第三步、修改配置文件 [rootserver ~]# vi /etc/exports /home …

【数据库原理】(14)数据控制

数据控制也称为数据保护,包括数据的安全性控制、完整性控制、并发控制和恢复。 数据库的安全性是指保护数据库,防止不合法的使用所造成的数据泄露和破坏。数据库系统中保证数据安全性的主要措施是进行存取控制,即规定不同用户对不同数据对象所允许的执行操作&#xff0c;并规定…

干货|为什么选择独立站?

独立站就像是一个独立的王国&#xff0c;有自己独立的服务器、网站程序和域名。它与依赖平台的模式不同&#xff0c;搭建独立网站可以提供更好的用户体验&#xff0c;建立自己的私域流量&#xff0c;让商家与客户建立更紧密的联系。独立站与第三方平台没有关联&#xff0c;营销…

【控制篇 / 策略】(7.4) ❀ 01. IP地理位置数据库和地理址对象 ❀ FortiGate 防火墙

【简介】在很多使用环境下&#xff0c;我们需要对指定国家的IP地址进行允许或禁止访问操作&#xff0c;例如只允许访问国内IP、禁止访问美国IP等。在早期的配置中&#xff0c;只能手动添加IP地址对象到地址组&#xff0c;繁杂及效率低下&#xff0c;Fortinet提供了基于地理的IP…

oh-my-zsh nvm command not found

如果你在使用 oh-my-zsh 并且在终端输入 nvm 命令时提示 "command not found"&#xff0c;这可能是因为 oh-my-zsh 没有配置 nvm 插件导致的。 a、确保你已经在系统中安装了 nvm。如果没有安装&#xff0c;请参考 nvm 的文档安装。 b、打开 oh-my-zsh 的配置文件&a…

特朗普又搞事情了?这次他把矛头对准了林肯!

美国内战那段血腥历史被他翻了出来&#xff0c;争议四起。2024美国大选之年&#xff0c;两党有力竞选者接连发声&#xff0c;这可真是热闹了。据CNN报道&#xff0c;特朗普在艾奥瓦州举行的竞选集会上说&#xff0c;美国内战“本可以通过谈判”避免&#xff0c;林肯应该采取更多…

通过使用别名让 SQL 更简短-数据库教程shulanxt.com-帆软软件有限公司

MySQL视频教程导航 https://www.shulanxt.com/database/mysqlvideo/p1 SQL 别名 SQL 别名 通过使用 SQL&#xff0c;可以为表名称或列名称指定别名。 基本上&#xff0c;创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法 SELECT column_name AS alias_name FROM …

DevOps搭建(十五)-kubernetes部署项目详细步骤

1、k8s简介 k8s官网地址 https://kubernetes.io/zh-cn/docs/home/ 2、安装kuboard 详细步骤可参考官网 https://kuboard.cn/install/install-k8s.html 2.1、环境准备 至少 2 台 2核4G 的服务器。 选择v1.19&#xff0c;因为高版本的已经把docker给舍弃掉了。 https://k…

selenium如何使用隧道代理请求目标地址?

使用Selenium结合隧道代理IP可以通过以下步骤实现&#xff1a; 获取代理IP&#xff1a; 首先&#xff0c;你需要获得一个可用的隧道代理IP。你可以使用代理服务提供商&#xff08;巨量IP平台提供免费隧道代理测试&#xff09; 安装Selenium&#xff1a; 如果你还没有安装Selen…

redis报错:Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

Redis启动时报错&#xff1a; Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 这个错误说明已经开启了redis&#xff0c;并且已经占用了端口6379&#xff0c;需要停止redis后再开启。 redis-cli.exeshutdownexitredis-server redis.windows.conf 参考…

BurpSuite信息收集篇

BurpSuite信息收集篇 1.填充目标站点地图2.使用 Burp Suite 自动发现内容3.使用 Burp Suite 枚举子域1.填充目标站点地图 演示站点 ginandjuice.shop 1、抓取目标的请求包 2、在不关闭浏览器的情况下,转到目标>站点地图。请注意,已自动添加一个节点来表示目标域 3、右键…

react-native生命周期函数

生命周期函数 实例化阶段&#xff08;图中上框部分&#xff09;&#xff0c;存在阶段&#xff08;图中左框部分&#xff09;&#xff0c;销毁阶段&#xff08;图中右框部分&#xff09; 实例化阶段 开发中&#xff0c;常用的就是实例化阶段&#xff0c;因为该阶段是组件的构建&…

不同像平面坐标系下的Brown畸变系数互转

不同像平面坐标系下Brown畸变系数转换 记 u , v u,v u,v为像素为单位的坐标&#xff0c;f为焦距&#xff0c;单位也是像素。 记 x , y x,y x,y为理想坐标。本文推导两种情况下的Brown畸变系数转换关系&#xff1a; 相同坐标系定义、不同的坐标单位&#xff08;像素坐标与归一…

QT如何修改项目名称

#打开项目 这里以项目start1为例 修改start1为hds 首先删除这个文件 之后打开CmakeLists.txt文件修改里面的项目名称把里面含有start1的全部写成hds。一般是3个地方 重新打开hds文件 configure Project一下 可以看到跑出来是一样的。到此项目的名称就改过来了。

element plus 表格组件怎样在表格中显示图片

官方给的&#xff1a; <el-table-column label"Thumbnail" width"180"><template #default"scope"><div style"display: flex; align-items: center"><el-image :preview-src-list"srcList"/><…

搭建Github Page完全手册

一、前期准备 注册Github账号&#xff08;必备&#xff09;下载GitHub Desktop&#xff1a;下载链接&#xff08;可使用git代替&#xff09;模板选择网站&#xff1a; jekyllthemes.orggohugomademistakes 二、快速入门 1.模板参考 作者使用的模板来源&#xff1a;https://…

灌区信息化方案(什么是现代化灌区,如何一步到位)

一、系统概述 详情&#xff1a;https://www.key-iot.com.cn/ 本灌区信息化方案以星创易联公司的各类智能设备为基础,通过其产品完成水文、雨情、土壤等多源异构数据的采集,以无线自组网的方式实现数据传输,并在后台管理中心建立信息化软件平台,对数据进行融合处理。系统实现对…

MYSQL双主节点–更换ip

MYSQL双主节点–更换ip 一、更换双主节点ip 1.停止mysql服务 #安装了supervisor supervisorctl stop mysql #未安装 systemctl stop mysqld2.修改网卡配置信息 注&#xff1a;ens33是网卡名称&#xff0c;可能网卡不叫ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens333…

小样本学习介绍(超详细)

小样本学习介绍 本文首先介绍了什么是小样本学习&#xff0c;其次介绍了为什么小样本学习的很多文章都采用元学习的方法。目的是通过通俗的解释更加清楚的介绍小样本学习是什么&#xff0c;适合初学者的入门。当然&#xff0c;以下更多的是自己的思考&#xff0c;欢迎交流。 …

频率域滤波图像复原的python实现——数字图像处理

原理 维纳滤波的原理是基于统计方法&#xff0c;旨在通过最小化信号的估计误差来改善信号的质量。它在处理具有噪声干扰的信号时特别有效。维纳滤波旨在从受噪声干扰的信号中恢复原始信号。它假设信号和噪声都是随机过程&#xff0c;并且它们的统计特性是已知的或可估计的。维…