
Xcode10編譯時(shí)會(huì)有一系列問(wèn)題,這些問(wèn)題網(wǎng)上很多文章都有同樣的解決方法,這里就不再贅述。
接下來(lái)講的Xcode10的坑,主要是在測(cè)試階段及發(fā)布后的一些坑:
1. Xcode10運(yùn)行項(xiàng)目,iOS12系統(tǒng)手機(jī)獲取不了SSID;
SSID全稱Service Set IDentifier, 即Wifi網(wǎng)絡(luò)的公開(kāi)名稱。在iOS 4.1以上版本提供了公開(kāi)的方法CNCopyCurrentNetworkInfo來(lái)獲取該信息。
最近升級(jí)了Xcode10,運(yùn)行項(xiàng)目后,發(fā)現(xiàn)iOS12手機(jī)獲取的SSID為空,其他系統(tǒng)的手機(jī)一切正常。猜測(cè)是因?yàn)樯?jí)Xcode10的原因,然后查看了CNCopyCurrentNetworkInfo方法的文檔發(fā)現(xiàn)了問(wèn)題所在:

也就是說(shuō)要在iOS12或更高版本中使用此功能,要在Xcode中啟用應(yīng)用程序的訪問(wèn)WiFi信息功能。當(dāng)啟用該功能時(shí),Xcode會(huì)自動(dòng)將Access WiFi信息添加到授權(quán)文件和應(yīng)用程序ID。
- 解決方法:在Capabilities欄目下的Access WiFi Information開(kāi)啟即可(Access WiFi Information選項(xiàng)是Xcode10新增的):

2. Xcode10打的包,發(fā)布到App Store后,iOS9.0,iOS9.1,iOS9.2系統(tǒng)啟動(dòng)APP就閃退
Xcode10 debug時(shí)iOS9 iOS10 iOS11 iOS12都試過(guò),沒(méi)有任何問(wèn)題,但發(fā)布到App Store后就陸續(xù)收到用戶反饋說(shuō)啟動(dòng)APP就閃退。后來(lái)發(fā)現(xiàn)了這樣的規(guī)律:閃退的客戶手機(jī)系統(tǒng)都是集中在iOS9.0,iOS9.1,iOS9.2這三個(gè)系列系統(tǒng)中。后來(lái)歷經(jīng)千辛萬(wàn)苦在stackoverflow中找到答案:
這就是Xcode10的一個(gè)bug,Xcode10上傳后的IPA經(jīng)過(guò)AppStore處理后,iOS9.0,iOS9.1,iOS9.2加載Assets中的圖會(huì)Crash。
Apple也意識(shí)到了這個(gè)bug,并發(fā)布了Xcode 10.1 beta 2聲稱已修復(fù)了這個(gè)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)
不過(guò),有不少開(kāi)發(fā)者反應(yīng):使用Xcode 10.1打包后還是有crash的問(wèn)題;也就是說(shuō)實(shí)際上Xcode 10.1還是沒(méi)有完全修復(fù)這個(gè)bug。(有點(diǎn)搞不懂Apple了)這點(diǎn)多謝樓下DarrenK的評(píng)論。
這里是論壇中提的問(wèn)題
既然Xcode 10.1實(shí)際上并沒(méi)有修復(fù)這個(gè)bug,那么解決iOS9因?yàn)锳ssets圖片crash的方案只有兩個(gè)了:
- 使用舊版本的Xcode9,使用舊版本Xcode前提是項(xiàng)目中沒(méi)有用到一些iOS12的新特性。
不過(guò)最近AppStore要求打的包必須包含iOS12.1 SDK,也就是Xcode9打得包上傳不了了。 - 將項(xiàng)目中Assets中的圖片全部移出來(lái),不過(guò)一般項(xiàng)目中的圖片都比較多手動(dòng)移會(huì)比較麻煩,可以考慮寫個(gè)command line tool,以下代碼可供參考(復(fù)制論壇大佬的,親測(cè)沒(méi)問(wèn)題)
//項(xiàng)目路徑
#define PATH @"/Users/user/Desktop/HHTest/HHTest/Assets.xcassets"
//存儲(chǔ)路徑
#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(@"創(chuàng)建文件夾失?。?@",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;
}
另外,謹(jǐn)慎起見(jiàn),修改后最好打包使用TestFlight測(cè)試下,以確保沒(méi)有crash問(wèn)題。
如果APP沒(méi)有用到一些iOS12的新特性,使用Xcode9打包是最好的方式。(目前這個(gè)方法已不行)
總之現(xiàn)階段盡量不要用Xcode10打包發(fā)布應(yīng)用,當(dāng)然如果你的應(yīng)用最低都不支持iOS9或者圖片沒(méi)有放在Assets中(就算放入了Assets中,也可以全移出來(lái))那就無(wú)所謂了。
2019-01-11 更新
我們的App最近一次升級(jí),使用Xcode9打包提交AppStore時(shí)報(bào)錯(cuò),由于App中Assets圖片較多且圖片名稱不一致,當(dāng)時(shí)時(shí)間緊迫,考慮到將圖片全部移出來(lái)并改名字工作量較大而且可能會(huì)有很多bug,我們決定冒著舍棄iOS9用戶的風(fēng)險(xiǎn)使用Xcode 10.1打包提交。
最近App成功發(fā)布,iOS9.0~9.2手機(jī)一切正常。
親測(cè)Xcode10.1提交的應(yīng)用不會(huì)有因?yàn)锳ssets圖片crash的問(wèn)題了
筆者特意又去看了下Xcode 10.1的Release Notes,驚奇的發(fā)現(xiàn)其中Asset Catalog crash的bug已從早些時(shí)候的Known Issues改為了Resolved Issues:


