Xcode10发布后,很多大厂采用xcode10适配iPhone新机,且提审时采用了Xcode打包,此包提审后通过appstore下载的安装包在iOS9.3以下的系统(>=iOS9.0)存在随机崩溃!国内阿里,京东等厂均已复现了该问题。
https://stackoverflow.com/questions/52364231/our-app-crashed-in-ios-9-which-upload-by-xcode-10
此问题是由于苹果对Assets资源的优化引起的(苹果经常在iOS9到9.3的系统上搞事情,xcode9打包的情况下,如果资源中包含了P3图片,也会随机崩溃,看来是新的程序猿没有注意到老的逻辑的坑导致的)。
苹果在Xcode10.1 beta2中修复了此问题https://developer.apple.com/documentation/xcode_release_notes/xcode_10_1_beta_2_release_notes?language=objc
目前有一些workround,如先用xcode10打包提交一个包,最低版本支持到9.3,然后用Xcode9打包再发布一个版本,让iOS9.3以下的用户更新。
但是操作成本相对都比较大,所以如无特别需求,在Xcode10.1正式版未发布前请勿用Xcode10打包提交审核。
最新消息:根据苹果开发者论坛的消息,Xcode10.1并未解决以上问题:
https://forums.developer.apple.com/thread/110393?from=timeline&isappinstalled=0#110393
苹果官方也确认了Xcode10.1并未解决以上问题:
https://developer.apple.com/documentation/xcode_release_notes/xcode_10_1_release_notes?language=objc
最新消息,苹果可通过服务端配置解决以上问题。
截止目前,微信、QQ等均适配了Xcode10.至于是否需要开发者做什么事情,节后实际灰度一下看看。
经testflight验证,目前未见xcode10.1打包存在崩溃问题,另,微信、QQ都采用了xcode10.1打包,所以,该问题应该已被解决。
一、新版iPhone适配
1、三款新的iPhoneX的相关尺寸如下图:
由上图可以看出
第一、iPhoneXS和iPhoneX的相关尺寸相同,所以,iPhone XS无需其他适配;
第二、iPhone XR和iPhoneXS Max的尺寸和iPhoneX不同,所以,以前判断iPhoneX的逻辑在这两款机型上失效,需要兼容。这两个机型的问题在我们app里面基本表现一致,只要在原来iPhoneX的判断的位置上,加上这两款机型的判断,基本就没有问题了。个别硬编码写死尺寸的地方,可能需要设计介入做些许调整;
第三、iPhoneX、iPhone XS、iPhone XS Max均为3倍屏,但是iPhoneXR为2倍屏
第四、h5适配的时候需要兼容多种model了。
总体来看,这次新机型的适配难度要远远小于当初iPhoneX的适配;
2、各种机型的判断的方法:
方式一:
各个机型枚举
#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
#define iPhoneXR ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(828, 1792), [[UIScreen mainScreen] currentMode].size) : NO)
#define iPhoneXS_Max ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size) : NO)
方式二:
目前iPhoneX系列都是刘海屏,其实只要判断出这个特性,就可以统一做适配了。故:
#define isIPhoneXAll ([UIScreen mainScreen].bounds.size.height == 812 || [UIScreen mainScreen].bounds.size.height == 896)
方式三:
目前iPhoneX都是刘海屏,状态栏的高度均为44pt,故:
#define isIPhoneXAll ([[UIApplication sharedApplication] statusBarFrame].size.height == 44)
3、h5如何适配iPhoneX:
方式一:
通过与Native交互获取当前的设备型号(Native可以通过js桥,或者在UA中增加字段)
方式二:
h5可以通过在css中设置padding来达到自动适配的目的,这种情况下,h5不需要关注是否为iPhoneX了
方式二与native解耦,强烈推荐!
二、xcode10 工程配置
Xcode 10和以前相比,对工程的校验严格了很多,主要表现在原?️的工程直接无法run,主要问题有:
1、libstdc++.6.0.9被废弃;这里需要移除所有的libstdc++.6.0.9库,如果项目需要C++,则再添加libc++.tbd;
2、报错如下:
error: Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target's code sign settings match the parent app's.
Embedded Binary Signing Certificate: Software Signing
Parent App Signing Certificate: - (Ad Hoc Code Signed)
3、报错如下:
error: Multiple commands produce 'xxxx':
1) Target 'xxxModule' (project 'Pods') has copy command from 'xxxx' to 'yyyy'
2) Target 'xxxModule' (project 'Pods') has copy command from 'zzzz' to 'pppp'
这里2、3都是xcode对工程配置强校验引起的,很棘手,找了很久才基本解决掉,解决方法是一致的,在
Xcode--->File下进行工程设置,如下图(project setting或workspace setting):
这里相当于是将xcode build的设置修改为原来的配置了。如何在新的build 系统下解决这些问题,还待进一步研究。