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
QQ群:181398081
最最后放上 Flutter Candies 全家桶,真香。

转载自:https://juejin.cn/post/7416166317986562088




