一、xcode Build 成功,但是不會運行到模擬器
背景:github 上下載一個開源項目,使用了CocoPods
可以編譯成功,說明代碼是沒有問題的,不能運行到模擬器,應(yīng)該是沒有選擇正確的 scheme
解決:選擇 “Product” >> “Scheme” >> "Edit Scheme" >> ?左邊 "Run" >> “Info” 選項卡 >> "Executable" >> "你的項目.app"
二、Build warning:?directory not found for option “XXX”
編譯后出現(xiàn)的警告,沒有找到對應(yīng)的XXX ,這里XXX一般是 Framework 或 Library 的路徑,
一般在打開下載的項目會出現(xiàn),比如我是在打開微信SDK Demo 時出現(xiàn)的。
解決:在項目 Target 選擇 Build Settings 選項,找到 Search Paths 下的 Library Search Paths 項和Framework Search Paths(可以用搜索功能快速定位),
OK,展開Library Search Paths 的值,可以看到其中就有警告中沒有找到的XXX路徑,刪掉它就行
三、Error '!obj' trying to fetch default input device's sample rate
背景:使用MPMoviePlayerViewController 播放視頻
環(huán)境:Mac miniiosSimulator
這個坑爹的問題,是提示你需要給設(shè)備插上耳機,準(zhǔn)確的說,插上外接的音頻輸出設(shè)備。嗯,插在Mac mini 上,就醬紫。
四、Build Error“openssl/asn1.h”file not found
背景:接入支付寶時出現(xiàn)
這個問題說穿了很簡單,“openssl" 整個文件夾代碼都拷貝到項目中,找不到文件是路徑問題
再看下支付寶的集成文檔,里面要提到 在?“Header Search Paths” 增加頭文件路徑:$(SRCROOT)/項目名稱,顯然就是解決這個問題的,
但是注意,這里支付寶Demo 的 openssl 文件夾是放在項目的根目錄的,對應(yīng)路徑就是?$(SRCROOT)/項目名稱,
你的openssl 文件夾是放在根目錄的么?反正我不是放在這里,所以路徑要根據(jù)你的實際情況修改下。
解決:在 “Build Setting” 下 "Header Search Paths" 增加 openssl 文件夾路徑,比如我的路徑是?$(SRCROOT)/項目名稱/library/AliPay
如果有問題,請看下 “五”
其它補充:這里文件找不到,除了路徑問題,還有一個就是?#include<> 和?#include “” 的區(qū)別
#include<> ?編譯器會優(yōu)先在系統(tǒng)庫中查找該文件,一般引用系統(tǒng)庫的時候用<>;
#include “” ? 編譯器優(yōu)先從項目文件中查找,一般自己寫的文件用 “”
五、Build Error :?Apple Mach-O Linker Error
Build Error :linker command failed with exit code 1 (use -v to see invocation)
網(wǎng)上查了一圈,最有可能的原因有三種,分別如下:
第一種:缺少了 .m 文件的引用,在 “Build Phases" 中的 “Compile Sources" 查看,如果有缺失的.m文件(一般是第三方的文件),添加上去;
第二種:正好和第一種相反,重復(fù)引用了相同的文件,請刪除相同的引用;
第三種:缺少了 .framework 或 .a 庫文件的引用,請確保第三方所需要的庫文件已經(jīng)全部引用,在“Build Phases" 中的 “Link Binary With Libraries" 查看;
除了這三種外,還是其它可能,請參看這里
我是在接入支付寶時出現(xiàn)這個問題,還是和 openssl 有關(guān),查詢 openssl ,發(fā)現(xiàn)是用C語言寫的,在IOS中并不能直接使用 openssl 的源碼,是需要編譯成為 .a 庫文件進(jìn)行使用的!再回頭看下支付寶的demo,里面確實引用了 openssl 編譯出來的兩個庫文件,libssl.a 和?libcrypto.a。
OK,在項目中加入兩個庫文件,編譯通過,知道真相后我的眼淚都要掉下來...
很奇怪為什么要同時引用 openssl 源碼和編譯后的庫文件,缺哪個都有問題?
六、Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
訪問了一塊不屬于你的內(nèi)存
解決:找到引起錯誤的變量,嘗試修改為其它變量屬性,呃,這塊知識點有待加強
七、Build Error :?apple LLVM 6.1 Error
背景:編譯運行外來項目時出現(xiàn),應(yīng)該和項目之前的關(guān)聯(lián)路徑發(fā)生變化有關(guān)
解決:有一個簡單粗暴的方法,直接刪除 Targets 下面的 xxxTests,嗯,右鍵后選刪除。
八、iTunes Connect 上傳圖片,提示“無法載入您的文件。請再試一次”
背景:圖片符合要求,出現(xiàn)此問題
解決:確保圖片存儲路徑和圖片名稱不包含中文字符!
九、The iOS 8.2 simulator runtime is not available.
Unable to open liblaunch_sim.dylib. ?Try reinstalling Xcode or the simulator runtime.
背景:升級Xcode 7 后出現(xiàn)這個問題
解決:
方法一:參看這里
復(fù)制 liblaunch_sim.dylib 到有問題的模擬器版本上
找到下面的文件,復(fù)制
/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/system/host/liblaunch_sim.dylib
替換下面的文件
/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 8.2.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/host/liblaunch_sim.dylib
其它模擬器如果有問題,同理替換,路徑都基本一樣的
然而,這個方法并沒有解決我的問題
方法二:
網(wǎng)速好像不錯,我重新下載了模擬器版本,這大概是最愚蠢的解決方案

