iOS開發 常見錯誤

 

 

1、NSAppTransportSecurity

錯誤提示:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)css

iOS9讓全部的HTTP默認使用了HTTPS,原來的HTTP協議傳輸都改爲TLS1.2協議進行傳輸。直接形成的狀況就是App發請求的時候彈出網絡沒法鏈接。解決辦法就是在項目的info.plist 文件里加上以下節點:html

NSAppTransportSecurity - NSAllowsArbitraryLoadspython

這個子節點的意思是:是否容許任性的加載?! 設爲YES的話就將禁用了AppTransportSecurity轉而使用用戶自定義的設置,這個問題就解決了。ios

若是你不是在董鉑然博客園看到本文,請點擊查看原文。 git

上面說是蘋果限制了HTTP協議,可是也並非說全部的HTTPS都能完美適配iOS9了。github

舉個栗子,從app內起webView加載https的網頁。新建個項目寫幾行起網頁的代碼web

- (void)loadView{
  UIWebView *web = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];  self.view = web; } - (void)viewDidLoad {  [super viewDidLoad];  UIWebView *web = (UIWebView *)self.view; //董鉑然  NSURL *url = [NSURL URLWithString:@"https://github.com/"];  NSURLRequest *request = [NSURLRequest requestWithURL:url];  [web loadRequest:request]; } 

中間的url就是咱們想要加載的https地址,用 https ://baidu.com/ 和  https://github.com/ 分別試一下,結果不一樣 算法

github的網頁能打開,百度的網頁打不開,下面打印了一行logsql

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

緣由是蘋果的 官方資料 說首先必需要基於TLS 1.2版本協議。而後證書的加密的算法還須要達到SHA256或者更高位的RSA密鑰或ECC密鑰,若是不符合,請求將被中斷並返回nil. 數組

在瀏覽器中是能夠直接查看這個網站的加密算法的,先點綠鎖再點證書信息。

從右邊兩張圖能夠看出,github帶RSA加密的SHA-256符合蘋果的要求,因此才能夠展現。

針對百度的狀況能夠在info.plist中配置以下,若是網站引用的比較多應該是須要針對每一個網站進行配置。

NSAppTransportSecurity,NSExceptionDomains,NSIncludesSubdomains, NSExceptionRequiresForwardSecrecy, NSExceptionAllowInsecureHTTPLoads 寫在下面便於複製。

其中的ForwardSecrecy理解爲超前的密碼保護算法,在 官方資料 裏有寫,一共是11種。配置完畢百度能夠訪問。 

2、Bitcode

bitcode的理解應該是把程序編譯成的一種過渡代碼,而後蘋果再把這個過渡代碼編譯成可執行的程序。bitcode也容許蘋果在後期從新優化咱們程序的二進制文件,有相似於App瘦身的思想。

用了xcode7的編譯器編譯以前沒問題的項目可能會出現下列報錯。

XXXX’ does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64

問題的緣由是:某些第三方庫還不支持bitcode。要否則是等待庫的開發者升級了此項功能咱們更新庫,要不就是把這個bitcode禁用。

禁用的方法就是找到以下配置,選爲NO.(iOS中bitcode是默認YES,watchOS中bitcodes是不讓改的必須YES。)

3、設置信任

這一條只和企業級應用或inhose 有關,和AppStore渠道的應用無關。

在iOS8只是彈出一個窗問你是否須要讓手機信任這個應用,可是在iOS9卻直接禁止,若是真的想信任須要本身去手動開啓。相似於Mac系統從未知開發者處下載的dmg直接打不開,而後要到系統偏好設置的安全性與隱私手動打開。 下圖展現左邊iOS8,右邊iOS9

用戶須要去 設置---》通用---》描述文件 裏面自行添加信任。

這種問題的處理方法也就兩種:1.提早周知暫時不要升級iOS9  2.大可能是公司員工使用的企業級應用,羣發一個指導郵件。

4、字體

iOS8中,字體是 Helvetica,中文的字體有點相似於「華文細黑」。只是蘋果手機自帶渲染,因此看上去可能比普通的華文細黑要美觀。 iOS9中,中文系統字體變爲了專爲中國設計的「蘋方」 有點相似於一種word字體「幼圓」。字體有輕微的加粗效果,而且最關鍵的是字體間隙變大了! 

因此不少本來寫死了width的label可能會出現「...」的狀況。

iOS8 

iOS9 蛋疼 

上面這兩張圖也能夠直觀的看出同一個界面,同一個label的變化。

因此爲了在界面顯示上不出錯,就算是固定長度的文字也仍是建議使用sizetofit 或者ios向上取整 ceilf() 或者提早計算

CGSize size = [title sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];
    CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));

5、URL scheme

URL scheme通常使用的場景是應用程序有分享或跳其餘平臺受權的功能,分享或受權後再跳回來。

在iOS8並無作過多限制,可是iOS9須要將你要在外部調用的URL scheme列爲白名單,才能夠完成跳轉

若是iOS9沒作適配 會報以下錯誤

canOpenURL: failed for URL : "mqzone://qqapp" - error: "This app is not allowed to query for scheme mqzone"

具體的解決方案也是要在info.plist中設置 LSApplicationQueriesSchemes 類型爲數組,下面添加全部你用到的scheme

6、tableView

雖然如今的iOS9已經推送正式版了,可是iOS9使用時仍是會感受到App比之前更加卡頓了,tableView拖動時卡頓顯示的最爲明顯。 而且以前遇到一個bug,本來好的項目用xcode7一編譯,tableView刷新出了問題 ,[tableView reloadData]無效 有一行cell明明改變了可是刷新不出來。 感受多是這個方法和某種新加的特性衝突了,猜想多是reloadData的操做被推遲到下一個RunLoop執行最終失效。

解決的方法是,註釋[tableView reloadData],改用局部刷新,問題竟然就解決了。

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

若是你不是在董鉑然博客園看到本文,請點擊查看原文。  

暫時遇到這些問題,感受iOS9的出現讓全部iOS開發都是菊花一緊,但願蘋果這種大刀闊斧作改變,特立獨行的風格發展下去之後別和government 產生矛盾,而後公司倒閉 致使開發人員失業,也許是我想多了。預祝全部的iOS都能及時的作好適配改完bug,下個版本一上線,全部問題都解決。

7、 修改iOS項目的名稱

http://jingyan.baidu.com/article/0964eca21126a98285f53625.html

 

8、快速打斷點的方法,或者說,斷點自動定位到崩潰位置的斷點怎麼打?

開發中常見的一類崩潰錯誤是遇到:unrecognized selector sent to instance 0xaxxxx…而backtrace又沒法明確說明錯誤在哪行代碼,如何快速定位BUG呢?

有時讀代碼一下很難找到是哪一個instance出的問題,這時定製有效的DEBUG斷點是最好的辦法,方法以下:

在Debug菜單中選擇 Breakpoints -> Create Symbolic Breakpoint…

SymbolicBreakpoint1

在Symbol中填寫以下方法簽名:

 

SymbolicBreakpoint2

而後再運行復現錯誤時斷點會停在真正致使崩潰的地方。

 

9、 error : typedef redefinition with different types (' ---ConnectionType----- ' vs '-----ConnectionT

刪除後邊的那個多餘的類型就行!

相關文章
相關標籤/搜索