雖然之前Xcode 10.1剛出的時(shí)候,有一段時(shí)間Asset Catalog crash的bug也是列在Resolved Issues中,但那次并沒(méi)有解決這個(gè)問(wèn)題。這次又重新從Known Issues改為Resolved Issues,親測(cè)是的確改好了。
同樣是Xcode 10.1,Xcode并沒(méi)有升級(jí),Apple是如何修復(fù)這個(gè)問(wèn)題的呢?有小伙伴猜測(cè)是Apple在服務(wù)器端修復(fù)的。
3. Xcode10打的包上線App Store后,APP安裝包大小顯示不正確
App上線后,在App Store中無(wú)意中發(fā)現(xiàn)應(yīng)用介紹中的APP體積比上個(gè)版本足足大了30多M。由于新版本只是改了些許bug,并未增加過(guò)什么資源文件,大了30M肯定是不正常的。一度以為是我們打包的過(guò)程出了什么差錯(cuò),找了好久也沒(méi)發(fā)現(xiàn)問(wèn)題所在。后來(lái)在cocoa china論壇中看到有很多人都有類似的情況,懷疑是App Store的bug:之前App Store顯示的應(yīng)用大小是安裝包的實(shí)際大小,而最新App Store顯示的應(yīng)用大小應(yīng)該是預(yù)估的應(yīng)用安裝到手機(jī)上的大小。所以會(huì)差個(gè)30多M。
過(guò)了一個(gè)星期后,再去App Store查看應(yīng)用大小發(fā)現(xiàn)恢復(fù)正常和之前的版本差不多了。確定是App Store的原因,且App Store已經(jīng)修復(fù)了。
貌似每次Xcode升級(jí),都會(huì)有大大小小的問(wèn)題。這就要求我們要養(yǎng)成良好的習(xí)慣:在更新Xcode前先去論壇了解一下新版的各種坑(總有人會(huì)先踩坑的),在確認(rèn)要更新時(shí),最好先先備份一份,千萬(wàn)不要覆蓋安裝了
以上是我目前為止遇到的一些坑,各位伙伴如有補(bǔ)充歡迎在評(píng)論區(qū)留言以讓更多的人少踩坑