上一篇刚吐槽完 vue 的生态插件晋级后出幺蛾子的问题Vue – Official 请降级到 1.8.x。
今日又轮到 Xcode 晋级到 15.3,项目构建失利了,打工人真不易。
当然,最快速的方法是先降回 14.x「手动狗头」,但笔者细心研究了下,感觉等新版苹果帮你做兼容可能不现实了,原因文中会讲 ~
假如你的项目比较新,没有什么历史包袱,那祝贺你,晋级上去也不会有什么问题,斗胆的造。
假如晋级后遇到笔者这三个问题,希望能帮助到你快速处理掉。
问题一:附件报错 CompileAssetCatalog failed
报错信息如上截图,构建过程中,一个编译附件图片的工具挂掉了。对,他便是这么任性的崩了 …
处理方法
查看如图所示,报错报出来的 assets 目录中的 SVG 文件,搜索这些 SVG 文件内容是否使用了objectBoundingBox
且它们的高度/宽度 > 100%。假如有,换个图或者改为 100% 以内。
原因
XCode 15.3 Command CompileAssetCatalog failed with a nonzero exit code 这个帖子有人说到,这感觉是苹果做了强校验导致的,处理方法其实也在这帖子的回复里面:
笔者项目里的出问题的 SVG 也没什么用了,所以直接删去处理 ~
问题二:C++ 枚举报错
笔者是报这个integer value -1 is outside the valid range of values [0, 3] for this enumeration type但其他枚举相关的应该都可以用相同方法处理。
处理方法
post_install do |installer|
pod_targets = installer.pods_project.targets
pod_targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['WARNING_CFLAGS'] = '-Wno-enum-constexpr-conversion'
end
end
end
直接设置一切的 pod 库房,-Wno-enum-constexpr-conversion
疏忽掉枚举的报错问题。
假如是在主工程,那就在主工程的settings
中加上这句:
原因
这个跟 Clang 晋级了有关,C++ 的枚举检测出反常,从警告等级上升到报错等级,简而言之便是代码查看更完善了,但对于咱们这种引用库都是2,3年前的,无人保护的代码来说,便是场灾难 ~
好在可以疏忽掉这个报错 ~
详细是翻到这篇文章:reviews.llvm.org/D150226 尽管不是说的 XCode,但的确给了笔者创意,应用了他们的改法。
问题三:C++ 代码报错 std::function 找不到
相似这种。
处理方法
post_install do |installer|
pod_targets = installer.pods_project.targets
pod_targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']
end
end
end
加上这个_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION
即可。
原因
这个是从这篇 RN 的文章找到的:github.com/facebook/re…
这里面说到:
这是由于 XCode 晋级 15 后抛弃了一些过时方法:
附上官网:Xcode 15 Release Notes,的确晋级了许多东西,也抛弃了许多,抛弃往往意味着老项目就会脸着地 …
另外
这个问题的确是花时间最多的,主要原因是笔者公司项目有个出问题的二方库,且是编译成 xcFramework 依靠的,而这一部分加这句是没效果的,笔者项目一直报错 std::function 找不到,最终从 GPT 找到的创意:
最终翻出这个出问题的、两年没人保护的二方库(好在曾经的开发很贴心留的 Demo 测验工程还能用),公然,Demo 也编译不过,还是会报这个问题。
原因是没有包括<functional>
头文件 ???!!!那曾经是怎样编译过的,也是百思不得其解 …
加上头文件后,一切正常:
然后便是打包 xcFramework,发布到公司的二方库房上,从头依靠新版本,构建成功 ~
总结
现在 iOS 开发也不多了,新项目就更少了,保护的老项目晋级起来的确问题许多,但假如不处理,会越来越多 ~ 且行且珍惜 ~