iOS12 XCode10 適配
1. libstdc++棄用 報(bào)錯(cuò)Undefined symbols
XCode10編譯報(bào)錯(cuò)ndefined symbols for architecture XXX
铅鲤,如果你的工程中有l(wèi)ibstdc++依賴(可從Linked Frameworks and Libraries 項(xiàng)查看)油够,那么就會(huì)出現(xiàn)這類錯(cuò)誤起胰。
因?yàn)樘O(píng)果在XCode10和iOS12中移除了libstdc++這個(gè)庫(kù)驾中,由libc++這個(gè)庫(kù)取而代之且预,蘋(píng)果的解釋是libstdc++已經(jīng)標(biāo)記為廢棄有5年了蜈项,建議大家使用經(jīng)過(guò)了llvm優(yōu)化過(guò)并且全面支持C++11的libc++庫(kù)定硝。
libstdc++.dylib是C++98版本的標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)動(dòng)態(tài)庫(kù)瘪菌,而libc++.dylib是C++11版本的標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)動(dòng)態(tài)庫(kù)撒会。libc++是一個(gè)更加新的C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn),它完全支持C++11標(biāo)準(zhǔn)师妙。因此蘋(píng)果棄用了libstdc++.dylib诵肛,這符合蘋(píng)果一貫的作風(fēng)。
解決方法
最直接的是修改依賴庫(kù)默穴,支持libc++.dylib
-
臨時(shí)方法
將libstdc++.dylib拷貝到 XCode中怔檩,共四個(gè)地方
sudo cp CoreSimulator/* /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/
sudo cp MacOSX/* /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/
sudo cp iPhoneOS/* /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
sudo cp iPhoneSimulator/* /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/
2. UICollectionViewCell 高度計(jì)算不正確
更新 iOS12后,一定要檢查所有用到UICollectionViewCell的界面蓄诽,因?yàn)閁ICollectionViewCell可能出現(xiàn)高度計(jì)算不正確的現(xiàn)象薛训。
iOS12對(duì)AutoLayout做出了性能優(yōu)化,但是更新 iOS12后若专,發(fā)現(xiàn)一些UICollectionViewCell的高度不正確许蓖,一時(shí)間也調(diào)試不出什么問(wèn)題,因此就采用手動(dòng)計(jì)算高度暫時(shí)解決调衰。
這里有一篇同樣的問(wèn)題膊爪,解決思路可供參考鏈接
解決方法
1. 手動(dòng)計(jì)算高度
2. 忽略 contentView,直接把 subView 加到 cell 上
3. StatusBar 網(wǎng)絡(luò)狀態(tài)
如果app通過(guò)狀態(tài)欄的網(wǎng)絡(luò)狀態(tài)指示器去判斷手機(jī)當(dāng)前聯(lián)網(wǎng)狀態(tài)嚎莉,修改進(jìn)行修改米酬,因?yàn)閕OS12 更改了StatusBar內(nèi)部結(jié)構(gòu)。
+ (NSString *)getIphoneXNetWorkStates {
UIApplication *app = [UIApplication sharedApplication];
id statusBar = [[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"statusBar"];
id one = [statusBar valueForKeyPath:@"regions"];
id two = [one valueForKeyPath:@"trailing"];
NSArray *three = [two valueForKeyPath:@"displayItems"];
NSString *state = @"無(wú)網(wǎng)絡(luò)";
for (UIView *view in three) {
//alert: iOS12.0 情況下identifier的變成了類"_UIStatusBarIdentifier"而不是NSString趋箩,所以會(huì)在調(diào)用“isEqualToString”方法時(shí)發(fā)生crash赃额,
//修改前
// NSString *identifier = [view valueForKeyPath:@"identifier"];
//修改后
NSString *identifier = [[view valueForKeyPath:@"identifier"] description];
if ([identifier isEqualToString:@"_UIStatusBarWifiItem.signalStrengthDisplayIdentifier"]) {
id item = [view valueForKeyPath:@"_item"];
//alert: 這個(gè)問(wèn)題和上邊一樣itemId是_UIStatusBarIdentifier 類型,不是string
NSString *itemId = [[item valueForKeyPath:@"identifier"] description];
if ([itemId isEqualToString:@"_UIStatusBarWifiItem"]) {
state = @"WIFI";
}
state = @"不確定";
} else if ([identifier isEqualToString:@"_UIStatusBarCellularItem.typeDisplayIdentifier"]) {
UIView *statusBarStringView = [view valueForKeyPath:@"_view"];
// 4G/3G/E
state = [statusBarStringView valueForKeyPath:@"text"];
}
}
return state;
}
iOS12新功能
1. 劉海屏判斷
#define isNotchMobile ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? (CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size)||CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size)||CGSizeEqualToSize(CGSizeMake(828, 1792), [[UIScreen mainScreen] currentMode].size)) : NO)