匯總一些在平時(shí)開發(fā)中遇到的BUG勤哗,不定期更新
用AutoLayout有時(shí)候會(huì)出現(xiàn):
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x17ef4e10 V:[UIView:0x17ee9e00]-(0)-| (Names: '|':UIView:0x17ef3e10 )>",
"<NSLayoutConstraint:0x17ef4e70 V:|-(0)-[UIView:0x17ee9e00] (Names: '|':UIView:0x17ef3e10 )>",
"<NSLayoutConstraint:0x17dc8650 'UIView-Encapsulated-Layout-Height' V:[UIView:0x17ef3e10(455)]>",
"<NSAutoresizingMaskLayoutConstraint:0x17dc86b0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x17ef3e10] (Names: '|':UIViewControllerWrapperView:0x17d7ac80 )>",
"<NSAutoresizingMaskLayoutConstraint:0x17d90d50 h=--& v=--& UIView:0x17ee9e00.midY == + 184>"
)
錯(cuò)誤原因可能是:在添加約束的時(shí)候,比如說 水平方向的約束leading trailing和 weight 沖突了系統(tǒng)會(huì)幫我們?nèi)サ魧挾鹊南拗?br> 解決方法: 重新添加約束,選擇性的不添加寬度<根據(jù)情況不添加一些約束>
JSON解析數(shù)據(jù) for循環(huán)嵌套錯(cuò)誤:
-[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x7fff32fabdc0
JSON解析數(shù)據(jù),方式不對:
-[__NSCFString objectForKeyedSubscript:]: unrecognized selector sent to instance 0x7f85d4110700
原因: 解析字典時(shí),定義的是數(shù)組;解析數(shù)組時(shí),定義的是字典
setValue:ForUnderfinedKey:]:this class is not key value coding
原因:連線出問題了
-[ViewController up]: unrecognized selector sent to instance 0x8c50af0
原因:某個(gè)對象沒有實(shí)現(xiàn)某個(gè)方法
"_SCNetworkReachabilityCreateWithName", referenced from:
原因:靜態(tài)庫中依賴的一些框架沒有導(dǎo)入.如果靜態(tài)庫中用到了框架就必須導(dǎo)入
"std::terminate()", referenced from:
但凡看到錯(cuò)誤提示中提示兩個(gè)冒號(hào),表示C++代碼, 默認(rèn)情況下Xcode創(chuàng)建的工程是不支持C++.
如何解決: 將工程中任意一個(gè)文件的后綴改為.MM即可
.c --> C代碼
.cpp --> C++代碼
.m --> C代碼 + OC代碼
.MM -->C代碼 + OC代碼 + C++代碼
Undefined symbols for architecture x86_64:
這個(gè)錯(cuò)誤, 一般是指用到的三方框架不支持64位手機(jī)
解決方式: 打開工程 --> Build Settings --> All --> Architectures --> Debug\Release --> Other -->修改為 $(ARCHS_STANDARD_32_BIT)
真機(jī)測試
/Users//SDKs/PolymerPay/Library/mobStat/libSDK.a(**ForSDK.o)’does not contain bitcode. You must rebuild it with bitcode enabled (Xcodesetting ENABLE_BITCODE), obtain an updated library from the vendor, or disablebitcode for this target. for architecture arm64
/...linker command failed with exit code 1 (use -v to see invocation)
看警告可以得到的信息是"引入的一個(gè)第三方庫不包含bitcode"。至于什么是bitcode掩驱,我是不太明白是神馬意思芒划,通過查閱相關(guān)資料冬竟,得出的結(jié)論是:這個(gè)東西應(yīng)該和包的優(yōu)化有關(guān)。
在上面的錯(cuò)誤提示中民逼,提到了如何處理我們遇到的問題:
You must rebuild it with bitcode enabled(Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, ordisable bitcode for this target. for architecture arm64
意思就是說:要不你第三方類庫支持 bitcode 要不你就關(guān)掉它
好吧,我們只能選擇后者了
我們來看看他在那里?
某些另類的Bitcode報(bào)錯(cuò)
在進(jìn)行了上述操作之后泵殴,某些第三方庫或者靜態(tài)庫出現(xiàn)了一下報(bào)錯(cuò)信息:
std::__1::basic_istream<char, std::__1::char_traits<char> >::~base_istream()
如圖:
錯(cuò)誤原因:該庫是c++和oc混編
解決方案:在項(xiàng)目配置中-->Linked Frameworks and Libraries 添加庫 libstdc++.tbd
編譯時(shí)報(bào)錯(cuò)
_OBJC_CLASS_$_xxx第三方庫", referenced from: objc-class-ref in xxxViewController.o
報(bào)錯(cuò)原因:
該第三方庫不支持模擬器調(diào)試,只能真機(jī)測試
白名單
在進(jìn)行APP之間的跳轉(zhuǎn)問題上拼苍,有時(shí)候代碼完全沒有問題笑诅,卻死活不進(jìn)行跳轉(zhuǎn)。
原因是從xcode7開始(iOS9開始)疮鲫,程序里面所有的其他網(wǎng)絡(luò)連接都得添加在白名單里面吆你,不然是無法響應(yīng)的!
解決方案:
在plist文件中里面添加一個(gè)key為“LSApplicationQueriesSchemes”數(shù)組值棚点,里面添加包括string型的“scheme”,其他的可根據(jù)需求依次添加湾蔓。
如:需要qq登錄瘫析、分享
添加:mqqapi、mqq默责、mqqopensdkapiV2贬循、mqqOpensdkSSoLogin、mqzone桃序、mqzoneopensdkapiV2、mqzoneopensdkapi
HTTP & HTTPS
在iOS9奇适,蘋果將HTTP換成了HTTPS芦鳍!真是反程序猿的設(shè)計(jì)
為此柠衅,要么后臺(tái)大改,全部換成HTTPS贷祈,要么就繼續(xù)延用現(xiàn)有势誊。
延用現(xiàn)有如圖設(shè)置:在plist文件中里面添加一個(gè)key
AFNetworking
無法解析數(shù)據(jù)键科,error錯(cuò)誤信息如下:
原因:
AFNetworking中的ContentTypes設(shè)置只有最最最通用的幾個(gè)而已(貌似是三個(gè)),然而不同的后臺(tái)程序員的編碼格式可能不同嗦嗡,當(dāng)AFN中沒有該同事的格式時(shí)侥祭,不論如何修改都將無濟(jì)于事矮冬。
解決方案:
像上面14_3圖所示胎署,缺少的content-type 是 text/plain窑滞,添加上去即可0馈(小小建議:修改第三方庫源碼時(shí),盡量注釋掉原來的Demo趾撵,在下面重寫)
模擬器使用CoreLocation定位
不進(jìn)入定位的代理方法共啃,并且出現(xiàn)錯(cuò)誤信息:
Error Domain=kCLErrorDomain Code=0 “(null)”
解決方案:
1移剪、確保所有關(guān)于定位的配置信息都已齊全,<a href="http://www.reibang.com/p/0c0905e261a7">配置信息參考這篇文章</a>苦银。
2幔虏、進(jìn)行下列操作:project-->scheme-->edit scheme-->options-->core location-->allow location simulation配置選中贝椿,將Default Location設(shè)置一個(gè)默認(rèn)的位置。
3瑟蜈、將simulator-->reset content and settings 重啟。
4宪躯、運(yùn)行程序访雪,完成調(diào)試掂林。
截圖如下:
PUSH通知推送:
The 'Apple Push Notification' feature is only available to users enrolled in xxx
原因:開發(fā)者賬號(hào)不是付費(fèi)賬號(hào)精置,沒有推送服務(wù)的權(quán)限
解決:
1锣杂、換一個(gè)付費(fèi)賬號(hào)蹲堂。
2柒竞、注釋掉推送部分播聪,先處理其他需求。
3稼虎、如果硬是要使用推送部分代碼可以進(jìn)行以下操作:
1霎俩、在projectName.xcodeproj文件上右鍵“顯示包內(nèi)容”
2沉眶、用文本編輯器打開“project.pbxproj”文件(.pbxproj!不要找錯(cuò)了文件A鳌)
3捌肴、查找:
com.apple.Push = { enabled = 1; };
修改為:
com.apple.Push = { enabled = 0; };
4、重新編譯即可
關(guān)于在Xcode 9.0+ 運(yùn)行后的項(xiàng)目秽五,在Xcode 7 or 8 中運(yùn)行報(bào)錯(cuò)的問題
報(bào)錯(cuò)信息:
ld: framework not found FileProvider for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因:靜態(tài)庫用Xcode9打包筝蚕,用Xcode8編譯的話就會(huì)報(bào)錯(cuò)
解決方案:
1铺坞、確保你的Mac上有 Xcode 9.0+版本济榨,點(diǎn)擊此處下載Xcode。
2腐晾、打開Finder-->應(yīng)用程序-->找到Xcode 9.0+ --> 右鍵‘顯示報(bào)內(nèi)容’
3藻糖、進(jìn)入路徑/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/
4库车、找到報(bào)錯(cuò)的 not found 文件(Copy the 'FileProvider.framework'
)
5、應(yīng)用程序中找到Xcode 7 or 8洋满,再次執(zhí)行步驟 2珍坊、3、進(jìn)入路徑驻民,將報(bào)錯(cuò)framework粘貼到 Xcode 7 or 8 路徑里面回还。
6懦趋、Xcode 7 or 8 中打開項(xiàng)目疹味,command+shift+K 清除緩存,重新編譯即可诫咱。(一點(diǎn)要clean坎缭,否則會(huì)一直報(bào)錯(cuò))
點(diǎn)擊查看 Stack Overflow 上的案例