iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊
前言
中秋节过后,电脑收到了 macOS Sequoia
更新,Xcode
也来到 16
,支持 iOS 18
开发。
Flutter 相关问题
我特意看了下 flutter
相关的问题
没有忍住笑,还有用 2.x.x
版本的同学。前 2
个日志都没有提供,然后最后 2
个已经关闭。
都是 beta
通道工具问题。
貌似没有能阻止我更新的问题。
iOS 18 启动
尽管知道肯定有坑,大家都说狗住狗住,但是还是义无反顾的按下了更新键。
iOS 18 启动
iOS
terminate_handler
使用到 terminate_handler
的代码编译会报错如下:
解决方案是添加引用
#include <exception>
Undefined symbols: __mh_execute_header
如果你的代码里面用到 _mh_execute_header
,你会得到以下错误:
Undefined symbols for architecture x86_64:
"__mh_execute_header", referenced from:
Linker changes in Xcode 16 / macOS… | Apple Developer Forums
已知问题:某些大型或复杂项目在扫描其二进制文件中的特定 Mach-O 段时,可能会构建或运行失败。(123416939)
解决方法: 尝试将构建设置中的
ENABLE_DEBUG_DYLIB
设为NO
。此操作将禁用用于新预览执行模式的调试 dylib。将其设为 NO 后,仍可以在 Xcode 16 Seed 1 中使用旧的执行模式进行预览,但该模式的支持将在未来的版本中被移除。
AddSubview maskView Crash
如果在自定义的 UIView
里面定义了一个叫 maskView
的属性,并尝试将它添加为 subview
的时候,会得到以下报错:
Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'Set `maskView` (<UIView: 0x7ff565577e60; frame = (0 0; 0 0); layer = <CALayer: 0x600003a63a20>>) to `nil` before adding it as a subview of <XXXView: 0x7ff565541770;
frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x600003a63a40>>'
xcode16 AddSubview crash · Issue #1557 · Tencent/QMUI_iOS (github.com)
解决方案是将自定义的
UIView
里面的这个maskView
属性名字修改为其他名字
即 UIView *maskView;
改成 UIView *maskView1;
pod init failed
用 Xcode16
创建一个新项目, pod init
失败。
pod init failed in Xcode 16 · Issue #12583 · CocoaPods/CocoaPods (github.com)
解决方案:
- 右键项目根文件夹,转换为group(
Convert to Group
)
- 右键点击
projectname.xcodeproj
文件,并选择“显示包内容” 你会看到project.pbxproj
文件,可以用文本编辑器打开它
在这个文件中,删除以下行:
minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77;
同时,更新版本信息,将 objectVersion = 77;
改成 objectVersion = 56;
Flutter
firebase
集成 firebase
报错如下:
Failed to build iOS app
Lexical or Preprocessor Issue (Xcode): Include of non-modular header inside framework module 'firebase_messaging.FLTFirebaseMessagingPlugin': '/Users/[path]/[App Folder]l/ios/Pods/Headers/Public/Firebase/Firebase.h'
/Users/[path]/.pub-cache/hosted/pub.dev/firebase_messaging-15.0.1/ios/Classes/FLTFirebaseMessagingPlugin.h:11:8
解决方法: 增加
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES
配置并且设置为YES
PRODUCT_NAME 中文运行报错
项目运行显示空白,并且报下面的错误
原因是 PRODUCT_NAME
如果是中文就有这个问题。
将 PRODUCT_NAME
改成英文,然后在代码里面动态设置标题。
低版本 Flutter
针对高版本的 Flutter
(3.24.x
) ,暂时没有发现其他问题。以下内容是针对低版本,比如我这里是使用的 3.0.5
,最后一个支持 ios 9.0
的 Flutter SDK
。
因为在 3.0.5
运行失败,下面是根据日志自行查找问题的过程。
legacy flag
运行 flutter run -v
,第一个发现错误是下面的错误,这个应该不是最终导致编译失败的原因,因为编译日志断在后面。
/usr/bin/arch -arm64e xcrun xcresulttool get --path /var/folders/fm/wjzsj_z95ydgn4khxqgbtqx000mfq2/T/flutter_tools.PkqAFW/flutter_ios_build_temp_dirFAy4yP/temporary_xcresult_bundle --format json
[ +856 ms] Error: This command is deprecated and will be removed in a future release, --legacy flag is required to use it.
Usage: xcresulttool get object [--legacy] --path <path> [--id <id>] [--version <version>] [--format <format>]
See 'xcresulttool get object --help' for more information.
搜索了一下 issue
,发现最新才合并的一个问题:
按照提示修改了 github.com/flutter/flu… 代码。
删除本地 Flutter SDK
中
flutter/bin/cache/flutter_tools.snapshot
和
flutter/bin/cache/flutter_tools.stamp
执行 flutter doctor
重新编译 flutter_tools
,再次运行项目,还是报错。
bitcode 导致的报错
运行 flutter run -v
,跟踪到 process.dart
执行一个命令时报错。
arget debug_universal_framework failed: ProcessException: Process exited abnormally:
ld: warning: -bitcode_bundle is no longer supported and will be ignored
ld: warning: -bitcode_process_mode is no longer supported and will be ignored
ld: file cannot be open()ed, errno=2 path=marker in 'marker'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command: /usr/bin/arch -arm64e xcrun clang -x c -arch arm64
/var/folders/dh/g2znj0xd5w33ywhvv4wxvd240000gn/T/flutter_tools.RthOAn/flutter_tools_stub_source.62gemK/debug_app.cc -dynamiclib
-fembed-bitcode-marker
-miphonesimulator-version-min=9.0 -Xlinker -rpath -Xlinker @executable_path/Frameworks -Xlinker -rpath -Xlinker @loader_path/Frameworks
-install_name
@rpath/App.framework/App -isysroot
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator18.0.sdk -o
/Users/zmtzawqlp/Documents/flutter/github/abcd/.dart_tool/flutter_build/57ba3070442bc6d1a61e4871c8443a69/App.framework/App
#0 RunResult.throwException (package:flutter_tools/src/base/process.dart:124:5)
#1 _DefaultProcessUtils.run (package:flutter_tools/src/base/process.dart:276:19)
定位到:ld: file cannot be open()ed, errno=2 path=marker in 'marker' clang: error: linker command failed with exit code 1 (use -v to see invocation)
后面的 /usr/bin/arch -arm64e xcrun clang -x c -arch arm64
为命令的开始,后面的是各种参数。 -fembed-bitcode-marker
这个东西很显眼,跟我们的报错信息也有关联。
找到本地 Flutter SDK
文件位置为:
flutter/packages/flutter_tools/lib/src/build_system/targets/ios.dart
翻看了最新的 Flutter SDK
记录,发现这个命令已经在
接着我们注释掉 -fembed-bitcode-marker
,然后
删除本地 Flutter SDK
中
flutter/bin/cache/flutter_tools.snapshot
和
flutter/bin/cache/flutter_tools.stamp
执行 flutter doctor
重新编译 flutter_tools
,再次运行项目, 成功。
注意,去掉
-fembed-bitcode-marker
只能保证你debug
运行成功,Stop embedding bitcode for iOS in tool by jmagman · Pull Request #112831 · flutter/flutter (github.com) 中的改动请都修改完成。
结语
每次 Xcode
升级,都会带来新的惊喜,既然早晚都要适配,为啥头铁的不可以是我呢?如果发现其他问题,将持续更新,也欢迎大家反馈。
爱 Flutter
,爱糖果
,欢迎加入Flutter Candies,一起生产可爱的Flutter小糖果QQ群:181398081
最最后放上 Flutter Candies 全家桶,真香。
转载自:https://juejin.cn/post/7416166317986562088