天天看點

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

NSAppTransportSecurity - NSAllowsArbitraryLoads

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

<code>- (</code><code>void</code><code>)loadView{</code>

<code>    </code><code>UIWebView *web = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];</code>

<code>    </code><code>self</code><code>.view = web;</code>

<code>}</code>

<code>- (</code><code>void</code><code>)viewDidLoad {</code>

<code>    </code><code>[</code><code>super</code> <code>viewDidLoad];</code>

<code>    </code> 

<code>    </code><code>UIWebView *web = (UIWebView *)</code><code>self</code><code>.view;</code><code>//董鉑然</code>

<code>    </code><code>NSURLRequest</code> <code>*request = [</code><code>NSURLRequest</code> <code>requestWithURL:url];</code>

<code>    </code><code>[web loadRequest:request];</code>

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet
整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

<code>NSURLSession</code><code>/</code><code>NSURLConnection</code> <code>HTTP load failed (kCFStreamErrorDomainSSL, -9802)</code>

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet
整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet
整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet
整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

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

<code>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</code><code>for</code> <code>this</code> <code>target.</code><code>for</code> <code>architecture arm64</code>

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

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet
整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

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

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

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

 iOS8

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

 iOS9 蛋疼

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

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

<code>CGSize size = [title sizeWithAttributes:@{</code><code>NSFontAttributeName</code><code>: [UIFont systemFontOfSize:14.0f]}];</code>

<code>CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));</code>

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

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

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

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

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

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

<code>&lt;Error&gt;: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.</code>

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

<code>[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]</code>

<code>[[UIApplication sharedApplication]setStatusBarHidden:</code><code>YES</code><code>];</code>

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

<code>- (UIStatusBarStyle)preferredStatusBarStyle</code>

<code>{</code>

<code>    </code><code>return</code> <code>UIStatusBarStyleLightContent;</code>

點進頭檔案可以驗證剛才說法:

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

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

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

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

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

<code>UIWindow *window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];</code>

<code>window.rootViewController = [[UIViewController alloc]init];</code>

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

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

<code>[</code><code>self</code><code>.tableView reloadSections:[</code><code>NSIndexSet</code> <code>indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];</code>

如果你程式啟動後出現首頁面一片空白,或是報了以下的棧調用錯誤。那就是NSLocalizableString的死循環導緻堆棧溢出了。

13

14

15

16

17

<code>#0  0x003052a8 in -[NSLocalizableString length] ()</code>

<code>#1  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#2  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#3  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#4  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#5  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#6  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#7  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#8  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#9  0x003052cc in -[NSLocalizableString length] ()</code>

<code>#10 0x003052cc in -[NSLocalizableString length] ()</code>

<code>#11 0x003052cc in -[NSLocalizableString length] ()</code>

<code>#12 0x003052cc in -[NSLocalizableString length] ()</code>

<code>#13 0x003052cc in -[NSLocalizableString length] ()</code>

<code>#14 0x003052cc in -[NSLocalizableString length] ()</code>

<code>#15 0x003052cc in -[NSLocalizableString length] ()</code>

<code>#16 0x003052cc in -[NSLocalizableString length] ()</code>

這個的解決方法就是找到特定的頁面,然後将English 前面的勾勾上。

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

如果你遇到了在本地編譯通過,但是在CI上打包失敗。并且報的錯誤是和bundle identifier相關,那很有可能是你plist檔案中寫的bundle identifier沒有起作用。

因為xcode7新增了此功能,在target下面的BuildSetting裡面增加了Product Bundle identifier。蘋果之後的做法應該是推薦在此處設定bundle identifier,此處的設定會比info.plist裡面優先讀取。

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

如果你的Bundle identifier一直沒變,可能不會發現此問題。如果改變了,你在plist中修改是無效的。

另一個做法就是在ci打包的配置Execute shell上增加以下代碼

<code>"Set :CFBundleIdentifier com.XXX.XXX"</code> <code>"XXX/Supporting Files/XXX-Info.plist"</code>

Actionsheet 在iOS8的時候改了一次版,當時是和AlertView二合一,并且以AlertViewController作為載體,之後再present出來,這在當時,蘋果應該是想統一各個控件的展示方式,但是很多人可能并沒有在意因為直接show那個方法并沒有廢除,大家都覺得應該是新舊都能用,再加上有的公司可能自己還做了一定擴充,諸多原因導緻還是用的舊方法。

在iOS9上使用舊方法直接show,會出現左圖的問題。如果用的是AlertViewController的方法則不會出現問題(右圖)

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet
整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

我猜測可能是sheet的windowLevel比鍵盤低導緻的。但是将優先級設到10000,然後顯示在keyWindow上。

<code>sheet.window.windowLevel = 10000;</code>

<code>[sheet showInView:[UIApplication sharedApplication].keyWindow];</code>

然後沒有效果,然後又查了下stackoverflow 有個方法能取出優先級最高的window

<code>UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^</code><code>NSComparisonResult</code><code>(UIWindow *win1, UIWindow *win2) {</code>

<code>    </code><code>return</code> <code>win1.windowLevel - win2.windowLevel;</code>

<code>}] lastObject];</code>

試了下還是沒有效果。 應該鍵盤的優先級無論如何都是最高的, 想蓋在鍵盤上面的方法行不通。

當然,如果更換的成本比較大,也并不是沒有辦法,直接設定彈sheet之前收回鍵盤就好了。

暫時遇到這些問題,感覺iOS9的出現讓所有iOS開發都是菊花一緊,預祝所有的iOS都能及時的做好适配改完bug,下個版本一上線,所有問題都解決。

整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet
整理iOS9适配中出現的坑(圖文)整理iOS9适配中出現的坑(圖文)一、NSAppTransportSecurity二、Bitcode三、設定信任四、字型五、URL scheme六、statusbar七、didFinishLaunchingWithOptions八、tableView九、NSLocalizableString(XCode7問題)十、bundle identifier(Xcode7問題)十一、 ActionSheet

<a target="_blank" href="http://home.cnblogs.com/u/dsxniubility/">董鉑然</a>

<a target="_blank" href="http://home.cnblogs.com/u/dsxniubility/followees">關注 - 7</a>

<a target="_blank" href="http://home.cnblogs.com/u/dsxniubility/followers">粉絲 - 281</a>

<a>+加關注</a>

繼續閱讀