iOS问题记录 - Xcode 14.3版本运行项目报错

Posted crasowas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS问题记录 - Xcode 14.3版本运行项目报错相关的知识,希望对你有一定的参考价值。

文章目录


前言

看到Xcode有新版本,没忍住点了升级,然后问题来了。

开发环境

  • macOS 13.3
  • Xcode: 14.3

问题描述

Xcode 14.2版本运行项目一切正常,升级到14.3版本后运行报错。

运行到模拟器的报错信息:

ld: file not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)

运行到真机的报错信息:

ld: file not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)

问题分析

从报错信息看,都是在链接库的时候因为找不到静态库(libarclite_iphonesimulator.a/libarclite_iphoneos.a)而报错。利用访达的前往文件夹功能快速来到报错信息中的目录,发现连arc目录都不存在,更不用说静态库文件。

现在可以确定的是Xcode 14.2版本肯定是正常的,那会不会是14.3版本移除了整个arc目录?找到一台还没升级到Xcode 14.3版本的电脑,在同样的路径下,果然存在arc目录:

既然是因为找不到库导致的问题,那我复制arc目录到Xcode 14.3版本中是否可行呢?实测可行,不管是模拟器还是真机,运行一切正常。不过,既然Xcode决定移除这个arc目录,说明这个可能真的已经过时,难道以后都不需要再链接这些库用于支持ARC

找到Xcode 14.3的发布说明,翻了翻并没有看到有关这方面的说明。看来只能去苹果开发者论坛找找看,搜索报错信息找到相关的问题,一位苹果员工给出了回复:

这个回复简单概括起来就是说,因为系统已经内置有ARC相关的库,所以没必要再额外链接,至少Xcode 14支持的最低部署目标ios 11及以上版本的系统肯定是没问题的。如果应用部署目标不低于iOS 11还出现问题,那么应该是第三方库的部署目标有问题。

现在Xcode 14.3移除arc目录的原因已经很清楚,是因为支持的最低部署版本的系统都已经内置了ARC相关的库。如果应用最低部署目标版本本身不低于iOS 11,解决这个问题很简单,只需要将第三方库部署目标的iOS版本设置成和应用最低部署目标的iOS版本一致。

在我的项目中,应用最低部署目标是iOS 11.0版本:

Podfile文件中加上:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
    end
  end
end

这段代码的作用是先获取Pods项目(pods_project)中的目标数组(targets),然后遍历目标数组通过目标对象(target)获取构建配置数组(build_configurations),最后遍历构建配置数组修改构建配置对象中的构建设置(build_settings),将iOS 部署目标版本设为11.0

经过以上操作,实测不再报错。不过,还有疑问没解决,我手上还有老项目的最低部署目标是iOS 9版本,难道老项目只能用Xcode 14.3以下版本或复制一份arc目录到Xcode 14.3?

带着疑问,我用Xcode 14.3运行了老项目,结果一切正常!这差点给我整不会了。找到老项目中的Podfile文件,发现已经有设置第三方库部署目标的iOS版本:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
    end
  end
end

🤔️咦,难道iOS 9.0系统就已经内置了ARC相关的库?

先试试将9.0改为8.0,执行pod install命令后重新运行项目,结果报错。将8.0恢复为9.0,再做一次测试,执行pod install命令后修改手动某个库的部署目标为8.0,重新运行项目,不出意外还是报错,而且就剩刚才改过部署目标的库在报错。实测将8.0改为iOS 8的最后一个版本8.4.1还是报错。

综上,由于Xcode 14.3版本移除了ARC相关的库,从而导致一些默认部署目标是iOS 8版本的第三方库出现报错。只要最低部署目标不低于iOS 9版本,运行项目时就不会去链接ARC相关的库,也就不会出现找不到库的报错。

解决方案

  • 如果应用最低部署目标大等于iOS 9版本

Podfile文件中加上:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
    end
  end
end

11.0版本不是固定的,首先肯定要大于9.0版本,其次也不能高于应用最低部署目标版本,然后太低也可能会低于一些第三方库的部署目标版本,所以尽可能和应用最低部署目标版本保持一致即可。

  • 如果应用最低部署目标小于iOS 9版本

这种老项目应该很少了吧,如果真的是属于这种情况,又不想升最低部署目标版本,建议从以下方法任选一种:

  1. 下载arc目录解压后复制到指定目录路径:
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib
  2. Xcode使用14.3以下版本,Xcode历史版本官方下载(需要登录)

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞👍加星🌟,谢谢~

Xcode8以及iOS10问题记录

Xcode8以及iOS10问题记录

   

1.解决工程中输出无关日志

Edit Scheme -> Run -> Arguments, Environment Variables里边添加   OS_ACTIVITY_MODE        disable



遗留问题:

还会出现下面这个问题5]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x112b58910) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x112982210). One of the two will be used. Which one is undefined.



2.注释快捷键+/失效

重启电脑,如果还不能使用的话就启用命令工具(命令运行 sudo /usr/libexec/xpccachectl),然后重启电脑


3.对于插件无法使用

网上推荐的是将Xcode拷贝一份可以使用插件的Xcode(在应用程序中),但是这个Xcode不能打包上传等,建议不要使用这种方法

三方插件解决方法(fix method):让你的Xcode8继续使用插件


4.iOS10隐私权限问题

iOS10中调用相机相册等系统功能时,需要在info.plist文件中添加字段,否则会出现闪退的情况

[html]  view plain  copy  
  1. <!-- 相册 -->   
  2. <key>NSPhotoLibraryUsageDescription</key>   
  3. <string>App需要您的同意,才能访问相册</string>   
  4. <!-- 相机 -->   
  5. <key>NSCameraUsageDescription</key>   
  6. <string>App需要您的同意,才能访问相机</string>   
  7. <!-- 麦克风 -->   
  8. <key>NSMicrophoneUsageDescription</key>   
  9. <string>App需要您的同意,才能访问麦克风</string>   
  10. <!-- 位置 -->   
  11. <key>NSLocationUsageDescription</key>   
  12. <string>App需要您的同意,才能访问位置</string>   
  13. <!-- 在使用期间访问位置 -->   
  14. <key>NSLocationWhenInUseUsageDescription</key>   
  15. <string>App需要您的同意,才能在使用期间访问位置</string>   
  16. <!-- 始终访问位置 -->  
  17. <key>NSLocationAlwaysUsageDescription</key>   
  18. <string>App需要您的同意,才能始终访问位置</string>   
  19. <!-- 日历 -->   
  20. <key>NSCalendarsUsageDescription</key>   
  21. <string>App需要您的同意,才能访问日历</string>   
  22. <!-- 提醒事项 -->   
  23. <key>NSRemindersUsageDescription</key>   
  24. <string>App需要您的同意,才能访问提醒事项</string>   
  25. <!-- 运动与健身 -->   
  26. <key>NSMotionUsageDescription</key> <string>App需要您的同意,才能访问运动与健身</string>   
  27. <!-- 健康更新 -->   
  28. <key>NSHealthUpdateUsageDescription</key>   
  29. <string>App需要您的同意,才能访问健康更新 </string>   
  30. <!-- 健康分享 -->   
  31. iOS14.3 Beta 3发布|附iOS14.3测试版功能总结,自动换壁纸教程

    移动 Chrome 中的 webRTC,iOS 版本低于 14.3

    iOS 14.3越狱工具已发布!(附越狱教程)

    iOS 14.3越狱工具已发布!(附越狱教程)

    使用Macos进行 Fugu14 Uncover A12-14 ios越狱 版本14.3-14.5.1

    iOS 14.3正式版发布,我先升为敬!