Xcode10编译时会有一系列问题,这些问题网上很多文章都有同样的解决方法,这里就不再赘述。
接下来讲的Xcode10的坑,主要是在测试阶段及发布后的一些坑:
1. Xcode10运行项目,iOS12系统手机获取不了SSID;
SSID全称Service Set IDentifier, 即Wifi网络的公开名称。在iOS 4.1以上版本提供了公开的方法CNCopyCurrentNetworkInfo来获取该信息。
最近升级了Xcode10,运行项目后,发现iOS12手机获取的SSID为空,其他系统的手机一切正常。猜测是因为升级Xcode10的原因,然后查看了CNCopyCurrentNetworkInfo方法的文档发现了问题所在:
也就是说要在iOS12或更高版本中使用此功能,要在Xcode中启用应用程序的访问WiFi信息功能。当启用该功能时,Xcode会自动将Access WiFi信息添加到授权文件和应用程序ID。
- 解决方法:在Capabilities栏目下的Access WiFi Information开启即可(Access WiFi Information选项是Xcode10新增的):
2. Xcode10打的包,发布到App Store后,iOS9.0,iOS9.1,iOS9.2系统启动APP就闪退
Xcode10 debug时iOS9 iOS10 iOS11 iOS12都试过,没有任何问题,但发布到App Store后就陆续收到用户反馈说启动APP就闪退。后来发现了这样的规律:闪退的客户手机系统都是集中在iOS9.0,iOS9.1,iOS9.2这三个系列系统中。后来历经千辛万苦在stackoverflow中找到答案:
这就是Xcode10的一个bug,Xcode10上传后的IPA经过AppStore处理后,iOS9.0,iOS9.1,iOS9.2加载Assets中的图会Crash。
Apple也意识到了这个bug,并发布了Xcode 10.1 beta 2声称已修复了这个bug:
Resolves an issue that affected app compatibility with iOS 9.0, 9.1 and 9.2. Apps containing asset catalogs built with Xcode 10 whose deployment target was set to iOS 9.0, 9.1 or 9.2 would produce content incompatible with the runtimes of those iOS versions. Rebuilding the application with Xcode 10.1 resolves this issue. (44535967)
不过,有不少开发者反应:使用Xcode 10.1打包后还是有crash的问题;也就是说实际上Xcode 10.1还是没有完全修复这个bug。(有点搞不懂Apple了)
这点多谢楼下DarrenK的评论。
这里是论坛中提的问题
既然Xcode 10.1实际上并没有修复这个bug,那么解决iOS9因为Assets图片crash的方案只有两个了:
- 使用旧版本的Xcode9,使用旧版本Xcode前提是项目中没有用到一些iOS12的新特性。
不过最近AppStore要求打的包必须包含iOS12.1 SDK,也就是Xcode9打得包上传不了了。
- 将项目中Assets中的图片全部移出来,不过一般项目中的图片都比较多手动移会比较麻烦,可以考虑写个command line tool,以下代码可供参考(复制论坛大佬的,亲测没问题)
//项目路径
#define PATH @"/Users/user/Desktop/HHTest/HHTest/Assets.xcassets"
//存储路径
#define NEWPATH @"/Users/user/Desktop/Assets"
#import <Foundation/Foundation.h>
void test(NSString *filePath,NSString *newPath,NSFileManager *manager){
BOOL isDirectory;
BOOL isExist = [manager fileExistsAtPath:filePath isDirectory:&isDirectory];
if (isExist) {
if (isDirectory) {
BOOL newPathIsExist = [manager fileExistsAtPath:newPath];
if (newPathIsExist == NO) {
NSError *error = nil;
[manager createDirectoryAtPath:newPath withIntermediateDirectories:NO attributes:nil error:&error];
if (error) {
NSLog(@"创建文件夹失败:%@",newPath);
return ;
}
}
NSArray *array = [manager contentsOfDirectoryAtPath:filePath error:nil];
for (NSString *str in array) {
if ([str hasSuffix:@"json"]) {
continue ;
}
NSString *name = [str lastPathComponent];
if ([name hasSuffix:@".imageset"]) {
name = [name substringToIndex:name.length - 9];
}
NSString *tempPath = [filePath stringByAppendingPathComponent:str];
NSString *tempNewPath = [newPath stringByAppendingPathComponent:name];
test(tempPath, tempNewPath, manager);
}
}else{
NSError *error = nil;
[manager copyItemAtPath:filePath toPath:newPath error:&error];
if (error) {
NSLog(@"拷贝文件失败:%@",newPath);
return ;
}
}
}else{
NSLog(@"文件不存在:%@",filePath);
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSFileManager *manager = [NSFileManager defaultManager];
//Assets.xcassets
NSString *assetsPath = nil;
if ([[PATH lastPathComponent] hasPrefix:@"Assets.xcassets"]) {
assetsPath = PATH;
}else{
NSArray *array = [manager subpathsOfDirectoryAtPath:PATH error:nil];
for (NSString *str in array) {
NSString *name = [str lastPathComponent];
if ([name hasPrefix:@"Assets.xcassets"]) {
assetsPath = [PATH stringByAppendingPathComponent:str];
break ;
}
}
}
test(assetsPath,NEWPATH,manager);
}
return 0;
}
另外,谨慎起见,修改后最好打包使用TestFlight测试下,以确保没有crash问题。
如果APP没有用到一些iOS12的新特性,使用Xcode9打包是最好的方式。(目前这个方法已不行)
总之现阶段尽量不要用Xcode10打包发布应用,当然如果你的应用最低都不支持iOS9或者图片没有放在Assets中(就算放入了Assets中,也可以全移出来)那就无所谓了。
2019-01-11 更新
我们的App最近一次升级,使用Xcode9打包提交AppStore时报错,由于App中Assets图片较多且图片名称不一致,当时时间紧迫,考虑到将图片全部移出来并改名字工作量较大而且可能会有很多bug,我们决定冒着舍弃iOS9用户的风险使用Xcode 10.1打包提交。
最近App成功发布,iOS9.0~9.2手机一切正常。
亲测Xcode10.1提交的应用不会有因为Assets图片crash的问题了
笔者特意又去看了下Xcode 10.1的Release Notes,惊奇的发现其中Asset Catalog crash的bug已从早些时候的Known Issues改为了Resolved Issues:
虽然之前Xcode 10.1刚出的时候,有一段时间Asset Catalog crash的bug也是列在Resolved Issues中,但那次并没有解决这个问题。这次又重新从Known Issues改为Resolved Issues,亲测是的确改好了。
同样是Xcode 10.1,Xcode并没有升级,Apple是如何修复这个问题的呢?有小伙伴猜测是Apple在服务器端修复的。
3. Xcode10打的包上线App Store后,APP安装包大小显示不正确
App上线后,在App Store中无意中发现应用介绍中的APP体积比上个版本足足大了30多M。由于新版本只是改了些许bug,并未增加过什么资源文件,大了30M肯定是不正常的。一度以为是我们打包的过程出了什么差错,找了好久也没发现问题所在。后来在cocoa china论坛中看到有很多人都有类似的情况,怀疑是App Store的bug:之前App Store显示的应用大小是安装包的实际大小,而最新App Store显示的应用大小应该是预估的应用安装到手机上的大小。所以会差个30多M。
过了一个星期后,再去App Store查看应用大小发现恢复正常和之前的版本差不多了。确定是App Store的原因,且App Store已经修复了。
貌似每次Xcode升级,都会有大大小小的问题。这就要求我们要养成良好的习惯:在更新Xcode前先去论坛了解一下新版的各种坑(总有人会先踩坑的),在确认要更新时,最好先先备份一份,千万不要覆盖安装了
以上是我目前为止遇到的一些坑,各位伙伴如有补充欢迎在评论区留言以让更多的人少踩坑