1. 程式人生 > >iOS 整理iOS9適配中出現的坑

iOS 整理iOS9適配中出現的坑

轉載 http://www.cocoachina.com/ios/20151016/13715.html

===================================================

作者:董鉑然 授權本站轉載。

本文主要是說一些iOS9適配中出現的坑,如果只是要單純的瞭解iOS9新特性可以看瞄神的開發者所需要知道的 iOS 9 SDK 新特性。9月17日凌晨,蘋果給使用者推送了iOS9正式版,隨著有使用者陸續升級iOS9,也就逐漸的衍生出了一系列的問題,筆者也在趕忙為自己維護的App做適配,本文寫的一些坑基本都是親身體驗了。

一、NSAppTransportSecurity

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

blob.png

NSAppTransportSecurity - NSAllowsArbitraryLoads

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

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

舉個栗子,從app內起webView載入https的網頁。新建個專案寫幾行起網頁的程式碼

1 2 3 4 5 6 7 8 9 10 11 12 - (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:@]; NSURLRequest *request = [NSURLRequest requestWithURL:url];
[web loadRequest:request]; }

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

blob.png

blob.png

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

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

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

在瀏覽器中是可以直接檢視這個網站的加密演算法的,先點綠鎖再點證書資訊。

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

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

blob.png

NSAppTransportSecurity,NSExceptionDomains,NSIncludesSubdomains,NSExceptionRequiresForwardSecrecy,NSExceptionAllowInsecureHTTPLoads 寫在下面便於複製。

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

blob.png

blob.png

二、Bitcode

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

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

1 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。)

blob.png

三、設定信任

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

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

blob.png

blob.png

使用者需要去 設定---》通用---》描述檔案 裡面自行新增信任。

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

四、字型

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

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

iOS8

blob.png

iOS9 蛋疼

blob.png

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

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

1 2 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沒做適配 會報如下錯誤

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

具體的解決方案也是要在info.plist中設定 LSApplicationQueriesSchemes 型別為陣列,下面新增所有你用到的scheme

blob.png

六、statusbar

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

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

以前我們為了能夠實時的控制頂部statusbar的樣式,可能會在喜歡使用

1 2 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent] [[UIApplication sharedApplication]setStatusBarHidden:YES];

但是這麼做之前需要將 info.plist 裡面加上View controller-based status bar appearance  BOOL值設為NO,就是把控制器控制狀態列的許可權給禁了,用UIApplication來控制。但是這種做法在iOS9不建議使用了,建議我們使用吧那個BOOL值設為YES,然後用控制器的方法來管理狀態列比如。

1 2 3 4 - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent;

相關推薦

iOS 整理iOS9出現

轉載 http://www.cocoachina.com/ios/20151016/13715.html =================================================== 作者:董鉑然 授權本站轉載。 本文主要是說一些iOS9適

整理 iOS 9 出現(圖文)

宣告:本文轉載自http://www.cocoachina.com/ios/20151016/13715.html 本文主要是說一些iOS9適配中出現的坑,如果只是要單純的瞭解iOS9新特性可以看瞄神的開發者所需要知道的 iOS 9 SDK 新特性。9月17日凌晨,蘋果

iOS開發之iOS11&iPhoneX的一些

導航欄 導航欄高度的變化 iOS11之前導航欄預設高度為64pt(這裡高度指statusBar + NavigationBar),iOS11之後如果設定了prefersLargeTitles = YES則為96pt,預設情況下還是64pt,但在iP

我們來一探究竟 Android 7.0 FileProvider 部分

rip 使用 star 過程 限制 需要 lock 目錄文件 support 本文標簽: Android7.0 FileProvider 由於 Android 7.0 或更高版本的系統在國內手機市場上的占比不是很高,很多 Android 開發人員並沒有做 7.0 適配工作,

iOS屏幕方案-Auto Layout

board for intro post 用戶 this 沒有 ber ios控件 市場上的android手機五花八門。各種尺寸的屏幕讓android程序員們比較頭疼。也有一些大神寫了一些博客提出了自己的觀點。iOS貌似也迎來了大屏6+,因此屏幕適配的問

xcode7和ios9之路

get sans att 新建 技術分享 matching resolve down 二進制 從xcode6.x升級xcode7.2之後,發現要做一堆事情來做適配,不然之前的項目沒法好好執行。 一.換庫 dylib後綴的庫都要換成tbd後綴的。例如以下所看到的

iOS】螢幕

螢幕適配 1、螢幕適配的發展過程: 程式碼計算frame -> autoreszing(父控制元件和子控制元件的關係) -> autolayout(任何控制元件都可以產生關係) -> sizeclass   沒有螢幕適配,直接使用frame固定子控制元件的

