Demo1_iOS9網路適配_改用更安全的HTTPS
iOS9把所有的http請求都改為https了:iOS9系統傳送的網路請求將統一使用TLS 1.2 SSL。採用TLS 1.2 協議,目的是 強制增強資料訪問安全,而且 系統 Foundation 框架下的相關網路請求,將不再預設使用 Http 等不安全的網路協議,而預設採用 TLS 1.2。伺服器因此需要更新,以解析相關資料。如不更新,可通過在 Info.plist 中宣告,倒退回不安全的網路請求。
書歸正傳【嚴肅臉】,我們正式討論下 WHAT,WHY,HOW:
WHAT(什麼是SSL/TLS?跟HTTP和HTTPS有什麼關係)
WHY(以前的HTTP不是也能用嗎?為什麼要用SSL/TLS,閒得慌?!Apple是不是又在反人類?)
HOW(如何適配?)
1.WHAT(什麼是SSL/TLS?跟HTTP和HTTPS有什麼關係)
跟往常一樣,先說結論:
HTTP+SSL/TLS+TCP = HTTPS
SSL 3.0版本之後的迭代版本被重新命名為TLS 1.0,也就是:TLS 1.0 = SSL 3.1
常用的是下面這些:
SSL 2.0
SSL 3.0
TLS 1.0 (SSL 3.1)
TLS 1.1 (SSL 3.1)
TLS 1.2 (SSL 3.1)
Apple讓你的HTTP採用SSL/TLS協議,就是讓你從HTTP轉到HTTPS
2.WHY(以前的HTTP不是也能用嗎?為什麼要用SSL/TLS,閒得慌?!Apple是不是又在反人類?)
不使用SSL/TLS的HTTP通訊,就是不加密的通訊!
所有資訊明文傳播,帶來了三大風險:
竊聽風險(eavesdropping):第三方可以獲知通訊內容。
篡改風險(tampering):第三方可以修改通訊內容。
冒充風險(pretending):第三方可以冒充他人身份參與通訊。
SSL/TLS協議是為了解決這三大風險而設計的,希望達到:
所有資訊都是加密傳播,第三方無法竊聽。
具有校驗機制,一旦被篡改,通訊雙方會立刻發現。
配備身份證書,防止身份被冒充。
3.HOW(如何適配?---弱弱地問下:加班要多久?)
正如文章開頭所說:
TLS 1.2 協議 強制增強資料訪問安全 系統 Foundation 框架下的相關網路請求,將不再預設使用 Http 等不安全的網路協議,而預設採用 TLS 1.2。伺服器因此需要更新,以解析相關資料。如不更新,可通過在 Info.plist 中宣告,倒退回不安全的網路請求。
方案一:立即讓公司的服務端升級使用TLS 1.2
方案二:雖Apple不建議,但可通過在 Info.plist 中宣告,倒退回不安全的網路請求依然能讓App訪問指定http,甚至任意的http。
在plist檔案設定:
Source code:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
詳細設定
如果你想設定不阻止任何網路,只需要在info.plist檔案中加入以下內容即可
如果你想設定只允許特定host的網路請求,在info.plist檔案中加入以下內容
二、Bitcode(通俗解釋:線上版安卓ART模式)
未來Watch應用須包含Bitcode,iOS不強制,但Xcode7預設會開啟Bitcode。
如何適配?
方法一:更新library使包含Bitcode,否則會出現以下中的警告;
1
|
( 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,方法見下圖
三、企業級分發
iOS9之前,企業級分發十分方便:點選App出現“信任按鈕”,
iOS9以後,企業級分發ipa包將遭到與Mac上dmg安裝包一樣的待遇:預設不能安裝,也不再出現“信任按鈕”
必須讓使用者進行gif圖中的設定(相關Demo:https://github.com/ChenYilong/iOS9AdaptationTips/ )
四、URL scheme
在iOS9中,如果使用URL scheme必須在"Info.plist"中將你要在外部呼叫的URL scheme列為白名單,否則不能使用。key叫做LSApplicationQueriesSchemes ,鍵值內容是
1
|
LSApplicationQueriesSchemes urlscheme urlscheme2 urlscheme3 urlscheme4 |
推薦一篇部落格: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
五、專案執行報錯如下
<Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
<Error>: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
<Error>: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
出錯原因:設定app的狀態列樣式的使用使用了舊的方式,在info.plist裡面設定了View controller-based status bar appearance為NO,預設為YES,一般式iOS6的時候使用這種方式,iOS7,8也相容,但是到了iOS9就報了警告。
解決辦法:
刪除 原先的設定程式碼//設定狀態列的白色
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
修改方式將View controller-based status bar appearance設定為YES,然後使用新的方式來實現狀態列的樣式。

在你的 自定義導航控制器裡面 寫上如下方法:
//設定狀態列的(亮色)白色-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
記住要clean 或者刪除應用程式 重新執行
六、
升級Xcode 7 之後 ios 9 模擬器 一啟動程式 就直接報錯
報錯如下***** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294**
原因:
新的SDK不允許在設定rootViewController之前做過於複雜的操作,導致在didFinishLaunchingWithOptions 結束後還沒有設定rootViewController
Xcode7需要所有UIWindow必須立即先設定一個rootViewController
解決辦法:
先設定個rootVIewController 之後重新賦值UIWindow *window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];
window.rootViewController = [UIViewController new];
七、Demo2_iOS9新特性_更靈活的後臺定位
【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原始碼是:
八、字型
所以為了在介面顯示上不出錯,就算是固定長度的文字也還是建議使用sizetofit 或者ios向上取整 ceilf() 或者提前計算
CGSize size = [title sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}]; CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
九、tableView
雖然現在的iOS9已經推送正式版了,但是iOS9使用時還是會感覺到App比以前更加卡頓了,tableView拖動時卡頓顯示的最為明顯。 並且之前遇到一個bug,原本好的專案用xcode7一編譯,tableView刷新出了問題 ,[tableView reloadData]無效 有一行cell明明改變了但是重新整理不出來。 感覺可能是這個方法和某種新加的特性衝突了,猜測可能是reloadData的操作被推遲到下一個RunLoop執行最終失效。
解決的方法是,註釋[tableView reloadData],改用區域性重新整理,問題居然就解決了。
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
十.Scheme白名單問題(無法判斷手機是否安裝微信等)
-canOpenURL: failed for URL: "weixin://app/wxdaae92a9cfe5d54c/" - error: "This app is not allowed to query for scheme weixin"
搜尋後得知
近期蘋果公司iOS 9系統策略更新,限制了http協議的訪問,此外應用需要在“Info.plist”中將要使用的URL Schemes列為白名單,才可正常檢查其他應用是否安裝。
受此影響,當你的應用在iOS 9中需要使用微信SDK的相關能力(分享、收藏、支付、登入等)時,需要在“Info.plist”裡增加如下程式碼:
注意:截圖來自微信開放平臺,裡面已經包含第一個問題的解決
完成後需使用Xcode 7編譯。
如果你在模擬器上執行可以能還會有以下報錯:
-canOpenURL: failed for URL: "weixin://app/wxdaae92a9cfe5d54c/" - error: "(null)"
這是因為模擬器上並沒有安裝微信,如果執行到真機上就不會有報錯了。
請注意:未升級到微信客戶端6.2.5及以上版本的使用者,在iOS 9下使用到微信相關功能時,仍可能無法成功。
下面整理一些常用的白名單
LSApplicationQueriesSchemes
mqqOpensdkSSoLogin
mqzone
sinaweibo
alipayauth
alipay
safepay
mqq
mqqapi
mqqopensdkapiV3
mqqopensdkapiV2
mqqapiwallet
mqqwpa
mqqbrowser
wtloginmqq2
weixin
wechat
qq登入繫結,qq支付,qq分享
微信支付,微信登入繫結
新浪登入繫結
支付寶支付,支付寶登入繫結
十一、
directory not found for option問題
警告如下:
ld: warning: directory not found for option '-F/Applications/Xcode 7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.0.sdk/Developer/Library/Frameworks'
問題原因:Xcode7將framworks位置改變了。
解決方法:
點選專案,選擇 Targets->xxxTests
選擇build setting ,找到 Frameworks Search Path 或者 Library Search Paths
刪除$(SDKROOT)/Developer/Library/Frameworks,
或者使用$(PLATFORM_DIR)/Developer/Library/Frameworks替換
framworks位置改變
暫時到這裡。。。。。。後期有再更新。希望此文對你們有幫助,也對自己有幫助。