Xcode10更新的那些坑(持续更新)

前言

趁着Xcode10更新,第一时间下载并准备开始踩坑。接下来直接列出笔者遇到的问题和解决过程。

1:适配iPhone X/XS/XR/XS Max

总的来说这个问题比较简单,笔者直接放上一篇别人总结的文章,讲的非常详细。(链接:新机型适配)
文章最后有具体的代码,作者通过是否有safeAreaInsets的底部来判断是否为X系列机型,比较巧妙。

2.The iOS Simulator deployment target is set to x.x, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'xxx')

更新了Xcode10以后,兴高采烈的运行了项目。

image

Excuse me?这是什么鬼警告,作为一位强迫症患者,这一排排的⚠️真的看不下去,着手解决。

方法1:删除Pods、 Podfile.lock、xcworkspace文件,然后重新pod install.(不推荐)

这样的解决方法确实解决了问题,但不是很优秀,先不说执行install会花费很多的时间,就是Xcode下次更新如果将最低版本提升到了9,那又要重新install,这样就大大降低了开发者的效率。

方法2:在Podfile文件中添加判断(推荐)
post_install do |installer|
  installer.pods_project.targets.each do |target|
 target.build_configurations.each do |config|
  if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 8.0
    config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '8.0'
     end
   end
  end
end

将这个判断添加到Podfile文件的最后,然后执行pod install,再次运行项目,你会发现整个世界都清净了。
上面对第三方库进行了判断若DEPLOYMENT_TARGET<8.0就会切换成8.0,可以说是一劳永逸,下次苹果再去提高最低版本只需要修改版本号就可以了。

关于这个问题上笔者真要好好吐槽度娘了,搜索出来的东西不够精准,很多都是没有一点关系的问题。最后没办法上了谷歌,一击命中效率可以说是真的高。(贴上链接:https://github.com/CocoaPods/CocoaPods/issues/8069)。

大致看了下老外们的激烈讨论,大概知道了些原因:
Xcode 9 --> deployment target 4.3
Xcode 10 --> deployment target 8.0
Xcode10的这次更新直接把deployment target提到了8.0,所以对于之前的一些第三方库会出现这样的问题。

3:error: Multiple commands produce

这个问题笔者遇到的错误主要是因为多个target导致的plist文件重复。但这个错误不是所有开发者都是相同的,所以在这里笔者的解决方法是通过修改Build System来解决。

Xcode->点击左上角file->Workspace Settings->Build System->选择legacy Build System

image

这样解决方法只是在编译的时候隐藏了错误,并没有在根本上解决问题,所以开发者可以根据自己的实际报错情况具体解决。如果暂时不影响开发,上面的解决方式也不失为一种好方法。

另外补充一个新的问题,Xcode10中新建文件,在别的类中导入时#import不提示。这个问题也是可以通过修改Build System设置来解决。

4:warning: Null passed to a callee that requires a non-null argument

image

出现的原因是由于Xcode10以后,系统对新建类默认加上NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END这样的一对宏,但是我们对某些对象置nil而导致的。
知道了原因先来看下介这对宏的作用:我们都知道Swift将对象分为optional(?)non-optional(!)的,但是OC却没有这一特性。为了解决Swift和OC混编时的对象问题,Xcode6.3时苹果推出了这样的一对宏。这对宏的主要作用是将在这两个宏之间的代码,所有简单指针对象都会被假定为nonnull,因此我们只需要去指定那些nullable的指针。
因为所有对象都被假定为nonnull了,而这时将某一对象或参数置nil,所以编译器会报此警告。

解决的方法也很简单,我们只要在申明对象时对需要nil的对象或参数,加上nullable关键字即可。

从这个警告可以发现,苹果一直想让OC往Swift的方向发展兼容,从Xcode6.3的提出,到Xcode10的默认添加都能看出。

总结

关于Xcode10更新后笔者也是暂时碰到了这些问题,可能不够全面,后面遇到会持续补充。

链接:https://www.jianshu.com/p/226832903157

你可能感兴趣的:(Xcode10更新的那些坑(持续更新))