setObjectForKey: object cannot be nil (key: UIImagePickerControllerOriginalImage)

来源:互联网 发布:gddr5x和hbm2知乎 编辑:程序博客网 时间:2024/06/05 20:30

开发的APP使用友盟进行crash统计,最近看到以上的问题,但是自己无法重现,搜索后找到了如下信息:
http://stackoverflow.com/questions/29836488/uiimagepickercontrolleroriginalimage-nil-causing-crash-on-photo-capture
http://openradar.appspot.com/19953748

大概可以推测出该问题出现的原因是在拍照的同时锁屏或回到桌面
但是我尝试之后还是无法重现,
最后在下面的帖子里看到有一个关键点是闪光灯:
https://openradar.appspot.com/28108858

于是我拍照前打开闪光灯,然后拍照,同时锁屏。
这时候在Xcode的console日志中可以看到一个报错信息:

* Camera: Error capturing still image (Error Domain=AVFoundationErrorDomain Code=-11800 “这项操作无法完成” UserInfo=0x170675d40 {NSUnderlyingError=0x17064a950 “未能完成操作。(“OSStatus”错误 -16800。)”, NSLocalizedFailureReason=发生未知错误(-16800), NSLocalizedDescription=这项操作无法完成})
2016-11-11 11:20:46.524 GDTaxService[1971:938033] * Camera: captureStillImageSurfaceAsync error, not continuing (Error Domain=AVFoundationErrorDomain Code=-11800 “这项操作无法完成” UserInfo=0x170675d40 {NSUnderlyingError=0x17064a950 “未能完成操作。(“OSStatus”错误 -16800。)”, NSLocalizedFailureReason=发生未知错误(-16800), NSLocalizedDescription=这项操作无法完成})

貌似是拍照没有完成。
但是解锁屏幕后看到相机已经进入预览界面,不过界面是完全的黑色。
然后点击“使用照片”按钮,问题就重现了:

* setObjectForKey: object cannot be nil (key: UIImagePickerControllerOriginalImage)
(null)
((
0 CoreFoundation 0x000000018304c2f4 + 160
1 libobjc.A.dylib 0x00000001948780e4 objc_exception_throw + 60
2 CoreFoundation 0x0000000182f35428 + 972
3 PhotoLibrary 0x000000018e8604e8 + 772
4 PhotoLibrary 0x000000018e860188 PLNotifyImagePickerOfImageAvailability + 28
5 PhotoLibrary 0x000000018e8ad728 + 308
6 PhotoLibrary 0x000000018e8ad540 + 596
7 UIKit 0x0000000187ac1404 + 96
8 GDTaxService 0x00000001000790c4 -[UIControl(SVPreventRepeat) _sv_sendAction:to:forEvent:] + 568
9 UIKit 0x0000000187aaa4e0 + 612
10 UIKit 0x0000000187ac0da0 + 592
11 UIKit 0x0000000187ac0a2c + 700
12 UIKit 0x0000000187ab9f68 + 684
13 UIKit 0x0000000187a8d18c + 264
14 UIKit 0x0000000187d2e324 + 15424
15 UIKit 0x0000000187a8b6a0 + 1716
16 CoreFoundation 0x0000000183004240 + 24
17 CoreFoundation 0x00000001830034e4 + 264
18 CoreFoundation 0x0000000183001594 + 712
19 CoreFoundation 0x0000000182f2d2d4 CFRunLoopRunSpecific + 396
20 GraphicsServices 0x000000018c7436fc GSEventRunModal + 168
21 UIKit 0x0000000187af2fac UIApplicationMain + 1488
22 GDTaxService 0x000000010010f758 main + 124
23 libdyld.dylib 0x0000000194ef6a08 + 4
)

重问题的重现步骤来分析,问题的原因应该是拍照进行中锁屏导致应用进入后台,拍照没有完成,所以出现了第一个问题;但是拍照程序只是捕获了错误没有进行处理,所以相机界面在出错后还是进入了预览界面,但是照片对象是nil。这时候点击“使用照片”就出现了上面的问题。

尝试解决:
一、按照stackoverflow里的一个答复,在拍照前进行判断应用的状态:

if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {        [self takePicture];    }

没有效果,因为开了闪光灯后拍照时间长,只要先按拍照按钮,这里的判断就没有效果,在闪光灯亮时锁屏,问题还是必现。
二、自定义相机界面,自己画界面并完成“使用照片”的功能代码;
同样不行。
如果自定义相机界面,在同样的操作步骤下,在照片返回给自定义界面前,系统的“使用照片”相关代码已默认触发,因此无法摆脱此问题。
三、禁用闪光灯,降低问题重现几率
禁用闪光灯后,拍照时间很短,问题基本是很难重现的。

0 0
原创粉丝点击