新的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(蘋果不建議這么做):
參考 :http://www.cnblogs.com/endtel/p/4810042.html
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。
-
選為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的樣式,可能會在喜歡使用
[[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的版本。