日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

整理iOS9适配中出现的坑(图文)

發(fā)布時間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整理iOS9适配中出现的坑(图文) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


整理iOS9適配中出現(xiàn)的坑(圖文)

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

一、NSAppTransportSecurity

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

NSAppTransportSecurity -?NSAllowsArbitraryLoads

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

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

?

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

舉個栗子,從app內(nèi)起webView加載https的網(wǎng)頁。新建個項目寫幾行起網(wǎng)頁的代碼

123456789101112- (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的網(wǎng)頁能打開,百度的網(wǎng)頁打不開,下面打印了一行l(wèi)og

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

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

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

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

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

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

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

? ?

??

二、Bitcode

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

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

1XXXX’ 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。要不然是等待庫的開發(fā)者升級了此項功能我們更新庫,要不就是把這個bitcode禁用。

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

?

三、設置信任

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

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

?

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

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

?

四、字體

iOS8中,字體是Helvetica,中文的字體有點類似于“華文細黑”。只是蘋果手機自帶渲染,所以看上去可能比普通的華文細黑要美觀。iOS9中,中文系統(tǒng)字體變?yōu)榱藢橹袊O計的“蘋方” 有點類似于一種word字體“幼圓”。字體有輕微的加粗效果,并且最關鍵的是字體間隙變大了!

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

?iOS8

?iOS9 蛋疼

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

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

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

?

五、URL scheme

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

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

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

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

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

?

六、statusbar

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

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

以前我們?yōu)榱四軌驅(qū)崟r的控制頂部statusbar的樣式,可能會在喜歡使用

12[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent][[UIApplication sharedApplication]setStatusBarHidden:YES];

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

1234- (UIStatusBarStyle)preferredStatusBarStyle{????return UIStatusBarStyleLightContent;}

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

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

?

七、didFinishLaunchingWithOptions

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

1***** 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的編譯器本身就不支持。

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

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

?

八、tableView

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

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

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

?

九、NSLocalizableString(XCode7問題)

如果你程序啟動后出現(xiàn)主頁面一片空白,或是報了以下的棧調(diào)用錯誤。那就是NSLocalizableString的死循環(huán)導致堆棧溢出了。

1234567891011121314151617#0? 0x003052a8 in -[NSLocalizableString length] ()#1? 0x003052cc in -[NSLocalizableString length] ()#2? 0x003052cc in -[NSLocalizableString length] ()#3? 0x003052cc in -[NSLocalizableString length] ()#4? 0x003052cc in -[NSLocalizableString length] ()#5? 0x003052cc in -[NSLocalizableString length] ()#6? 0x003052cc in -[NSLocalizableString length] ()#7? 0x003052cc in -[NSLocalizableString length] ()#8? 0x003052cc in -[NSLocalizableString length] ()#9? 0x003052cc in -[NSLocalizableString length] ()#10 0x003052cc in -[NSLocalizableString length] ()#11 0x003052cc in -[NSLocalizableString length] ()#12 0x003052cc in -[NSLocalizableString length] ()#13 0x003052cc in -[NSLocalizableString length] ()#14 0x003052cc in -[NSLocalizableString length] ()#15 0x003052cc in -[NSLocalizableString length] ()#16 0x003052cc in -[NSLocalizableString length] ()

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

?

十、bundle identifier(Xcode7問題)

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

因為xcode7新增了此功能,在target下面的BuildSetting里面增加了Product Bundle identifier。蘋果之后的做法應該是推薦在此處設置bundle identifier,此處的設置會比info.plist里面優(yōu)先讀取。

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

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

1"Set :CFBundleIdentifier com.XXX.XXX" "XXX/Supporting Files/XXX-Info.plist"

?

十一、 ActionSheet

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

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

? ??

我猜測可能是sheet的windowLevel比鍵盤低導致的。但是將優(yōu)先級設到10000,然后顯示在keyWindow上。

12sheet.window.windowLevel = 10000;[sheet showInView:[UIApplication sharedApplication].keyWindow];

然后沒有效果,然后又查了下stackoverflow 有個方法能取出優(yōu)先級最高的window

123UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {????return win1.windowLevel - win2.windowLevel;}] lastObject];

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

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

?

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

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

分類: 技術調(diào)研,探索分析標簽: OC, iOS, iOS9, 適配, 新特性好文要頂關注我收藏該文董鉑然
關注 - 7
粉絲 - 281 +加關注 7 ? 上一篇:iOS警告收錄及科學快速的消除方法
? 下一篇:將自己寫的庫上傳到cocoapods(2015)



總結

以上是生活随笔為你收集整理的整理iOS9适配中出现的坑(图文)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩电影在线一区二区 | 在线观看av网站 | 伊人365 | 岛国中文字幕 | 亚洲综合另类小说 | 草草影院在线播放 | 久久久97 | 在线观看国产黄色 | 国产熟女精品视频 | 日韩精品一区二区三区免费视频 | 中文字幕欧美亚洲 | 天天操人人干 | 日韩福利一区二区 | av美女在线 | 很黄很污的视频网站 | 久久这里只有精品国产 | 91调教视频 | 日韩欧美国产电影 | 人物动物互动39集免费观看 | a∨鲁丝一区鲁丝二区鲁丝三区 | 日本免费电影一区二区三区 | 午夜影院体验区 | 日韩精品电影一区二区三区 | 欧美日本韩国 | 日韩视频中文 | 黑人玩弄人妻一区二区三区四 | 国产一av | 激情视频网站在线观看 | 天天干夜夜怕 | 欧美精品123 | 国产精品久久久久久久久免费软件 | av青青| 国产女人18毛片水真多18 | 中文字幕一级片 | 国产a毛片 | 亚洲精品69 | 亚洲精品在线观 | 一级特黄av| 草草在线免费视频 | 爱爱视频久久 | 精品久久久噜噜噜久久久 | 夜夜草天天草 | 超碰九七| 日韩簧片在线观看 | 欧美日韩欧美日韩在线观看视频 | 狠狠操中文字幕 | 69视频在线免费观看 | 91春色| 3d动漫精品啪啪一区二区下载 | 66av欧美| www射 | 中文字幕人妻一区二区三区在线视频 | 韩国av一区 | 国产又爽又黄的激情精品视频 | 久久神马 | 久9精品| 国产三级精品在线 | 国产偷人| 波多野结衣av无码 | 亚洲激情专区 | 福利在线观看 | 懂色av一区二区 | 国产精品一区二区三区免费在线观看 | 欧美日韩精品国产 | 男人的天堂网在线 | 国产精品一区二区av日韩在线 | 黄色精品视频 | 爱逼av| 日韩欧美天堂 | 精品国产一区二区三区久久久蜜臀 | 粗大的内捧猛烈进出在线视频 | 超碰人人草人人干 | 91插插插视频 | 国产精品自拍电影 | 日日摸夜夜添夜夜添高潮喷水 | 亚洲综合插 | 91成人在线| 青青草在线播放 | 精品毛片一区二区三区 | 翔田千里在线播放 | 中文字幕第6页 | 国产在线拍揄自揄拍无码 | 日日摸日日碰夜夜爽无码 | 亚洲国产日韩一区 | 成人学院中文字幕 | 91视频在线网站 | 日韩色在线观看 | 国产探花一区 | 午夜特片网 | 久久国产乱子伦精品 | 久久精品噜噜噜成人88aⅴ | 顶臀精品视频www | 亚洲1234区 | 亚洲天堂av一区二区三区 | 日日躁夜夜躁白天躁晚上躁91 | 91视频久久久 | 免费观看h片 | 色涩网站| 欧美日韩亚洲色图 |