1、Multiple commands produce 'xxx/Info.plist'
2苔严、iOS 12
系統(tǒng)WiFi
獲取SSID
(wifi名稱)和BSSID
(mac地址)失敗
3菇存、Xcode 10
中#import
的時(shí)候閃退或?qū)腩^文件不提示
4、[Xcode 10
] library not found for -lstdc++.6.0.9
5邦蜜、[iOS 12.1
] 二級頁面返回時(shí)tabbar
圖標(biāo)和文字位置偏移
6、webView
播放視頻返回后狀態(tài)欄消失
7亥至、[iPhone X
]StatusBar
內(nèi)部結(jié)構(gòu)改變導(dǎo)致crash
1悼沈、Multiple commands produce 'xxx/Info.plist'
升級Xcode 10
之后贱迟,編譯之前的項(xiàng)目,發(fā)生編譯錯(cuò)誤:Multiple commands produce 'xxx/Info.plist'
絮供,項(xiàng)目中存在重復(fù)命名的info.plist文件衣吠。
解決方案:
(I)標(biāo)準(zhǔn)方案:刪除所有重復(fù)命名的文件。
(II)臨時(shí)方案:
xcworkspace
項(xiàng)目:Xcode菜單欄File
->Workspace Settings
->Build System
->Legacy Build System
壤靶;
xcodeprj
項(xiàng)目:Xcode菜單欄File
->Project Settings
->Build System
->Legacy Build System
缚俏。2、
iOS 12
系統(tǒng)WiFi
獲取SSID
(wifi名稱)和BSSID
(mac地址)失敗
在iOS 12
系統(tǒng)之后贮乳,蘋果提升了獲取WiFi
名稱和mac
地址的權(quán)限控制忧换,要獲取這些信息,需要手動(dòng)為應(yīng)用打開獲取WiFi信息的權(quán)限向拆。具體操作可以參考《獲取iOS設(shè)備WiFi名字和mac地址+iOS12系統(tǒng)獲取失敗解決》亚茬。
解決方案:
在開發(fā)者賬號中,勾選項(xiàng)目的App ID
的Access WiFi Infomation
選項(xiàng)浓恳;
在Xcode的Capabilities
中刹缝,勾選項(xiàng)目的Access WiFi Infomation
選項(xiàng)。3颈将、
Xcode 10
中#import
的時(shí)候閃退或?qū)腩^文件不提示
在Xcode 10
中出現(xiàn)輸入#import
引入文件/類庫頭文件的時(shí)候Xcode
閃退梢夯。或者輸入#import
導(dǎo)入頭文件時(shí)不提示晴圾。
解決方案:
xcworkspace
項(xiàng)目:Xcode菜單欄File
->Workspace Settings
->Build System
->Legacy Build System
颂砸;
xcodeprj
項(xiàng)目:Xcode菜單欄File
->Project Settings
->Build System
->Legacy Build System
。-
4疑务、[
Xcode 10
] library not found for -lstdc++.6.0.9
蘋果在Xcode 10
和iOS 12
中移除了libstdc++
庫沾凄,由libc++
這個(gè)庫取而代之,蘋果的解釋是libstdc++已經(jīng)標(biāo)記為廢棄有5年了知允,建議大家使用經(jīng)過了llvm優(yōu)化過并且全面支持C++11的libc++庫撒蟀。所以Xcode 10中l(wèi)ibstdc++相關(guān)的3個(gè)庫(libstdc++
、libstdc++.6
温鸽、libstdc++6.0.9
)都已被移除保屯,不可再使用。
解決方案:
(I)調(diào)整代碼為依賴libc++
更改c++庫文件涤垫,TARGETS
->Build Phases
->Link Binary With Libraries
姑尺,刪除stdc++.6.0.9
依賴,添加libc++.tdb
蝠猬;TARGETS
->Build Settings
->Other Linker Flags
切蟋,刪除-l "stdc++.6.0.9"
。修改代碼為依賴libc++
榆芦。
(II)從Xcode 9
中導(dǎo)入libstdc++
到Xcode 10
中柄粹。
找到Xcode 9
中的libstdc++
庫文件copy到Xcode 10
的lib
文件夾下喘鸟。參考路徑方法如下,分別是真機(jī)和模擬器的運(yùn)行庫文件導(dǎo)入:cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/ cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/
-
5驻右、[
iOS 12.1
] 二級頁面返回時(shí)tabbar
圖標(biāo)和文字位置偏移
iOS 12.1
系統(tǒng)中UINavigationController+UITabBarController
什黑,UITabBar
為磨砂,并且pushViewController
的時(shí)候使用hidesBottomBarWhenPushed = YES
堪夭,則在使用popViewController:animated
返回愕把,或者手勢返回的時(shí)候,就會出現(xiàn)tabbar
布局錯(cuò)亂森爽,圖標(biāo)和文字位置偏移的問題恨豁。出現(xiàn)這個(gè)問題的直接原因是UITabBar
為磨砂的情況下,返回頁面時(shí)tabBar
內(nèi)的按鈕UITabBarButton
被設(shè)置了錯(cuò)誤的frame
拗秘,frame.size
變?yōu)榱?(0, 0) 圣絮。
最簡單的解決方案是:[[UITabBar appearance].translucent = NO;
-
6、
webView
播放視頻返回后狀態(tài)欄消失
視頻播放完成主window
成為KeyWindow
的時(shí)候仍隱藏著UIStatusBar
。
解決方案:- (void)videoPlayerFinishedToShowStatusBar { if (@available(iOS 12.0, *)) { [[NSNotificationCenter defaultCenter] addObserverForName:UIWindowDidBecomeKeyNotification object:self.window queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; }]; } }
-
7、[
iPhone X
]StatusBar
內(nèi)部結(jié)構(gòu)改變導(dǎo)致crash
蘋果17年底推出全面屏劉海手機(jī)之后民晒,應(yīng)用頂部StatusBar
內(nèi)部結(jié)構(gòu)發(fā)生改變,如果項(xiàng)目中使用狀態(tài)欄中圖標(biāo)獲取手機(jī)狀態(tài)信息(如:獲取當(dāng)前網(wǎng)絡(luò)的狀態(tài))棒搜,則在iPhone X (Xs,Xs Max,XR)
手機(jī)上會發(fā)生崩潰。
注意:發(fā)生崩潰的機(jī)型是有劉海的手機(jī)iPhone X (Xs,Xs Max,XR)
活箕。
例如獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)力麸。crash log: *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIStatusBar_Modern 0x7ffbf2c05670> valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView.'
導(dǎo)致上面崩潰的代碼如下:
- (NSString *)getiPhoneNetWorkStates { UIApplication *app = [UIApplication sharedApplication]; NSString *states = @"UnKnow"; NSArray *subViews = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews]; for (id child in subViews) { if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { int networkType = [[child valueForKeyPath:@"dataNetworkType"] intValue]; NSString *networkStatus = @"UnKnow"; switch (networkType) { case 0: networkStatus = @"UnKnow"; break; case 1: networkStatus = @"2G"; break; case 2: networkStatus = @"3G"; break; case 3: networkStatus = @"4G"; break; case 4: networkStatus = @"LTE"; break; case 5: networkStatus = @"WiFi"; break; default: break; } } } return states; }
導(dǎo)致崩潰的原因是:
StatusBar
內(nèi)部結(jié)構(gòu)發(fā)生變化,在上面代碼第5行獲取foregroundView
的時(shí)候育韩,foregroundView
不存在克蚂。
解決方案:
iPhone X上通過StatusBar只能獲取到網(wǎng)絡(luò)是WiFi還是蜂窩網(wǎng),當(dāng)網(wǎng)絡(luò)為蜂窩網(wǎng)的時(shí)候筋讨,無法獲取到具體的網(wǎng)絡(luò)狀態(tài)埃叭。要獲取更具體的網(wǎng)絡(luò)狀況,建議使用官方提供的Reachability悉罕。- (NSString *)getiPhoneNetWorkStates { UIApplication *app = [UIApplication sharedApplication]; NSString *states = @"UnKnow"; id statusBar = [app valueForKeyPath:@"statusBar"]; if ([self checkDeviceIsiPhoneX]) { if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) { id curData = [statusBar valueForKeyPath:@"statusBar.currentData"]; BOOL wifiEnable = [[curData valueForKeyPath:@"_wifiEntry.isEnabled"] boolValue]; BOOL cellEnable = [[curData valueForKeyPath:@"_cellularEntry.isEnabled"] boolValue]; // iPhone X上通過StatusBar只能獲取到網(wǎng)絡(luò)是WiFi還是蜂窩網(wǎng) // 當(dāng)網(wǎng)絡(luò)為蜂窩網(wǎng)的時(shí)候赤屋,無法獲取到具體的網(wǎng)絡(luò)狀態(tài) if (wifiEnable) { states = @"WiFi"; } else if (cellEnable) { states = @"Cellular"; } } } else { NSArray *subViews = [[statusBar valueForKeyPath:@"foregroundView"] subviews]; for (id child in subViews) { if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) { int networkType = [[child valueForKeyPath:@"dataNetworkType"] intValue]; switch (networkType) { case 0: states = @"UnKnow"; break; case 1: states = @"2G"; break; case 2: states = @"3G"; break; case 3: states = @"4G"; break; case 4: states = @"LTE"; break; case 5: states = @"WiFi"; break; default: break; } } } } return states; }