Xcode10踩坑记(新版Xcode打包发布,iOS9不再闪退)

bb

Xcode10编译时会有一系列问题,这些问题网上很多文章都有同样的解决方法,这里就不再赘述。
接下来讲的Xcode10的坑,主要是在测试阶段及发布后的一些坑:

1. Xcode10运行项目,iOS12系统手机获取不了SSID;

SSID全称Service Set IDentifier, 即Wifi网络的公开名称。在iOS 4.1以上版本提供了公开的方法CNCopyCurrentNetworkInfo来获取该信息。
最近升级了Xcode10,运行项目后,发现iOS12手机获取的SSID为空,其他系统的手机一切正常。猜测是因为升级Xcode10的原因,然后查看了CNCopyCurrentNetworkInfo方法的文档发现了问题所在:

haha

也就是说要在iOS12或更高版本中使用此功能,要在Xcode中启用应用程序的访问WiFi信息功能。当启用该功能时,Xcode会自动将Access WiFi信息添加到授权文件和应用程序ID。

  • 解决方法:在Capabilities栏目下的Access WiFi Information开启即可(Access WiFi Information选项是Xcode10新增的):
hehe

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

现在的note
早些时候的note

虽然之前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前先去论坛了解一下新版的各种坑(总有人会先踩坑的),在确认要更新时,最好先先备份一份,千万不要覆盖安装了

以上是我目前为止遇到的一些坑,各位伙伴如有补充欢迎在评论区留言以让更多的人少踩坑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容