整理iOS9適配中出現的坑

?

一、NSAppTransportSecurity

iOS9讓所有的HTTP默認使用了HTTPS,原來的HTTP協議傳輸都改成TLS1.2協議進行傳輸。直接造成的情況就是App發請求的時候彈出網絡無法連接。解決辦法就是在項目的info.plist 文件里加上如下節點:

NSAppTransportSecurity -?NSAllowsArbitraryLoads

這個子節點的意思是:是否允許任性的加載?! 設為YES的話就將禁用了AppTransportSecurity轉而使用用戶自定義的設置,這個問題就解決了。

如果你不是在董鉑然博客園看到本文,請點擊查看原文。

上面說是蘋果限制了HTTP協議,但是也并不是說所有的HTTPS都能完美適配iOS9了。

舉個栗子,從app內起webView加載https的網頁。新建個項目寫幾行起網頁的代碼

?
- (void)loadView{
UIWebView *web = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.view = web;
}
- (void)viewDidLoad {
[super viewDidLoad];
UIWebView *web = (UIWebView *)self.view; //董鉑然
NSURL *url = [NSURL URLWithString:@"https://github.com/"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[web loadRequest:request];
}

中間的url就是我們想要加載的https地址,用https://baidu.com/ 和?https://github.com/ 分別試一下,結果不同

??

github的網頁能打開,百度的網頁打不開,下面打印了一行log

?
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

原因是蘋果的說首先必須要基于TLS 1.2版本協議。然后證書的加密的算法還需要達到SHA256或者更高位的RSA密鑰或ECC密鑰,如果不符合,請求將被中斷并返回nil.

在瀏覽器中是可以直接查看這個網站的加密算法的,先點綠鎖再點證書信息。

從右邊兩張圖可以看出,github帶RSA加密的SHA-256符合蘋果的要求,所以才可以展示。

針對百度的情況可以在info.plist中配置如下,如果網站引用的比較多應該是需要針對每個網站進行配置。

NSAppTransportSecurity,NSExceptionDomains,NSIncludesSubdomains,NSExceptionRequiresForwardSecrecy,NSExceptionAllowInsecureHTTPLoads 寫在下面便于復制。

其中的ForwardSecrecy理解為超前的密碼保護算法,在里有寫,一共是11種。配置完畢百度可以訪問。

? ?

二、Bitcode

bitcode的理解應該是把程序編譯成的一種過渡代碼,然后蘋果再把這個過渡代碼編譯成可執行的程序。bitcode也允許蘋果在后期重新優化我們程序的二進制文件,有類似于App瘦身的思想。

用了xcode7的編譯器編譯之前沒問題的項目可能會出現下列報錯。

?
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

問題的原因是:某些第三方庫還不支持bitcode。要不然是等待庫的開發者升級了此項功能我們更新庫,要不就是把這個bitcode禁用。

禁用的方法就是找到如下配置,選為NO.(iOS中bitcode是默認YES,watchOS中bitcodes是不讓改的必須YES。)

三、設置信任

這一條只和企業級應用或inhose 有關,和AppStore渠道的應用無關。

在iOS8只是彈出一個窗問你是否需要讓手機信任這個應用,但是在iOS9卻直接禁止,如果真的想信任需要自己去手動開啟。類似于Mac系統從未知開發者處下載的dmg直接打不開,然后要到系統偏好設置的安全性與隱私手動打開。 下圖展示左邊iOS8,右邊iOS9

?

用戶需要去 設置---》通用---》描述文件 里面自行添加信任。

這種問題的處理方法也就兩種:1.提前周知暫時不要升級iOS9 ?2.大多是公司員工使用的企業級應用,群發一個指導郵件。?

iOS8中,字體是Helvetica,中文的字體有點類似于“華文細黑”。只是蘋果手機自帶渲染,所以看上去可能比普通的華文細黑要美觀。iOS9中,中文系統字體變為了專為中國設計的“蘋方” 有點類似于一種word字體“幼圓”。字體有輕微的加粗效果,并且最關鍵的是字體間隙變大了!

所以很多原本寫死了width的label可能會出現“...”的情況。

?iOS8

?iOS9 蛋疼

上面這兩張圖也可以直觀的看出同一個界面,同一個label的變化。

所以為了在界面顯示上不出錯,就算是固定長度的文字也還是建議使用sizetofit 或者ios向上取整 ceilf() 或者提前計算

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

五、URL scheme

URL scheme一般使用的場景是應用程序有分享或跳其他平臺授權的功能,分享或授權后再跳回來。

在iOS8并沒有做過多限制,但是iOS9需要將你要在外部調用的URL scheme列為白名單,才可以完成跳轉

如果iOS9沒做適配 會報如下錯誤

?
canOpenURL: failed for URL : "mqzone://qqapp" - error: "This app is not allowed to query for scheme mqzone"

具體的解決方案也是要在info.plist中設置 LSApplicationQueriesSchemes 類型為數組,下面添加所有你用到的scheme

六、statusbar

這個還好只是報一個警告,如果就是不管他,也不會出現問題。

?
<Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

以前我們為了能夠實時的控制頂部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;
}

