中心思想
這篇文章也是緊接著上一篇繼續(xù)歸納和總結(jié)晨横,在我們?nèi)粘5拈_發(fā)工作中,Xcode編譯器拋出的各種“無理取鬧”的異常和錯(cuò)誤箫柳。
在每個(gè)異呈中危或錯(cuò)誤的下方,我會(huì)盡可能詳細(xì)地歸納解決辦法滞时,解決方案中涉及網(wǎng)上取材的內(nèi)容叁幢,我會(huì)附上網(wǎng)址或者其他大神博客供大家參考。
如果文中有不當(dāng)或者錯(cuò)誤的地方坪稽,勞煩您指正曼玩,我會(huì)及時(shí)修改,以免誤導(dǎo)他人及一些iOS開發(fā)初學(xué)者窒百。
Xcode編譯器頭疼腦熱的地方遠(yuǎn)比我們知道的要多黍判,如果您遇到過文中不曾提及的警告或者錯(cuò)誤,并且知道如果解決它篙梢,請(qǐng)您以簡信或者Email的形式發(fā)送給我(網(wǎng)頁地址欄有我的郵箱地址)顷帖,我會(huì)一并總結(jié)更新,我會(huì)附上您的信息(例如博客渤滞,Github地址)贬墩。在此先謝謝了。
1.Bitcode問題
XXX 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
上面這個(gè)問題也是iOS 9SDK發(fā)布以后出現(xiàn)在Xcode7中的新問題妄呕,Bitcode是Xcode7引入的新特性陶舞,旨在為App瘦身,網(wǎng)上對(duì)它通俗的解釋是在線版安卓ART模式绪励。
下面這段話肿孵,是親身參與2015年WWDC大會(huì)的國內(nèi)一線開發(fā)者王巍的總結(jié):Bitcode 是 LLVM 的中間碼,在編譯器更新時(shí)疏魏,Apple 可以用你之前提交的 Bitcode 進(jìn)行優(yōu)化停做,這樣你就不必在編譯器更新后再次提交你的 app,也能享受到編譯器改進(jìn)所帶來的好處大莫。Bitcode 支持在新項(xiàng)目中是默認(rèn)開啟的蛉腌,沒有特別理由的話,你也不需要將它特意關(guān)掉。
Apple Watch應(yīng)用必須打開Bitcode眉抬,iOS沒有強(qiáng)制贯吓,但是Xcode7默認(rèn)打開了Bitcode。
解決上述問題的方法:
1.更新library使包含Bitcode蜀变,否則會(huì)出現(xiàn)以上問題悄谐,陸續(xù)都會(huì)支持Bitcode。
2.關(guān)閉Bitcode,步驟如下库北。
找到工程的target->build settings->直接搜索bitcode->然后在搜索結(jié)果的Build Options選項(xiàng)下找到Enable Bitcode->將YES改為NO爬舰,如下動(dòng)態(tài)圖所示。
2.升級(jí)Xcode7后上傳App時(shí)報(bào)錯(cuò)
解決方案:進(jìn)入TencentOpenApi_ios_Bundle.bunle 點(diǎn)擊顯示包內(nèi)容寒瓦,把plist文件刪除即可
3.故事板與Masonry混合使用時(shí)報(bào)錯(cuò)
原因:如果用的view是storyboard連線而來的情屹,不是自己在代碼里創(chuàng)建的。 很可能運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)杂腰,說IB已經(jīng)定義的約束和Masonry的約束沖突垃你。即使你拖進(jìn)去控件后并沒有設(shè)置約束。
解決:按以前的方法先用故事版做好約束喂很,然后在每個(gè)約束的屬性面板設(shè)置PlaceHolder : Remove at run time惜颇。 這樣在運(yùn)行的時(shí)候會(huì)自動(dòng)取消。
Masonry是一個(gè)Objective-C版本的第三方Autolayout庫少辣,還有一個(gè)叫做snapKit的開源庫凌摄,它是Masonry的Swift版本。在Swift項(xiàng)目中漓帅,如果出現(xiàn)上述錯(cuò)誤锨亏,解決辦法同上。
4.升級(jí)Xcode7后使用JSONKit第三方庫崩潰
出現(xiàn)問題的出處是: void *keyObjectISA = *((void **)keys[idx]);這一段忙干。這個(gè)問題我也是從網(wǎng)絡(luò)搜集的器予,我沒用過JSONKit,一直都是用系統(tǒng)自帶的捐迫。但是下面的解決辦法在我朋友那里得到了驗(yàn)證乾翔。如果您有異議,請(qǐng)您指正弓乙,我會(huì)及時(shí)修改末融。
解決辦法:將原項(xiàng)目中JSONKit.m文件替換成下面鏈接的實(shí)現(xiàn)文件即可
https://github.com/jcbertin/JSONKit
5.添加Scheme白名單
這個(gè)問題是引起一些在項(xiàng)目中使用到微信钧惧,支付寶或者微博SDK相關(guān)功能(支付暇韧,收藏,分享)出現(xiàn)錯(cuò)誤的原因浓瞪,它會(huì)導(dǎo)致Xcode報(bào)如下報(bào)錯(cuò):
canOpenURL:failedforURL:“weixin://app/wxdaae92a9cfe5d54c/” - error: “This app is not allowed to query for scheme weixin”
問題描述:在iOS 9下涉及到平臺(tái)客戶端跳轉(zhuǎn)懈玻,系統(tǒng)會(huì)自動(dòng)到項(xiàng)目info.plist下檢測是否設(shè)置平臺(tái)Scheme。對(duì)于需要配置的平臺(tái)乾颁,如果沒有配置涂乌,就無法正常跳轉(zhuǎn)平臺(tái)客戶端艺栈。因此要支持客戶端的分享和授權(quán)等,需要配置Scheme名單湾盒。
解決辦法如下:
1)在項(xiàng)目的info.plist中添加一LSApplicationQueriesSchemes湿右,類型為Array。
2)然后給它添加一個(gè)需要支持的項(xiàng)目罚勾,類型為字符串類型毅人;
下面是一些項(xiàng)目中常用的白名單,你有用到的你就添加到該數(shù)組下面,類型全部為string
mqqOpensdkSSoLogin
mqzone
sinaweibo
alipayauth
alipay
safepay
mqq
mqqapi
mqqopensdkapiV3
mqqopensdkapiV2
mqqapiwallet
mqqwpa
mqqbrowser
wtloginmqq2
weixin
6. directory not found for option
問題原因:Xcode7將framworks位置改變了
解決方法:
1)點(diǎn)擊項(xiàng)目尖殃,選擇 Targets->XXXTests
2)選擇build setting 選項(xiàng)丈莺,找到 Frameworks Search Path 或者 Library Search Paths
3)刪除$(SDKROOT)/Developer/Library/Frameworks,
或者使用$(PLATFORM_DIR)/Developer/Library/Frameworks替換
7.iOS 9舊狀態(tài)欄報(bào)錯(cuò)
下圖是報(bào)錯(cuò)的截圖
出錯(cuò)原因:設(shè)置app的狀態(tài)欄樣式使用了舊的方式送丰,在info.plist里面設(shè)置了View controller-based status bar appearance為NO缔俄,默認(rèn)為YES,一般式iOS6的時(shí)候使用這種方式器躏,iOS7俐载,8也兼容,但是到了iOS9就報(bào)了警告邀桑。
解決辦法:
1)刪除原先編寫的代碼
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]
2)然后在plist文件中添加項(xiàng)View controller-based status bar appearance瞎疼,類型為Boolean,設(shè)置為YES(默認(rèn)是NO)壁畸,如下圖7-1所示贼急。
3)然后在你自定義的導(dǎo)航控制器里面添加如下代碼
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
4)在模擬器上刪除應(yīng)用程序并重新運(yùn)行即可
8.大部分社交平臺(tái)接口不支持https協(xié)議。
這個(gè)問題也是上一篇中網(wǎng)絡(luò)請(qǐng)求出錯(cuò)的一個(gè)分支捏萍。目前還有大量的應(yīng)用是通過HTTP協(xié)議來訪問服務(wù)器的,而要讓所有的應(yīng)用都轉(zhuǎn)向支持HTTPS太抓,顯然是一件耗時(shí)的工作。所以下面的方法可以一試令杈,但只是暫時(shí)性的走敌。畢竟蘋果幫之前提出了App Transport Security(ATS)的概念,它的提出意味著蘋果將準(zhǔn)備棄用HTTP逗噩,轉(zhuǎn)而支持HTTPS掉丽。
上述問題的解決方案就是設(shè)置域,可以簡單理解成异雁,把不支持https協(xié)議的接口設(shè)置成http的接口捶障。
具體方法:
1)、在項(xiàng)目的info.plist中添加一個(gè)Key:NSAppTransportSecurity纲刀,類型為字典類型项炼。
2)、然后給它添加一個(gè)NSExceptionDomains,類型為字典類型锭部;
3)暂论、把需要的支持的域添加給NSExceptionDomains。其中域作為Key拌禾,類型為字典類型取胎。
4)、每個(gè)域下面需要設(shè)置3個(gè)屬性:NSIncludesSubdomains湃窍、NSExceptionRequiresForwardSecrecy扼菠、NSExceptionAllowsInsecureHTTPLoads。均為Boolean類型坝咐,值分別為YES循榆、NO、YES墨坚。
以下文章能夠幫助你更好的理解ATS的概念
如何使用ATS提高應(yīng)用的安全性
ATS問題
App Transport Security dictionary primary keys
9.找不到.dylib文件秧饮,換成.tbd文件而又無法運(yùn)行,請(qǐng)嘗試下面的方式來解決泽篮。
拿添加libsqlite3.dylib為例(你可別照本宣科)
1)在項(xiàng)目Target中的Link Binary With Libraries 手動(dòng)添加,
首先點(diǎn)擊 “+” ;
2)顯示搜索添加頁面盗尸,在這里如果搜索之前的libsqlite3.dylib是搜不出來ios9之前的。所以需要點(diǎn)擊 Add Other,出現(xiàn)文件目錄頁面帽撑,正常情況這里也是找不到老的libsqlite3.dylib文件的泼各,因?yàn)檫@個(gè)文件是隱藏掉的。所以需要按快捷鍵 CMD+Shift+G (Go to the folder)亏拉,輸入/usr/lib后扣蜻,進(jìn)入隱藏的界面;
3)然后添加你需要的 *.dylib,如libsqlite3.dylib文件.大功告成
今天先告一段落及塘,我會(huì)繼續(xù)更新莽使,keep moving!給廣大無聊的程序員推薦一個(gè)小游戲笙僚,我最近無聊的時(shí)候在玩芳肌,叫做okay?(你要是在改Bug肋层,當(dāng)我沒說)亿笤。
另外給大家推薦一個(gè)bug收集工具,叫做Bugtags栋猖,我也是偶然在資深開發(fā)者唐巧的微信公眾號(hào)看見的净薛,后來在自己的Demo中體驗(yàn)了一下,感覺小巧實(shí)用掂铐,之后還接到了一個(gè)Bugtags開發(fā)團(tuán)隊(duì)的使用情況回訪電話罕拂,就算幫助他們推廣一下。
更多有關(guān)Bugtags的內(nèi)容請(qǐng)參考以下鏈接:
Bugtags官網(wǎng)
Bugtags博客
更新兩個(gè)使用Swift語言出現(xiàn)的問題
1.新建playground報(bào)錯(cuò)Unable to find execution service for selected run destination
這個(gè)問題參考一下就行了
解決步驟:
1.先關(guān)閉Xcode
2.cd到Xcode所在目錄全陨,并打開終端輸入下面兩行命令
rm-rf~/Library/Developer/CoreSimulator/Devices
killall -9 com.apple.CoreSimulator.CoreSimulatorService
關(guān)于Playground
Playground爆班,有人將它稱呼為“訓(xùn)練場”,它可以讓Swift展示某些腳本語言的特性辱姨。實(shí)際上柿菩,Playground只是提供了一個(gè)可實(shí)時(shí)編譯運(yùn)行并展示的交互式開發(fā)環(huán)境罷了,類似于著名的REPL雨涛。它的這項(xiàng)功能完全借助于LLVM編譯器強(qiáng)大的組織能力枢舶。
目前,Playground只支持Swift語言替久,但是一位歪果仁大神開發(fā)出了一個(gè)可以運(yùn)行OC版本的Playground凉泄,有興趣可以去看看。點(diǎn)我嘍
2.dyld: Library not loaded:@rpath/libswiftCore.dylib
問題描述:真機(jī)測試時(shí)蚯根,出現(xiàn)上述錯(cuò)誤
解決步驟:
1.在工程的Targets中找到Build Setting選項(xiàng)
2.搜索Embedded Content Contains Swift Code項(xiàng)后众,將其設(shè)置為YES
第三次更新
更新兩個(gè)問題,也是在網(wǎng)上搜集的颅拦,解決辦法比較詳細(xì)
1. “Unknown class XXViewController in Interface Builder file.” 問題處理
在靜態(tài)庫中寫了一個(gè)XXViewController類蒂誉,然后在主工程的xib中,將xib的類指定為XXViewController距帅,程序運(yùn)行時(shí)右锨,報(bào)了上述錯(cuò)誤:
其實(shí)這個(gè)問題與Interface Builder無關(guān),最直接的原因還是相關(guān)的symbol沒有從靜態(tài)庫中加載進(jìn)來碌秸。這種問題的處理就是在Target的”Build Setting”–>“Other Link Flags”中加上”-all_load -ObjC”這兩個(gè)標(biāo)識(shí)位绍移,這樣就OK了。
2.關(guān)于Unbalanced calls to begin/end appearance transitions for …問題的處理
當(dāng)某個(gè)業(yè)務(wù)有這么一個(gè)需求讥电,進(jìn)入一個(gè)列表后需要立馬又push一個(gè)web頁面登夫,做一些活動(dòng)的推廣。在iOS 8上允趟,我們的實(shí)現(xiàn)是一切OK的恼策;但到了iOS 7上,就發(fā)現(xiàn)這個(gè)web頁面push不出來了潮剪,同時(shí)控制臺(tái)給了一條警告消息涣楷,即如下:
Unbalanced calls to begin/end appearance transitions for ...
在這種情況下,點(diǎn)擊導(dǎo)航欄中的返回按鈕時(shí)抗碰,直接顯示一個(gè)黑屏狮斗。
我們到stackoverflow上查了一下,有這么一段提示:
occurs when you try and display a new viewcontroller before the current view controller is finished displaying.
意思是說在當(dāng)前視圖控制器完成顯示之前弧蝇,又試圖去顯示一個(gè)新的視圖控制器碳褒。
于是我們?nèi)ヅ挪榇a折砸,果然發(fā)現(xiàn),在viewDidLoad里面去做了次網(wǎng)絡(luò)請(qǐng)求操作沙峻,且請(qǐng)求返回后就去push這個(gè)web活動(dòng)推廣頁睦授。此時(shí),當(dāng)前的視圖控制器可能并未顯示完成(即未完成push操作)摔寨。
Basically you are trying to push two view controllers onto the stack at almost the same time.
解釋如下:
當(dāng)幾乎同時(shí)將兩個(gè)視圖控制器push到當(dāng)前的導(dǎo)航控制器棧中時(shí)去枷,或者同時(shí)pop兩個(gè)不同的視圖控制器,就會(huì)出現(xiàn)不確定的結(jié)果是复。所以我們應(yīng)該確保同一時(shí)間删顶,對(duì)同一個(gè)導(dǎo)航控制器棧只有一個(gè)操作,即便當(dāng)前的視圖控制器正在動(dòng)畫過程中淑廊,也不應(yīng)該再去push或pop一個(gè)新的視圖控制器逗余。
所以最后我們把web活動(dòng)的數(shù)據(jù)請(qǐng)求放到了viewDidAppear里面,并做了些處理季惩,這樣問題就解決了猎荠。
原文鏈接
第四次更新
1.手動(dòng)performSegueWithIdentifier沒有生效的問題
這個(gè)問題是因?yàn)閷?duì)視圖控制對(duì)象的生命周期概念沒有深刻理解,比如說當(dāng)用戶打開應(yīng)用蜀备,判斷用戶是否登陸关摇,如果未登陸,就跳轉(zhuǎn)到登錄頁面這個(gè)情況碾阁。
如果你將判斷用戶是否登陸的語句放到了視圖的viewDidLoad中去输虱,那么這個(gè)方法是不會(huì)生效的。因?yàn)樵趘iewDidLoad中就啟動(dòng)segue的話脂凶,依然會(huì)被后來填充的視圖覆蓋宪睹,要是在視圖加載完成后的viewDidAppear中啟動(dòng)segue,就不會(huì)出現(xiàn)錯(cuò)誤了蚕钦。