三款新iPhone劉海屏沒跑了!蘋果要求iOS APP必須

原標題:三款新iPhone劉海屏沒跑了!蘋果要求iOS APP必須適配 2017年蘋果最重磅的新品就 2017年蘋果最重磅的新品就是iPhone X了。可從外形的角度,由於頂部“劉海”的存在,距離完美的全面屏還差一截。 同時,這種異形切割的設計也對iOS軟體的適配帶來了挑戰和提

劉海屏繼續!蘋果要求iOS App必須

中關村線上訊息:若說去年最火的,應該是所有人都會想到的。不過由於劉海屏的外觀設計,距離真正的全面屏手機還是有很長一段距離要走。不過,這種異形屏對iOS的適配帶來了挑戰和提出新要求,即便蘋果很早就給出了文件,幫助開發者快速調整,然而進度似乎並不令人滿意。 劉海屏設計 今天根據外媒

<iOS屏幕> iPhoneX SafeArea - 安全區域

sub 分享 ace 了解 ati 屏幕寬度 tool 圖的創建 結果 一. 前言 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "PingFang SC"; color: #000000 } span.s1 {

iOS 9 HTTPS

Xcode 7.0也就是iOS9.0中開發要求App內訪問的網路必須使用HTTPS協議。那麼我們公司沒用採用https怎麼辦?如果發現網路請求失敗,Xcode後臺報錯資訊為:  The resource could not be loaded because the App

iOS ---【開發iPhone XS, iPhone XS Max, iPhone XR】

總結為以下幾點: 一、   螢幕大小適配 三款手機,分別是iPhone XS,iPhone XR,iPHone X Max,其中iPhone XS的螢幕尺寸和iPhone X的是一致的,另外兩款都有了新的尺寸,具體尺寸如下 具體原理性的東西就多說了,因為

iOS XIB約束 || 字型 根據螢幕寬變化

簡單實現XIB上的約束值,按照指定需求自動變化(根據螢幕寬度變化)。 基準圖(750 * 1334)上控制元件距離左邊為20 達到效果:5s(640 * 1136)上執行距離為 20*(320/375.0) = 17.07; 6s(750 * 1334)上執行距離為 2

iOS 12釋出前,蘋果宣佈:7月起,iOS App必須iPhone X劉海屏

5月8日訊息在微軟和谷歌召開開發者大會之際,蘋果官方今天宣佈,從7月份開始,所有iOS App更新必須使用iOS 11 SDK構建,並且必須支援iPhone X的超級視網膜顯示器,當然也包括適配劉海屏。 蘋果表示,藉助iOS 11 SDK,應用

iOS iPhone X

IPhoneX 導航欄 狀態列 tabar高度 1.導航欄高度 88 非IPhoneX手機為64 2.狀態列高度 44 非IPhoneX手機為20 3.tabar高度 83 非IPhoneX手機為49    如下圖所示: //判斷iPhone X #defi

iOS字型大小的幾種方法

在iOS開發中,有些公司對字型也有適配要求,為了讓字型美觀,所以在不同尺寸的螢幕上字型大小也要做到適配。 自己總結了幾種方法供大家參考。 方法一:用巨集定義適配字型大小(根據螢幕尺寸判斷) //巨集定義 #define SCREEN_WIDTH ([UIScreen mainScreen].

iOS】螢幕之NSLayoutConstraint

import Foundationclass NSLayoutConstraintEx: NSLayoutConstraint {    @IBInspectable    var ipad: CGFloat = 0 {        didSet {            if DeviceUtils.is

Egret QQ玩一玩【踩日記】

需要申明一點,這是我接過最坑的渠道了,各種神奇的問題,首先是介面比較奇怪而且新舊版本搞得很混亂,其次是平臺底層實現效能差而且很多限制。此外,這裡需要理清楚一個概念:QQ 玩一玩 和 QQ 玩吧 並非同一個東西,QQ 玩一玩也叫 QQ 輕遊戲 或 釐米遊戲 ,是基於 brick

ios 11 螢幕問題!

隨著Xcode GM版本釋出,適配iOS 11也就提上了日程,總的來說整個適配過程(不包含適配iPhone X)不是很麻煩。 首先建議觀看今年WWDC的一個視訊 Updating Your App for iOS 11,視訊講解了iOS 11一些API的變化,對

iOS開發 | 熱點完美攻略

開始: 當手機熱點開啟並被其他裝置接入時,狀態列會比普通狀態下多20px,此時整個檢視控制器會被向下推20px,推出螢幕。如果不做相應處理必然會帶來糟糕的使用者體驗,如下,兩張對比圖(注意下方的tabBar): 這是優化前的效果; 這是優化後的效果