點進頭文件可以驗證剛才說法:

?
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]");

七、didFinishLaunchingWithOptions

如果運行的時候報下列錯誤,那就是你的didFinishLaunchingWithOptions寫的不對了

?
***** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294**

iOS9不允許在didFinishLaunchingWithOptions結束了之后還沒有設置window的rootViewController。 也許是xcode7的編譯器本身就不支持。

解決的方法當然就是先初始化個值,之后再賦值替換掉

?
UIWindow *window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];
window.rootViewController = [[UIViewController alloc]init];

八、tableView

雖然現在的iOS9已經推送正式版了,但是iOS9使用時還是會感覺到App比以前更加卡頓了,tableView拖動時卡頓顯示的最為明顯。 并且之前遇到一個bug,原本好的項目用xcode7一編譯,tableView刷新出了問題 ,[tableView reloadData]無效 有一行cell明明改變了但是刷新不出來。 感覺可能是這個方法和某種新加的特性沖突了,猜測可能是reloadData的操作被推遲到下一個RunLoop執行最終失效。

解決的方法是,注釋[tableView reloadData],改用局部刷新,問題居然就解決了。

?
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

如果你不是在董鉑然博客園看到本文,請點擊查看原文。?

暫時遇到這些問題,感覺iOS9的出現讓所有iOS開發都是菊花一緊,希望蘋果這種大刀闊斧做改變,特立獨行的風格發展下去以后別和government 產生矛盾,然后公司倒閉 導致開發人員失業,也許是我想多了。預祝所有的iOS都能及時的做好適配改完bug,下個版本一上線,所有問題都解決。

轉載于:https://www.cnblogs.com/tian-sun/p/4849720.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287437.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

由c# dynamic是否裝箱引發的思考

前言前幾天在技術群里看到有同學在討論關于dynamic是否會存在裝箱拆箱的問題,我當時第一想法是"會"。至于為啥會有很多人有這種疑問&#xff0c;主要是因為覺得dynamic可能是因為有點特殊&#xff0c;因為它被稱為動態類型,可能是因為這里的動態對大家造成的誤解,認為…

【看動漫學編程】程序員在異世界生個娃 第3篇:搞不好我就是個王者

前言 作者文筆比較水&#xff0c;還請見諒。 以下內容還將使用視頻動態漫畫表現&#xff0c;剪輯完將會貼出鏈接。 小說劇情為劇情需要&#xff0c;過渡到知識點&#xff0c;部分篇幅可能沒有技術知識點還望諒解。 由于沒有經費支持&#xff0c;所以畫出來的東西是我自己用代碼…

PHP會話控制考察點

為什么要使用會話控制技術 HTTP協議是無狀態的&#xff0c;也就是說HTTP沒有一個內建的機制來維護兩個事務之間的狀態。當一個用戶完成一個請求發起第二個請求的時候&#xff0c;服務器無法知道這次請求是來自于上一次的客戶。而用戶登錄、購物車等&#xff0c;這些是需要服務器…

數據庫SQL語句學習筆記(6)-使用函數處理數據

1.SQL也可以用函數來處理數據&#xff0c;函數一般是在數據上執行的&#xff0c;為數據的轉換和處理提供了方便。但是每一個數據庫管理系統&#xff08;DBMS&#xff09;都有特定的函數&#xff0c;事實上&#xff0c;只有少數幾個函數被所有的DBMS等同地支持。例如&#xff0c…

java3n 1_1005 繼續(3n+1)猜想(JAVA)

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目里&#xff0c;情況稍微有些復雜。當我們驗證卡拉茲猜想的時候&#xff0c;為了避免重復計算&#xff0c;可以記錄下遞推過程中遇到的每一個數。例如對 n3 進行驗證的時候&#xff0c;我們需要計算 3、5、8、4、2、1&…

【遙感物候】Matlab求解一元六次多項式,計算植被生長季始期

一元六次多項式能很好的逼近濾波后的曲線,與二次多項式相比,在擬合植被整個生長季曲線方面有更好的優勢,該方法常用來描述北方溫帶和高緯度地區時序NDVI生長季模式。因此,本文使用一元六次多項式來擬合植被整個生長季曲線,效果很好。那么擬合后,這樣解方程呢求生長季參數…

Android之給控件添加水紋波效果

1 問題 給控件添加水紋波效果&#xff0c;點擊起來像點中了&#xff0c;不然效果太粗糙了&#xff0c;沒反應。 2 實現 給控件添加如下屬性 android:background"?android:attr/selectableItemBackground"波紋有邊界 android:background"?android:attr/sele…

《看聊天記錄都學不會C語言?太菜了吧》(1)我在大佬群里問基礎問題沒人理?

若是大一學子或者是真心想學習的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手…

個人博客作業_week2

