XCode8升級到Xcode9(作業系統為iOS11)後原來的工程中遇到的問題
1.無法識別check_compile_time,導致工程無法編譯不過。
原來的工程中使用了QNNetDiag第三方庫.
QNNPing.m中使用check_compile_time,所以編譯時報下面的錯誤。
本來就是編譯時的斷言,暫時去掉就可以了。就是有問題斷言條件成立,那麼應用就會crash,所以在釋出版本有斷言本來就沒有什麼好處,只有除錯時才有用,提前暴露問題。所以去掉這些斷言沒有什麼影響。
2.報declaration of ‘select’ must be imported from module ‘Darwin.POSIX.sys.time’ before it is required的錯誤。
解決辦法是加入這個標頭檔案就可以了:
#include <sys/time.h>
3.在系統iOS11,在[[UIApplication sharedApplication].windows lastObject]上面增加的控制元件無法顯示。如:自定義MBProgressHUD的彈出框toast,在iOS11之下的系統顯示正常,而iOS11系統下就顯示不出來。修改辦法是修改為:[[[UIApplication sharedApplication] delegate] window]。
程式碼如下:
4.定位失效。
原來的應用使用的是後臺一直定位,升級到xcode9後,無法定位,在隱私定位中看到的應用是永不。
在info.Plist中的新增新Key NSLocationAlwaysAndWhenInUseUsageDeion和舊Key NSLocationWhenInUseUsageDeion。仍然沒有用,暫時沒有找到解決方案,不知道是證書無效還是高德地圖key無效。
這個老工程iOS11以後定位失效問題終於解決了,網上的方案都不全面,完美解決方案見我的文章:iOS11及以上作業系統無法定位問題完美解決方案 (
5.在iphonex模擬器上,下部工具條的位置不在最底部。現在還沒有解決。iphone x的寬度是375畫素,高度是667畫素。相當於是iPhone8的放大模式。
6.對UILabel的text賦值時,若是以空格結束的字串,那麼字串後面的空格自動被過濾。
7.iOS11狀態列增加了20畫素。
iOS11版本,若頁面從頂部算起需要留64個畫素的導航欄高度再放置下面的控制元件,不然導航欄下面的控制元件會被導航欄遮擋。
OS11以下版本,若頁面從頂部算起需要留44個畫素的導航欄高度再放置下面的控制元件,若留64個畫素會多空出20畫素。
8.iOS11以下版本,UITextView的預設鍵盤沒有完成鍵,導致不能自動收起鍵盤,想收起鍵盤自己處理。這個問題導致很多應用不能使用。
9.iOS11出來前釋出的版本,當在有placeholder的UITextField輸入框輸入文字時,placeholder顯示在應用頁面的左上角。不需要改程式碼,用Xcode9重新打包釋出蘋果商店就能解決。
非表格頁面通過這樣的處理可以解決。
- (void)viewDidLoad {
[super viewDidLoad];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onClickBackGround)];
[self.view addGestureRecognizer:singleTap];
self.view.userInteractionEnabled = YES;
}
- (void)onClickBackGround
{
[self.view endEditing:YES];
}
注意:表格頁面這樣處理會造成表格行時間無效。需要另行處理。
10.新版本釋出,需要提供一張1024*1024的AppIcon,這個圖片需要是png格式的圖片並且不能有圓角。不然會上傳不上去或提交不了。
11.訪問系統圖片庫許可權說明配置項(Privacy - Photo Library Usage Description)變更,不在.plist檔案中增加新的配置項(Privacy - Photo Library Additions Usage Description),當應用儲存圖片時崩潰。崩潰時的日誌如下:
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value explaining to the user how the app uses this data.
這次xcode9和ios11的修改好大啊。
12.iPhone X的狀態列檢視陣列結構變化,讀取網路狀態列的網路狀態時崩潰。找不到foregroundView這個子檢視。
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
崩潰資訊:
#0 Thread
NSUnknownKeyException
[<UIStatusBar_Modern 0x15f906160> valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView.
這是專案中使用狀態列中圖示判斷當前網路的具體狀態,而 iPhone X手機狀態列和其他版本手機存在差異,狀態列是多嵌套了一層,所以在讀取時候需要注意。
修改後的程式碼如下:
UIApplication *app = [UIApplication sharedApplication];
// NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
NSArray *children;
// 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 來判斷,因為模擬器不會返回 iPhone X
if ([[app valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
children = [[[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
}
else
{
children = [[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
}
13.ios11系統使用UITextField的頁面退出時,MLeaksFinder檢測出記憶體洩漏。
這個也不完全算記憶體洩漏,因為dealloc函式被呼叫了,說明這個頁面被銷燬了。只是文字框在被系統引用而沒有釋放。對記憶體影響不大。
真正的記憶體洩漏是這樣的,你在一個頁面起一個定時器,然後在viewWillDisappear裡關閉定時器,你會發現該頁面的dealloc函式永遠不呼叫,這個才是真的記憶體洩漏。
所以可以暫時把他歸類為記憶體洩漏誤報吧(其實它佔著記憶體不放,也可以說它是記憶體洩漏。貌似系統把文字框做成單例型別的了。),這個和ios11有關。當然你很討厭那個報告,可以在viewWillDisappear增加[self.* removeFromSuperview];就能去掉這個告警,注意:再次進入該頁面要重新載入該部件了。程式碼:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
if(!(self.isGotoNewPage))
{
[self.biddingBackView removeFromSuperview];
}
}