十、Undefined symbols for architecture x86_64: "operator delete[](void*)", referenced from:
[objc]view plaincopy
Undefined?symbolsforarchitecturex86_64:
"operator?delete[](void*)",?referencedfrom:
+[WeChatApiUtilEncodeBase64:]?in?libWeChatSDK.a(WeChatApiUtil.o)
+[WeChatApiUtilNsDataEncodeBase64:]?in?libWeChatSDK.a(WeChatApiUtil.o)
+[WeChatApiUtilDecodeWithBase64:]?in?libWeChatSDK.a(WeChatApiUtil.o)
+[WeChatApiUtilDecodeBase64:]?in?libWeChatSDK.a(WeChatApiUtil.o)
......
背景:導(dǎo)入第三方庫(微信)后編譯失敗。
解決:添加 libc++ 庫即可。
十一、could not launch “XXX” process launch failed security
?背景:Xcode 7.1 真機調(diào)試,真機版本9.1
原因?一:包ID匹配而證書不匹配的問題,請確定使用的是開發(fā)證書。
解決:切換為正確的開發(fā)證書
原因二:9.1下企業(yè)應(yīng)用需要信任開發(fā)者描述證書
解決:iphone > 設(shè)置 > 通用 > 描述文件 > "你開發(fā)用的Apple ID 賬號" > 選擇信任
解決二:Xcode > Window > Devices > 按住“Ctrl"鍵點擊設(shè)備,選"Show Provisioning Profiles" > 刪除全部
十二、This application's application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed.
設(shè)備上安裝了 Bundle identifier 一樣的應(yīng)用,請先刪除。
十三、交易訂單處理失敗,請稍后再試 ali64
背景:接入支付寶時出現(xiàn)
原因:密鑰問題,商戶公鑰沒有上傳到支付寶,或者商戶密鑰被更換過
RSA密鑰分 公鑰和私鑰,請確保目前項目使用的密鑰和上傳到支付寶的密鑰是配對的。
十四、Archive 過程中出現(xiàn)
archive 后 upload 時出現(xiàn)
iOS7 需要添加iPhone5的啟動圖片支持。Launch Screen File 這個是iOS8后才有的。
十五、Could not find Developer Disk Image
真機測試時出現(xiàn),Xcode沒有真機對應(yīng)的包。比如:Xcode7.1 最高支持iOS9.1
解決:更新你的xcode版本,或者拷貝對應(yīng)的支持包到下面的路徑
[html]view plaincopy
/Applications(應(yīng)用程序)/Xcode-beta(右鍵顯示包內(nèi)容)/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
附錄:
十六、An unknown error message 'DeviceLocked', was received from the device.
接上面 “十五”,如果你導(dǎo)入對應(yīng)的支持包后,比如10.0的支持包,可能出現(xiàn)這個問題
解決:拔掉數(shù)據(jù)線,重新插入,簡單粗暴。
十七、Upload to app store 過程中出現(xiàn)
1. Archive upload ?failed with error
版本號不對,設(shè)置一個比 1.4.3 更高的版本號,
新修改xcode 中的版本號,要比?iTunes Connect 中心 》應(yīng)用的構(gòu)建版本 最新版本高。
2. This action could not be completed. Try again. (-22421)
原因:
1. 這個問題一般是Apple iTunes connect 抽風(fēng),等一下再試,或者使用 Application Loader 上傳。
2. iTunes connect 沒有找到應(yīng)用對應(yīng)的版本號也會出現(xiàn)。比如要上傳的版本是2.0.0 版本,但iTunes connect 還沒創(chuàng)建出2.0.0版本。
十八、點擊狀態(tài)欄快速返回頭部 失效
這個功能是系統(tǒng)默認(rèn)有的,失效可能是當(dāng)前頁面由多個UITableView組成,系統(tǒng)不知道響應(yīng)哪一個。
解決:如果是多列表頁面,設(shè)置當(dāng)前使用的UITableView.scrollToTop = YES,其它為NO。
十九、Archive failed
.bundle.ltGJwQ/01 for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
一般是第三方庫的問題,可能它沒有支持gitcode,嘗試更換庫或者關(guān)閉 gitcode
二十、iOS10權(quán)限適配
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
背景:iOS10后調(diào)用相機、相冊應(yīng)用直接掛掉。查了下才知道需要加權(quán)限使用說明。
解決:在info.plist 文件中加上對應(yīng)權(quán)限使用說明。
[html]view plaincopy
NSAppleMusicUsageDescription
App需要您的同意,才能訪問媒體資料庫
NSBluetoothPeripheralUsageDescription
App需要您的同意,才能訪問藍(lán)牙
NSCalendarsUsageDescription
App需要您的同意,才能訪問日歷
NSCameraUsageDescription
App需要您的同意,才能訪問相機
NSHealthShareUsageDescription
App需要您的同意,才能訪問健康分享
NSHealthUpdateUsageDescription
App需要您的同意,才能訪問健康更新
NSLocationAlwaysUsageDescription
App需要您的同意,才能始終訪問位置
NSLocationUsageDescription
App需要您的同意,才能訪問位置
NSLocationWhenInUseUsageDescription
App需要您的同意,才能在使用期間訪問位置
NSMicrophoneUsageDescription
App需要您的同意,才能訪問麥克風(fēng)
NSMotionUsageDescription
App需要您的同意,才能訪問運動與健身
NSPhotoLibraryUsageDescription
App需要您的同意,才能訪問相冊
NSRemindersUsageDescription
App需要您的同意,才能訪問提醒事項
二十一、Build 安裝到模擬器時 Devices NO Such File Or directory
描述:刪除應(yīng)用后重新安裝,第一次就可以正常使用,第二次編譯運行后就會報這個問題。
解決:模擬器菜單》hardware 》reboot ?即可
二十二、Failed to load Info.plist from bundle at path......
解決:clear項目,重新運行
二十三、could not attach to pid:
解決:clear 項目,重啟模擬器,重新編譯,再次運行
二十四、pngcrush caught libpng error
解決:
1、確定圖片格式?jīng)]有被修改過,比如jpg圖片改后綴名為png,這樣是不行滴;
2、確定圖片是正常生成出來的,不是切圖之類搞出來的;
3、用圖片處理工具重新處理圖片
異常相關(guān)
零、設(shè)置異常斷點捕獲?Exception Breakpoint
Xcode 打開 Breakpoint 斷點面板,增加一個全局的斷點,這樣可以定位到大部分的異常拋出位置
一、lb: library not found for -| XXX
編譯的時候出現(xiàn),原因是編譯時找不到需要的庫鏈接
解決:在項目Target 選擇要編譯的 target ,選擇 General 選項,下面有個 “Linked Frameworks and Libraries” , 添加缺失的庫鏈接
其它:如果是lb:library not found for -|Pods.a
說明項目使用CocoaPods作為依賴管理工具,負(fù)責(zé)管理項目中的第三方開源代碼,libPods.a 是CocoaPods 將所有第三方編譯合成的文件,
當(dāng)IOS項目使用使用CocoaPods,我們要打開項目工程的是 .xcworkspace 文件,而不是 .xcodeproj 文件,顯然這是個菜鳥問題。
二、Error Domain=NSURLErrorDomain Code=-1005 "The network commection was lost"
背景:模擬器、使用 AFNetworking 請求數(shù)據(jù)
切換不同網(wǎng)絡(luò)連接后會出現(xiàn)
解決:一般重啟模擬器可以解決;如果沒有解決,可以重置模擬器內(nèi)容
選 IOS Simulator 》Reset Content and Settings 》Reset
三、Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/JavaScript"
背景:模擬器、使用 AFNetworking 請求數(shù)據(jù)
顯然,這是因為請求設(shè)置的 content-type 和 服務(wù)器返回的 content-type 不相同,服務(wù)器用的是?content-type: text/javascript
解決:設(shè)置下
[objc]view plaincopy
afManager.responseSerializer.acceptableContentTypes=?[NSSetsetWithObject:@"text/javascript"];
四、Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'
初始化數(shù)據(jù)后使用 mutableCopy 方法
[objc]view plaincopy
mArray?=?[[userDefaultsobjectForKey:@"test_data"]mutableCopy];
五、[NSNull count]: unrecognized selector sent to instance 0x10d76d4c0
這是個坑爹的問題,查了好久才發(fā)現(xiàn)原因
服務(wù)器接口返回數(shù)據(jù)中,有空值,有空值,有空值,重要事情說三遍!
比如服務(wù)器返回 {"title":""}
在 oc 中,會轉(zhuǎn)化為 NSNull 值,而不是一個空的 NSString 字符串
這個和Java轉(zhuǎn)化為空的String字符串是完全不同的
oc 中,NSNull 值不能賦給其它變量,會報錯
解決:對可能出現(xiàn)空值的地方進(jìn)行判斷處理,如果可以的話,最好服務(wù)器接口不要傳空值,改為一個默認(rèn)值更佳。
[objc]view plaincopy
if([dictobjectForKey:@"title"]?==?[NSNullnull])?{
NSLog("數(shù)據(jù)為空");
}
update 2015.08.17
沒有最坑爹,只有更坑爹!我發(fā)現(xiàn)有個接口查不到數(shù)據(jù)居然僅回傳 “[ ]” 這幾個字符?。?!寫接口的你過來,看我不打屎你。
這個用上面的方法是不能檢測出來的,因為壓根就沒東西,考慮到正常的接口JSON都是字典類型,改為下面的方法判斷:
[objc]view plaincopy
if([respObjisKindOfClass:[NSArrayclass]])?{
NSLog(@"無數(shù)據(jù)");
}
顯然,“[ ]” 轉(zhuǎn)為數(shù)組,“{ }” 轉(zhuǎn)為字典。
六、Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 0 from section 0 which only contains 0 rows before the update'
使用 UITableView 時出現(xiàn),問題出在 section 和 rows 數(shù)量與界面中的數(shù)量不符,比如:數(shù)據(jù)中存在 section=2,rows=2,但界面中沒有這個分組(行),這時候?qū)υ摻M(行)進(jìn)行操作就會出現(xiàn)異常。
常發(fā)生在 insertRowsAtIndexPaths 和 deleteRowsAtIndexPaths 以及 刷新 tableView數(shù)據(jù)源后。
解決:保持界面與數(shù)據(jù)源同步
七、unknown type name 'CGFloat'
No type or protocol named 'UITableViewDataSource'
導(dǎo)入?#import
這種類似問題一律導(dǎo)入 kit
八、Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x7faad1f2b8b0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
背景:?模擬器、使用 AFNetworking 請求數(shù)據(jù)
原因:一般是服務(wù)器返回的數(shù)據(jù)格式有問題(不是JSON?格式)
解決:
需要確定到底是返回什么樣的數(shù)據(jù),然后才能正確的解決問題
[objc]view plaincopy
afManager?=?[AFHTTPRequestOperationManagermanager];
//?使用?AFHTTPRequestSerializer/AFHTTPResponseSerizlizer?替換?AFJSONRequestSerializer/AFJSONResponseSerializer
afManager.requestSerializer=?[AFHTTPRequestSerializerserializer];
afManager.responseSerializer=?[AFHTTPResponseSerializerserializer];
[afManagerGET:@"you?url"parameters:nilsuccess:^(AFHTTPRequestOperation*operation,idrespObj)?{
//?將獲取到的數(shù)據(jù)轉(zhuǎn)為字符串輸出
NSData*data?=?respObj;
NSString*resultString?=??[[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
NSLog(@"resultString?=?%@",?resultString);
}failure:^(AFHTTPRequestOperation*operation,NSError*error)?{
NSLog(@"error:?%@",?error);
}];
OK,看下輸出的結(jié)果是什么,再做進(jìn)一步操作。
比如我打印出來的數(shù)據(jù)是一個網(wǎng)頁的HTML代碼,說明接口有問題的,聯(lián)系后臺的同事修改。
(補充:這個接口在網(wǎng)頁端返回的是JSON數(shù)據(jù);在移動端用IOS源生NSMutableURLRequest 請求也返回JSON數(shù)據(jù);用AFNetworking 返回網(wǎng)頁;
經(jīng)查:是后臺過濾器問題,默認(rèn)將移動端請求導(dǎo)到某個頁面)
如果返回的不是JSON,是字符串?dāng)?shù)據(jù),可以用上面的方法,轉(zhuǎn)為字符串再進(jìn)一步處理。
或者嘗試使用下面方法
[objc]view plaincopy
afManager.requestSerializer=?[AFHTTPRequestSerializerserializer];
AFJSONResponseSerializer*jsonResponseSerializer?=?[AFJSONResponseSerializerserializerWithReadingOptions:NSJSONReadingAllowFragments];
jsonResponseSerializer.acceptableContentTypes=?[NSSetsetWithObject:@"text/html"];
afManager.responseSerializer=?jsonResponseSerializer;
參看這里
http://stackoverflow.com/questions/27915879/apns-error-domain-nscocoaerrordomain-code-3840
九、use of undeclared identifier KUTTypeImage
解決:
1. 導(dǎo)入庫 ?MobileCoreServices.framework
2. 引用 import
[objc]view plaincopy
#import?