您的位置:首頁 > 手機數碼

                                            iOS 9 適配中一定會遇到的大坑合集

                                            發布時間:2022-04-11 15:10:38  來源:IT資訊網    采編:author  背景:

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

                                            一、NSAppTransportSecurity

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

                                            NSAppTransportSecurity - NSAllowsArbitraryLoads

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

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

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

                                            -(void)loadView{UIWebView*web=[[UIWebViewalloc]initWithFrame:[UIScreenmainScreen].bounds];self.view=web;}-(void)viewDidLoad{[superviewDidLoad];UIWebView*web=(UIWebView*)self.view;//董鉑然NSURL*url=[NSURLURLWithString:@"https://github.com/"];NSURLRequest*request=[NSURLRequestrequestWithURL:url];[webloadRequest:request];}

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

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

                                            NSURLSession/NSURLConnectionHTTPloadfailed(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’doesnotcontainbitcode.Youmustrebuilditwithbitcodeenabled(XcodesettingENABLE_BITCODE),obtainanupdatedlibraryfromthevendor,ordisablebitcodeforthistarget.forarchitecturearm64

                                            問題的原因是:某些第三方庫還不支持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可能會出現"..."的情況。

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

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

                                            CGSizesize=[titlesizeWithAttributes:@{NSFontAttributeName:[UIFontsystemFontOfSize:14.0f]}];CGSizeadjustedSize=CGSizeMake(ceilf(size.width),ceilf(size.height));

                                            五、URL scheme

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

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

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

                                            canOpenURL:failedforURL:"mqzone://qqapp"-error:"Thisappisnotallowedtoqueryforschememqzone"

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

                                            六、statusbar

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

                                            <Error>:CGContextSaveGState:invalidcontext0x0.Ifyouwanttoseethebacktrace,pleasesetCG_CONTEXT_SHOW_BACKTRACEenvironmentalvariable.

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

                                            [[UIApplicationsharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent][[UIApplicationsharedApplication]setStatusBarHidden:YES];

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

                                            -(UIStatusBarStyle)preferredStatusBarStyle{returnUIStatusBarStyleLightContent;}

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

                                            @property(readwrite,nonatomic,getter=isStatusBarHidden)BOOLstatusBarHiddenNS_DEPRECATED_IOS(2_0,9_0,"Use-[UIViewControllerprefersStatusBarHidden]");

                                            七、didFinishLaunchingWithOptions

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

                                            *****Assertionfailurein-[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=[[UIViewControlleralloc]init];

                                            八、tableView

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

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

                                            [self.tableViewreloadSections:[NSIndexSetindexSetWithIndex:0]withRowAnimation:UITableViewRowAnimationNone];

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

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

                                              聲明:本文僅為傳遞更多網絡信息,不代表IT資訊網觀點和意見,僅供參考了解,更不能作為投資使用依據。


                                            返回網站首頁 本文來源:IT資訊網

                                            本文評論
                                            還買啥iPhone XR 同樣的封裝工藝1598元就能買到魅族X8
                                            9月26日,一年一度的魅友節和我們如約而至,在本次魅友節
                                            日期:10-02
                                            前端小哥玩HTML復選框上癮,能畫logo做視頻,還開源成JS庫
                                            萬萬沒想到,如此普通的復選框,竟也能玩出這種高度!
                                            日期:03-25
                                            Flutter混編工程之高速公路Pigeon
                                            Pigeon的存在就是為了解決多端通信的開發成本。其核心
                                            日期:02-24
                                            你需要了解的VMware云回遷選項
                                            VMware云產品的高成本可能會促使企業從云端或混合選項
                                            日期:02-28
                                            數據中心局部高熱處理方案
                                            數據中心雖然有完善的空調系統,常年保持恒溫恒濕,但實際
                                            日期:02-28
                                            物聯網與無障礙追求
                                            根據世界銀行(worldbank)的數據顯示,多達10億人(占世界人
                                            日期:01-22
                                            這些千奇百怪的數據中心,你知道幾個?
                                            雅虎雞舍、綠山數據中心、海上數據中心……現代數據中
                                            日期:02-26
                                            后疫情時代,Oracle用技術創新引領人力資源管理
                                            面對這些變化,甲骨文思索工作中人與技術之間不斷演變的
                                            日期:03-07
                                            巧解數據中心網絡性能瓶頸問題
                                            解決日益增加的網絡流量問題,方法可不止一種,從廉價的快
                                            日期:02-26
                                            IBM z13s讓用戶不必在安全和性能之間做出選擇
                                            近日,為了在數據中心、云計算和移動互聯網打造最安全的
                                            日期:03-04
                                            IBM技術峰會:將移動、大數據、云計算融匯
                                            在2013IBM技術論壇現場,IBM杰出工程師、IBM軟件集團云
                                            日期:01-20
                                            模型泛化不必隨機訓練全批量GD媲美SGD,網友:計算成本負擔不起
                                            近來機器學習模型呈現出一種向大模型發展的趨勢,模型參
                                            日期:03-23
                                             

                                            精品无码久久午夜福利