iOS Exception 汇总,记录开发学习中遇到的问题,不定时更新
last update date: 2017.03.14
其它问题
一、xcode Build 成功,但是不会运行到模拟器
背景:github 上下载一个开源项目,使用了CocoPods
可以编译成功,说明代码是没有问题的,不能运行到模拟器,应该是没有选择正确的 scheme
解决:选择 “Product” >> “Scheme” >> "Edit Scheme" >> 左边 "Run" >> “Info” 选项卡 >> "Executable" >> "你的项目.app"
二、Build warning: directory not found for option “XXX”
编译后出现的警告,没有找到对应的XXX ,这里XXX一般是 Framework 或 Library 的路径,
一般在打开下载的项目会出现,比如我是在打开微信SDK Demo 时出现的。
解决:在项目 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 播放视频
环境:Mac mini IOS Simulator
这个坑爹的问题,是提示你需要给设备插上耳机,准确的说,插上外接的音频输出设备。嗯,插在Mac mini 上,就酱紫。
四、Build Error “openssl/asn1.h” file not found
背景:接入支付宝时出现
这个问题说穿了很简单,“openssl" 整个文件夹代码都拷贝到项目中,找不到文件是路径问题
再看下支付宝的集成文档,里面要提到 在 “Header Search Paths” 增加头文件路径:$(SRCROOT)/项目名称,显然就是解决这个问题的,
但是注意,这里支付宝Demo 的 openssl 文件夹是放在项目的根目录的,对应路径就是 $(SRCROOT)/项目名称,
你的openssl 文件夹是放在根目录的么?反正我不是放在这里,所以路径要根据你的实际情况修改下。
解决:在 “Build Setting” 下 "Header Search Paths" 增加 openssl 文件夹路径,比如我的路径是 $(SRCROOT)/项目名称/library/AliPay
如果有问题,请看下 “五”
其它补充:这里文件找不到,除了路径问题,还有一个就是 #include<> 和 #include “” 的区别
#include<> 编译器会优先在系统库中查找该文件,一般引用系统库的时候用<>;
#include “” 编译器优先从项目文件中查找,一般自己写的文件用 “”
五、Build Error : Apple Mach-O Linker Error
Build Error : linker command failed with exit code 1 (use -v to see invocation)
网上查了一圈,最有可能的原因有三种,分别如下:
第一种:缺少了 .m 文件的引用,在 “Build Phases" 中的 “Compile Sources" 查看,如果有缺失的.m文件(一般是第三方的文件),添加上去;
第二种:正好和第一种相反,重复引用了相同的文件,请删除相同的引用;
第三种:缺少了 .framework 或 .a 库文件的引用,请确保第三方所需要的库文件已经全部引用,在“Build Phases" 中的 “Link Binary With Libraries" 查看;
除了这三种外,还是其它可能,请参看这里
我是在接入支付宝时出现这个问题,还是和 openssl 有关,查询 openssl ,发现是用C语言写的,在IOS中并不能直接使用 openssl 的源码,是需要编译成为 .a 库文件进行使用的!再回头看下支付宝的demo,里面确实引用了 openssl 编译出来的两个库文件,libssl.a 和 libcrypto.a。
OK,在项目中加入两个库文件,编译通过,知道真相后我的眼泪都要掉下来...
很奇怪为什么要同时引用 openssl 源码和编译后的库文件,缺哪个都有问题?
六、Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
访问了一块不属于你的内存
解决:找到引起错误的变量,尝试修改为其它变量属性,呃,这块知识点有待加强
七、Build Error : apple LLVM 6.1 Error
背景:编译运行外来项目时出现,应该和项目之前的关联路径发生变化有关
解决:有一个简单粗暴的方法,直接删除 Targets 下面的 xxxTests,嗯,右键后选删除。
八、iTunes Connect 上传图片,提示“无法载入您的文件。请再试一次”
背景:图片符合要求,出现此问题
解决:确保图片存储路径和图片名称不包含中文字符!
九、The iOS 8.2 simulator runtime is not available.
Unable to open liblaunch_sim.dylib. Try reinstalling Xcode or the simulator runtime.
背景:升级Xcode 7 后出现这个问题
解决:
方法一:参看这里
复制 liblaunch_sim.dylib 到有问题的模拟器版本上
找到下面的文件,复制
/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
其它模拟器如果有问题,同理替换,路径都基本一样的
然而,这个方法并没有解决我的问题
方法二:
网速好像不错,我重新下载了模拟器版本,这大概是最愚蠢的解决方案 😂
十、Undefined symbols for architecture x86_64: "operator delete[](void*)", referenced from:
Undefined symbols for architecture x86_64:
"operator delete[](void*)", referenced from:
+[WeChatApiUtil EncodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
+[WeChatApiUtil NsDataEncodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
+[WeChatApiUtil DecodeWithBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
+[WeChatApiUtil DecodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
......
背景:导入第三方库(微信)后编译失败。
解决:添加 libc++ 库即可。
十一、could not launch “XXX” process launch failed security
背景:Xcode 7.1 真机调试,真机版本9.1
原因一:包ID匹配而证书不匹配的问题,请确定使用的是开发证书。
解决:切换为正确的开发证书
原因二:9.1下企业应用需要信任开发者描述证书
解决:iphone > 设置 > 通用 > 描述文件 > "你开发用的Apple ID 账号" > 选择信任
解决二:Xcode > Window > Devices > 按住“Ctrl"键点击设备,选"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.
设备上安装了 Bundle identifier 一样的应用,请先删除。
十三、交易订单处理失败,请稍后再试 ali64
背景:接入支付宝时出现
原因:密钥问题,商户公钥没有上传到支付宝,或者商户密钥被更换过
RSA密钥分 公钥和私钥,请确保目前项目使用的密钥和上传到支付宝的密钥是配对的。
十四、Archive 过程中出现
archive 后 upload 时出现
iOS7 需要添加iPhone5的启动图片支持。Launch Screen File 这个是iOS8后才有的。
十五、Could not find Developer Disk Image
真机测试时出现,Xcode没有真机对应的包。比如:Xcode7.1 最高支持iOS9.1
解决:更新你的xcode版本,或者拷贝对应的支持包到下面的路径
/Applications(应用程序)/Xcode-beta(右键显示包内容)/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
附录:
十六、An unknown error message 'DeviceLocked', was received from the device.
接上面 “十五”,如果你导入对应的支持包后,比如10.0的支持包,可能出现这个问题
解决:拔掉数据线,重新插入,简单粗暴。
十七、Upload to app store 过程中出现
1. Archive upload failed with error
版本号不对,设置一个比 1.4.3 更高的版本号,
新修改xcode 中的版本号,要比 iTunes Connect 中心 》应用的构建版本 最新版本高。
2. This action could not be completed. Try again. (-22421)
原因:
1. 这个问题一般是Apple iTunes connect 抽风,等一下再试,或者使用 Application Loader 上传。
2. iTunes connect 没有找到应用对应的版本号也会出现。比如要上传的版本是2.0.0 版本,但iTunes connect 还没创建出2.0.0版本。
十八、点击状态栏快速返回头部 失效
这个功能是系统默认有的,失效可能是当前页面由多个UITableView组成,系统不知道响应哪一个。
解决:如果是多列表页面,设置当前使用的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,尝试更换库或者关闭 gitcode
二十、iOS10权限适配
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后调用相机、相册应用直接挂掉。查了下才知道需要加权限使用说明。
解决:在info.plist 文件中加上对应权限使用说明。
<key>NSAppleMusicUsageDescription</key>
<string>App需要您的同意,才能访问媒体资料库</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App需要您的同意,才能访问蓝牙</string>
<key>NSCalendarsUsageDescription</key>
<string>App需要您的同意,才能访问日历</string>
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能访问相机</string>
<key>NSHealthShareUsageDescription</key>
<string>App需要您的同意,才能访问健康分享</string>
<key>NSHealthUpdateUsageDescription</key>
<string>App需要您的同意,才能访问健康更新 </string>
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始终访问位置</string>
<key>NSLocationUsageDescription</key>
<string>App需要您的同意,才能访问位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App需要您的同意,才能在使用期间访问位置</string>
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能访问麦克风</string>
<key>NSMotionUsageDescription</key>
<string>App需要您的同意,才能访问运动与健身</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>
<key>NSRemindersUsageDescription</key>
<string>App需要您的同意,才能访问提醒事项</string>
二十一、Build 安装到模拟器时 Devices NO Such File Or directory
描述:删除应用后重新安装,第一次就可以正常使用,第二次编译运行后就会报这个问题。
解决:模拟器菜单》hardware 》reboot 即可
二十二、Failed to load Info.plist from bundle at path......
解决:clear项目,重新运行
二十三、could not attach to pid:
解决:clear 项目,重启模拟器,重新编译,再次运行
二十四、pngcrush caught libpng error
解决:
1、确定图片格式没有被修改过,比如jpg图片改后缀名为png,这样是不行滴;
2、确定图片是正常生成出来的,不是切图之类搞出来的;
3、用图片处理工具重新处理图片
异常相关
零、设置异常断点捕获 Exception Breakpoint
Xcode 打开 Breakpoint 断点面板,增加一个全局的断点,这样可以定位到大部分的异常抛出位置
一、lb: library not found for -| XXX
编译的时候出现,原因是编译时找不到需要的库链接
解决:在项目Target 选择要编译的 target ,选择 General 选项,下面有个 “Linked Frameworks and Libraries” , 添加缺失的库链接
其它:如果是 lb:library not found for -|Pods.a
说明项目使用 CocoaPods 作为依赖管理工具,负责管理项目中的第三方开源代码,libPods.a 是CocoaPods 将所有第三方编译合成的文件,
当IOS项目使用使用CocoaPods,我们要打开项目工程的是 .xcworkspace 文件,而不是 .xcodeproj 文件,显然这是个菜鸟问题。
二、Error Domain=NSURLErrorDomain Code=-1005 "The network commection was lost"
背景:模拟器、使用 AFNetworking 请求数据
切换不同网络连接后会出现
解决:一般重启模拟器可以解决;如果没有解决,可以重置模拟器内容
选 IOS Simulator 》Reset Content and Settings 》Reset
三、Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/javascript"
背景:模拟器、使用 AFNetworking 请求数据
显然,这是因为请求设置的 content-type 和 服务器返回的 content-type 不相同,服务器用的是 content-type: text/javascript
解决:设置下
afManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/javascript"];
四、Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'
初始化数据后使用 mutableCopy 方法
mArray = [[userDefaults objectForKey:@"test_data"] mutableCopy];
五、[NSNull count]: unrecognized selector sent to instance 0x10d76d4c0
这是个坑爹的问题,查了好久才发现原因
服务器接口返回数据中,有空值,有空值,有空值,重要事情说三遍!
比如服务器返回 {"title":""}
在 oc 中,会转化为 NSNull 值,而不是一个空的 NSString 字符串
这个和 java 转化为空的String字符串是完全不同的
oc 中,NSNull 值不能赋给其它变量,会报错
解决:对可能出现空值的地方进行判断处理,如果可以的话,最好服务器接口不要传空值,改为一个默认值更佳。
if ([dict objectForKey:@"title"] == [NSNull null]) {
NSLog("数据为空");
}
update 2015.08.17
没有最坑爹,只有更坑爹!我发现有个接口查不到数据居然仅回传 “[ ]” 这几个字符!!!写接口的你过来,看我不打屎你。
这个用上面的方法是不能检测出来的,因为压根就没东西,考虑到正常的接口JSON都是字典类型,改为下面的方法判断:
if ([respObj isKindOfClass:[NSArray class]]) {
NSLog(@"无数据");
}
显然,“[ ]” 转为数组,“{ }” 转为字典。
六、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 时出现,问题出在 section 和 rows 数量与界面中的数量不符,比如:数据中存在 section=2,rows=2,但界面中没有这个分组(行),这时候对该组(行)进行操作就会出现异常。
常发生在 insertRowsAtIndexPaths 和 deleteRowsAtIndexPaths 以及 刷新 tableView数据源后。
解决:保持界面与数据源同步
七、unknown type name 'CGFloat'
No type or protocol named 'UITableViewDataSource'
导入 #import <UIKit/UIKit.h>
这种类似问题一律导入 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 请求数据
原因:一般是服务器返回的数据格式有问题(不是JSON格式)
解决:
需要确定到底是返回什么样的数据,然后才能正确的解决问题
afManager = [AFHTTPRequestOperationManager manager];
// 使用 AFHTTPRequestSerializer/AFHTTPResponseSerizlizer 替换 AFJSONRequestSerializer/AFJSONResponseSerializer
afManager.requestSerializer = [AFHTTPRequestSerializer serializer];
afManager.responseSerializer = [AFHTTPResponseSerializer serializer];
[afManager GET:@"you url" parameters:nil success:^(AFHTTPRequestOperation *operation, id respObj) {
// 将获取到的数据转为字符串输出
NSData *data = respObj;
NSString *resultString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"resultString = %@", resultString);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error: %@", error);
}];
OK,看下输出的结果是什么,再做进一步操作。
比如我打印出来的数据是一个网页的HTML代码,说明接口有问题的,联系后台的同事修改。
(补充:这个接口在网页端返回的是JSON数据;在移动端用IOS源生NSMutableURLRequest 请求也返回JSON数据;用AFNetworking 返回网页;
经查:是后台过滤器问题,默认将移动端请求导到某个页面)
如果返回的不是JSON,是字符串数据,可以用上面的方法,转为字符串再进一步处理。
或者尝试使用下面方法
afManager.requestSerializer = [AFHTTPRequestSerializer serializer];
AFJSONResponseSerializer *jsonResponseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
jsonResponseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
afManager.responseSerializer = jsonResponseSerializer;
参看这里
http://stackoverflow.com/questions/27915879/apns-error-domain-nscocoaerrordomain-code-3840
九、use of undeclared identifier KUTTypeImage
解决:
1. 导入库 MobileCoreServices.framework
2. 引用 import <MobileCoreServices/UTCoreTypes.h>
#import <MobileCoreServices/UTCoreTypes.h>
十、unterminated conditional directive
.h 文件中报错的,查了下是因为缺少 #ifdef 或者 #endif 等标识。