iOS9新特性及其適配方案

    2015年9月8日,蘋果宣佈iOS 9操作系統的正式版在太平洋時間9月16日正式推出,北京時間9月17日凌晨1點推送。新的iOS 9系統比iOS8更穩定,功能更全面,而且還更加開放。iOS 9加入了更多的新功能,包括更加智能的Siri,新加入的省電模式。iOS 9爲開發者提供5000個全新的API。這對於使用者來說固然是一個好消息,每一次版本更新帶來的都是更多的便利和更全面的功能,接受新的系統固然會有一些不適應,新的系統也有可能會有一些缺陷,但是至少蘋果在不斷地更新,讓我們體驗更好的產品.
    然而,對於我們開發者來說,這就不能說是一個好消息了,系統更新迭代,伴隨的是我們需要快速的接受新的知識,掌握新的技巧,以及大量的修改我們的工程,不過也沒辦法,誰讓我們是程序員呢,不更新自己就會被科技淘汰,相信很多朋友在這上面被坑過,那麼請繼續往下看.步入正題,最近一段時間,我總結了前一段時間遇到的一些伴隨新系統出現的問題,經過自己的測試以及網上的資料,同時總結了解決方案.

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

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

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轉而使用用戶自定義的設置,這個問題就解決了。

2. Bitcode

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

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瘦身。
解決方式:

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

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的樣式,可能會在喜歡使用

[[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可能會出現“…”的情況。
包括在很多時候我們自動計算行高行寬的時候出現偏差,導致一些不可知的錯誤
解決方式:

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
這裏寫圖片描述

有了這個玩意兒,整個過程會簡化很多

補充待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章