iOS9的新特性以及適配方案

1. 限制HTTP協議,所有改用更安全的HTTPS

iOS9讓全部的HTTP默認使用了HTTPS,原來的HTTP協議傳輸都改爲TLS1.2協議進行傳輸。直接形成的狀況就是App發請求的時候彈出網絡沒法鏈接。
對於這個問題的解決方案,網上有一篇博客已經總結的很好了,我在這就簡要的說明怎麼處理這種問題.html

HTTPS和HTTP的區別在於哪裏呢?
舉個簡單的栗子:原來的 HTTP 是塑料水管,容易被戳破;那麼現在新設計的 HTTPS 就像是在原有的塑料水管以外,
再包一層金屬水管。一來,原有的塑料水管照樣運行;二來,用金屬加固了以後,不容易被戳破。

Apple讓你的HTTP採用SSL/TLS協議,就是讓你從HTTP轉到HTTPS.
不使用SSL/TLS的HTTP通訊,就是不加密的通訊!

全部信息明文傳播,帶來了三大風險:
竊聽風險(eavesdropping):第三方能夠獲知通訊內容。
篡改風險(tampering):第三方能夠修改通訊內容。
冒充風險(pretending):第三方能夠冒充他人身份參與通訊。

SSL/TLS協議是爲了解決這三大風險而設計的:
全部信息都是加密傳播,第三方沒法竊聽。
具備校驗機制,一旦被篡改,通訊雙方會馬上發現。
配備身份證書,防止身份被冒充。
  • 在 Info.plist 中聲明,倒退回不安全的網絡請求依然能讓App訪問指定http,甚至任意的http(蘋果不建議這麼作):

須要添加的節點


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

2. Bitcode

應該有朋友在真機調試的時候發如今使用微博微信等第三方SDK的時候,會提示報錯,ios

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

Xcode默認開啓bitcode模式,bitcode的理解應該是把程序編譯成的一種過渡代碼,而後蘋果再把這個過渡代碼編譯成可執行的程序。bitcode也容許蘋果在後期從新優化咱們程序的二進制文件,能夠直接理解爲APP瘦身
解決方式:api

  • 某些第三方庫還不支持bitcode,咱們只能等待庫的開發者升級了此項功能.(這個是咱們所不能掌握的,嘿嘿)
  • 直接禁用bitcode,禁用的方法就是找到以下配置,選爲NO.注意:iOS中bitcode是默認YES,watchOS中bitcodes是不讓改的必須爲YES。

    選爲NO禁用

3. 企業級分發

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

  • 設置-->通用--->描述文件 自行添加信任.

選擇描述文件

添加信任

4. URL scheme

URL scheme通常使用的場景是應用程序有分享或跳其餘平臺受權的功能,分享或受權後再跳回來.
在iOS8並無作過多限制,可是iOS9須要將你要在外部調用的URL scheme列爲白名單,才能夠完成跳轉.
若是iOS9沒作適配 會報以下錯誤 :服務器

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

例如在實現第三方登陸時,不能直接跳轉到相應的app直接獲取權限.
解決方式爲:微信

  • 設置應用白名單 不然不能直接關聯上你手機裏的應用
    在info.plist中加入
    <key>LSApplicationQueriesSchemes</key> <array> <!-- 微信 URL Scheme 白名單--> <string>wechat</string> <string>weixin</string> <!-- 新浪微博 URL Scheme 白名單--> <string>sinaweibohd</string> <string>sinaweibo</string> <string>sinaweibosso</string> <string>weibosdk</string> <string>weibosdk2.5</string> <!-- QQ、Qzone URL Scheme 白名單--> <string>mqqapi</string> <string>mqq</string> <string>mqqOpensdkSSoLogin</string> <string>mqqconnect</string> <string>mqqopensdkdataline</string> <string>mqqopensdkgrouptribeshare</string> <string>mqqopensdkfriend</string> <string>mqqopensdkapi</string> <string>mqqopensdkapiV2</string> <string>mqqopensdkapiV3</string> <string>mqzoneopensdk</string> <string>wtloginmqq</string> <string>wtloginmqq2</string> <string>mqqwpa</string> <string>mqzone</string> <string>mqzonev2</string> <string>mqzoneshare</string> <string>wtloginqzone</string> <string>mqzonewx</string> <string>mqzoneopensdkapiV2</string> <string>mqzoneopensdkapi19</string> <string>mqzoneopensdkapi</string> <string>mqzoneopensdk</string> <!-- 支付寶 URL Scheme 白名單--> <string>alipay</string> <string>alipayshare</string></array>

5. statusbar

之前咱們爲了可以實時的控制頂部statusbar的樣式,可能會在喜歡使用markdown

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent] [[UIApplication sharedApplication]setStatusBarHidden:YES];

可是這麼作以前須要將 info.plist 裏面加上View controller-based status bar appearance BOOL值設爲NO,就是把控制器控制狀態欄的權限給禁了,用UIApplication來控制。
可是這種作法在iOS9不建議使用了,建議咱們使用把那個BOOL值設爲YES,而後用控制器的方法來管理狀態欄好比。網絡

- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }

6. 字體

iOS9中,中文系統字體變爲了專爲中國設計的「蘋方」,字體有輕微的加粗效果,而且最關鍵的是字體間隙變大了!
因此不少本來寫死了width的label可能會出現「...」的狀況。
包括在不少時候咱們自動計算行高行寬的時候出現誤差,致使一些不可知的錯誤
解決方式:app

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

加上向上取整 ceilf()就能解決了.

7. AFNetworking

爲了迎合iOS新版本的升級, AFNetworking在3.0版本中刪除了基於 NSURLConnection API的全部支持。若是你的項目之前使用過這些API,建議當即升級到基於 NSURLSession 的API的AFNetworking的版本。
具體解決方案在我這一篇文檔中有詳細說明AFNetworking 3.0的遷移,若是有感興趣的朋友能夠看看.

8.UIAlertController

這其實不算是新特性,只是在iOS9版本,廢棄了UIAlertView,Action Sheets,所以咱們必需要掌握UIAlertController的使用,如今爲了適配iOS7,不少項目仍是會繼續使用UIAlertView,Action Sheets,可是下幾個版本應該就會慢慢不用了.
這裏我只列出簡單的使用方法,具體的方式有一個博客詳細說明.

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"標題" message:@"這個是UIAlertController的默認樣式" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil]; [alertController addAction:cancelAction]; [alertController addAction:okAction]; [self presentViewController:alertController animated:YES completion:nil];

9.堆棧視圖(UIStackView)

相信不少朋友尚未發現這個好東西,UIStackView提供了一個高效的接口用於平鋪一行或一列的視圖組合。對於嵌入到StackView的視圖,你不用再添加自動佈局的約束了。Stack View管理這些子視圖的佈局,並幫你自動佈局約束。也就是說,這些子視圖可以適應不一樣的屏幕尺寸。
舉個栗子:
之前咱們若是想要在xib上橫向佈局三個按鈕,讓三個按鈕距離相等,咱們可能須要再加三個View,將button放在View上面,再將View佈局三等分,相似於


三個按鈕

這樣子是否是比較麻煩呢?有了Stack View

相關文章
相關標籤/搜索