1. 是否需要有代碼規范 1.這些規范都是官僚制度下產生的浪費大家的編程時間、影響人們開發效率&#xff0c;浪費時間的東西。 我不同意這個論點。 有句俗語’無規矩不成方圓‘&#xff0c;這亙古傳承的至理同樣適用于寫代碼。制定代碼撰寫規范并不是 迫于壓力完成上級的任務&am…

最全面透徹的RabbitMQ指南

概念RabbitMQ是實現了高級消息隊列協議&#xff08;AMQP&#xff09;的開源消息代理軟件&#xff08;亦稱面向消息的中間件&#xff09;。RabbitMQ服務器是用Erlang語言編寫的&#xff0c;而集群和故障轉移是構建在開放電信平臺框架上的。所有主要的編程語言均有與代理接口通訊…

TensorFlow中RNN實現的正確打開方式

上周寫的文章《完全圖解RNN、RNN變體、Seq2Seq、Attention機制》介紹了一下RNN的幾種結構&#xff0c;今天就來聊一聊如何在TensorFlow中實現這些結構&#xff0c;這篇文章的主要內容為&#xff1a; 一個完整的、循序漸進的學習TensorFlow中RNN實現的方法。這個學習路徑的曲線較…

【遙感物候】Hants NDVI時間序列諧波分析法數據重構,植被生長季曲線效果可佳(附Hants軟件下載)

NDVI時間序列諧波分析法(Harmonic Analysis of NDVI Time-Series)(簡稱Hants )對時間序列數據進行平滑。該方法是一種新的物候分析方法,可用于定量化的監測植被動態變化。其核心算法是傅里葉變換和最小二乘法擬合, 即把時間波譜數據分解成許多不同頻率的正弦曲線和余弦曲線,…

Android之在Java socket作為服務器里面返回數據頭部怎么寫入瀏覽器需要下載文件的文件名

1 問題 Android app里面寫了一個Java socket的簡單服務器,在瀏覽器里面輸入相應的IP和端口訪問服務器下載文件,Java socket怎么寫返回數據的頭部信息,瀏覽器才知道需要下載文件的名字呢? 2 關于Content-Disposition 在常規的HTTP應答中,Content-Disposition 響應頭指示回…

java中hasnext的作用_java中Scanner的hasNext()的疑問

第一個問題&#xff0c;兩段代碼的區別在于阻塞的位置不同&#xff0c;加上一行輸出代碼就可以很明顯地看到差別。Test.javaimport java.util.Scanner;public class Test {public static void main(String[] args) {Scanner s new Scanner(System.in);while(s.hasNext()){Syst…

《看聊天記錄都學不會C語言?太菜了吧》(2)我說編程很容易你們不服?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

ABAP的自學之路 ,初步認識ABAP 一

由于工作的關系&#xff0c;最近需要對SAP系統進行二次開發&#xff0c;于是開始學習ABAP。鑒于網上對于ABAP的資料少之又少&#xff0c;所以自己整理一些資料。 第一章 ABAP 開發環境和總體介紹1.1 ABAP 開發環境ABAP 開發的三種環境&#xff1a;&#xff08;1&#xff09;SAP…

LCD1602,4位數據總線液晶屏時鐘,STC12C5A60S2的10位ADC功能程序

/* 程序名&#xff1a;    LCD1602&#xff0c;4位數據總線液晶屏時鐘&#xff0c;STC12C5A60S2的10位ADC功能程序 編寫時間&#xff1a;  2015年10月4日 硬件支持&#xff1a;  LCD1602液晶屏 STC12C5A60S2 外部12MHZ晶振 接線定義&#xff1a; DB7 --> P1^7DB6…

WPF|黑暗模式的錢包支付儀表盤界面設計

收集下大家的意見&#xff0c;是否需要在文中貼上源碼&#xff08;文末會給出源碼鏈接&#xff09;&#xff0c;請大家踴躍留言。閱讀目錄效果展示準備簡單說明 源碼結尾&#xff08;視頻及源碼倉庫&#xff09;1. 效果展示欣賞效果&#xff1a;2. 準備創建一個WPF工程&#x…

量子計算機的現狀和趨勢

量子計算機概述 計算機是一種新型的運算 它具有具有強大的并行處理數據的能力&#xff0c;可解決現有計算機難以運算的數學問題。因此&#xff0c;它成為世界各國戰略競爭的焦點。 量子計算機的優勢 量子計算機與現有的電子計算機以及正在研究的光計算機&#xff0c;生物計算機…

【空間數據庫】Windows操作系統PostgreSQL+PostGIS環境搭建圖文安裝教程

PostgreSQL是一種特性非常齊全的自由軟件的對象-關系型數據庫管理系統(ORDBMS),PostgreSQL支持大部分的SQL標準并且提供了很多其他現代特性,如復雜查詢、外鍵、觸發器、視圖、事務完整性、多版本并發控制等。同樣,PostgreSQL也可以用許多方法擴展,例如通過增加新的數據類…