likes
comments
collection
share

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

作者站长头像
站长
· 阅读数 19

前言

中秋节过后,电脑收到了 macOS Sequoia 更新,Xcode 也来到 16,支持 iOS 18 开发。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

Flutter 相关问题

我特意看了下 flutter 相关的问题

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

没有忍住笑,还有用 2.x.x 版本的同学。前 2 个日志都没有提供,然后最后 2 个已经关闭。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

都是 beta 通道工具问题。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

貌似没有能阻止我更新的问题。

iOS 18 启动

尽管知道肯定有坑,大家都说狗住狗住,但是还是义无反顾的按下了更新键。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

iOS 18 启动

iOS

terminate_handler

使用到 terminate_handler 的代码编译会报错如下:

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

Update SentryCrashMonitor_CPPException.cpp to include exception by Brett-Best · Pull Request #4051 · getsentry/sentry-cocoa (github.com)

解决方案是添加引用 #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 中使用旧的执行模式进行预览,但该模式的支持将在未来的版本中被移除。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

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)

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

  • 右键点击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

[firebase_messaging]: (Beta) Build Error Using iOS 18 SDK, Xcode 16. · Issue #12993 · firebase/flutterfire (github.com)

解决方法: 增加 CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES 配置并且设置为 YES

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

PRODUCT_NAME 中文运行报错

项目运行显示空白,并且报下面的错误

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

App is blank on macOS Sequoia 15 when app has a Chinese name and OS system language is set to Chinese · Issue #154400 · flutter/flutter (github.com)

原因是 PRODUCT_NAME 如果是中文就有这个问题。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

PRODUCT_NAME 改成英文,然后在代码里面动态设置标题。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

低版本 Flutter

针对高版本的 Flutter (3.24.x) ,暂时没有发现其他问题。以下内容是针对低版本,比如我这里是使用的 3.0.5 ,最后一个支持 ios 9.0Flutter 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 ,发现最新才合并的一个问题:

Add xcresulttool --legacy flag for deprecated usage by jmagman · Pull Request #152988 · flutter/flutter (github.com)

按照提示修改了 github.com/flutter/flu… 代码。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

删除本地 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

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

翻看了最新的 Flutter SDK 记录,发现这个命令已经在

Stop embedding bitcode for iOS in tool by jmagman · Pull Request #112831 · flutter/flutter (github.com) 中删除掉了。

接着我们注释掉 -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小糖果iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊QQ群:181398081

最最后放上 Flutter Candies 全家桶,真香。

iOS/Flutter: Only Xcode16 Can Do (问题收集)每次 `Xcode` 升级,都会带来新的惊

转载自:https://juejin.cn/post/7416166317986562088
评论
请登录