本文是投稿文章,作者:ChenYilong(https://github.com/ChenYilong/iOS9AdaptationTips)
Demo1_iOS9網絡適配_改用更安全的HTTPS
iOS9把所有的http請求都改為https了:iOS9系統發送的網絡請求將統一使用TLS 1.2 SSL。采用TLS 1.2 協議,目的是 強制增強數據訪問安全,而且 系統 Foundation 框架下的相關網絡請求,將不再默認使用 Http 等不安全的網絡協議,而默認采用 TLS 1.2。服務器因此需要更新,以解析相關數據。如不更新,可通過在 Info.plist 中聲明,倒退回不安全的網絡請求。
在討論之前,跟往常一樣,先說下iOS程序猿們最關心的問題:
跟我有毛關系?需要我加班嗎?!
首先咱們來看下業內對Apple這一做法的評論:
這是某社交App上討論,看來業內還是吐槽聲和肯定聲同在。
結論是:
跟你很有關系,加班吧,少年!
書歸正傳【嚴肅臉】,我們正式討論下 WHAT,WHY,HOW:
WHAT(什麼是SSL/TLS?跟HTTP和HTTPS有什麼關系)
跟往常一樣,先說結論:
HTTP+SSL/TLS+TCP = HTTPS
TLS 是 SSL 新的別稱。舉個例子:
“TLS1.0”之於“SSL3.1”,猶“公元2015”之於“民國104”,或者是“一千克”之於“一公斤”,或者是“半斤”之於“八兩”:稱呼不同,但意思相同。
SSL 3.0版本之後的迭代版本被重新命名為TLS 1.0,
也就是說:
TLS 1.0 = SSL 3.1
所以他們是一個東西,我們平常也經常簡單見到 “SSL/TLS” 這種說法。
常用的是下面這些:
那為什麼標題是“使用HTTPS”而沒有提及SSL和TLS什麼事? 要理解這個,要看下一個公式:
HTTP+SSL/TLS+TCP = HTTPS
打個比方:如果原來的 HTTP 是塑料水管,容易被戳破;那麼如今新設計的 HTTPS 就像是在原有的塑料水管之外,再包一層金屬水管。一來,原有的塑料水管照樣運行;二來,用金屬加固了之後,不容易被戳破。
目前,應用最廣泛的是TLS 1.0,接下來是SSL 3.0。但是,主流浏覽器都已經實現了TLS 1.2的支持。
Apple讓你的HTTP采用SSL/TLS協議,就是讓你從HTTP轉到HTTPS
WHY(以前的HTTP不是也能用嗎?為什麼要用SSL/TLS,閒得慌?!Apple是不是又在反人類?)
不使用SSL/TLS的HTTP通信,就是不加密的通信!
所有信息明文傳播,帶來了三大風險:
SSL/TLS協議是為了解決這三大風險而設計的,希望達到:
HOW(如何適配?---弱弱地問下:加班要多久?)
正如文章開頭所說:
TLS 1.2 協議 強制增強數據訪問安全 系統 Foundation 框架下的相關網絡請求,將不再默認使用 Http 等不安全的網絡協議,而默認采用 TLS 1.2。服務器因此需要更新,以解析相關數據。如不更新,可通過在 Info.plist 中聲明,倒退回不安全的網絡請求。
方案一:立即讓公司的服務端升級使用TLS 1.2
方案二:雖Apple不建議,但可通過在 Info.plist 中聲明,倒退回不安全的網絡請求依然能讓App訪問指定http,甚至任意的http,
具體做法見gif圖,示例Demo見 Demo1
正如 Apple官方文檔 所說 :
Info.plist 配置中的XML源碼如下所示:
上面是比較嚴謹的做法,指定了能訪問哪些特定的HTTP。當然也有暴力的做法: 徹底倒退回不安全的HTTP網絡請求,能任意進行HTTP請求,比如你在開發一款浏覽器App,或者你想偷懶,或者後台想偷懶,或者公司不給你升級服務器。。。
聲明:目前Apple的官方文檔並未提及如何在 Info.plist 配置,我將密切關注官方文檔,如有提及,再來更新本文 .
Demo2_iOS9新特性_更靈活的後台定位
Demo:GitHub地址
【iOS9在定位的問題上,有一個壞消息一個好消息】壞消息:如果不適配iOS9,就不能偷偷在後台定位(不帶藍條,見圖)!好消息:將允許出現這種場景:同一App中的多個location manager:一些只能在前台定位,另一些可在後台定位,並可隨時開啟或者關閉特定location manager的後台定位。
如果沒有請求後台定位的權限,也是可以在後台定位的,不過會帶藍條:
如何偷偷在後台定位:請求後台定位權限:
// 1. 實例化定位管理器 _locationManager = [[CLLocationManager alloc] init]; // 2. 設置代理 _locationManager.delegate = self; // 3. 定位精度 [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; // 4.請求用戶權限:分為:?只在前台開啟定位?在後台也可定位, //注意:建議只請求?和?中的一個,如果兩個權限都需要,只請求?即可, //??這樣的順序,將導致bug:第一次啟動程序後,系統將只請求?的權限,?的權限系統不會請求,只會在下一次啟動應用時請求? if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) { //[_locationManager requestWhenInUseAuthorization];//?只在前台開啟定位 [_locationManager requestAlwaysAuthorization];//?在後台也可定位 } // 5.iOS9新特性:將允許出現這種場景:同一app中多個location manager:一些只能在前台定位,另一些可在後台定位(並可隨時禁止其後台定位)。 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) { _locationManager.allowsBackgroundLocationUpdates = YES; } // 6. 更新用戶位置 [_locationManager startUpdatingLocation];
但是如果照著這種方式嘗試,而沒有配置Info.plist,100%你的程序會崩潰掉,並報錯:
*** Assertion failure in -[CLLocationManager setAllowsBackgroundLocationUpdates:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreLocationFramework_Sim/CoreLocation-1808.1.5/Framework/CoreLocation/CLLocationManager.m:593
要將 Info.plist 配置如下:
對應的 Info.plist 的XML源碼是:
Bitcode(通俗解釋:在線版安卓ART模式)
未來Watch應用須包含Bitcode,iOS不強制,但Xcode7默認會開啟Bitcode。
如何適配?
方法一:更新library使包含Bitcode,否則會出現以下中的警告;
(null): URGENT: all bitcode will be dropped because '/Users/myname/Library/Mobile Documents/com~apple~CloudDocs/foldername/appname/GoogleMobileAds.framework/GoogleMobileAds(GADSlot+AdEvents.o)' was built without 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. Note: This will be an error in the future.
方法二:關閉Bitcode,方法見下圖
更多信息,請移步 bitcode 蘋果官方文檔
,和 WWDC 2015 Session 102: "Platforms State of the Union"
企業級分發
iOS9之前,企業級分發十分方便:點擊App出現“信任按鈕”,
iOS9以後,企業級分發ipa包將遭到與Mac上dmg安裝包一樣的待遇:默認不能安裝,也不再出現“信任按鈕”
必須讓用戶進行gif圖中的設置(相關Demo:https://github.com/ChenYilong/iOS9AdaptationTips/ )
URL scheme
在iOS9中,如果使用URL scheme必須在"Info.plist"中將你要在外部調用的URL scheme列為白名單,否則不能使用。key叫做LSApplicationQueriesSchemes ,鍵值內容是
LSApplicationQueriesSchemes urlscheme urlscheme2 urlscheme3 urlscheme4
推薦一篇博客: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
其中最關鍵的是以下部分:
If you call the “canOpenURL” method on a URL that is not in your whitelist, it will return “NO”, even if there is an app installed that has registered to handle this scheme. A “This app is not allowed to query for scheme xxx” syslog entry will appear. If you call the “openURL” method on a URL that is not in your whitelist, it will fail silently. A “This app is not allowed to query for scheme xxx” syslog entry will appear.
更多信息請移步:WWDC 2015 Session 703: "Privacy and Your App" 時間在30:18左右
iPad適配Slide Over 和 Split View
【iPad適配Slide Over 和 Split View】 若想適配multi tasking特性,唯一的建議:棄純代碼,改用storyboard、xib,縱觀蘋果WWDC所有Demo均是如此: