您的位置:首页 > 移动开发 > Objective-C

setObjectForKey: object cannot be nil (key: UIImagePickerControllerOriginalImage)

2016-11-11 11:58 881 查看
开发的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];
}


没有效果,因为开了闪光灯后拍照时间长,只要先按拍照按钮,这里的判断就没有效果,在闪光灯亮时锁屏,问题还是必现。

二、自定义相机界面,自己画界面并完成“使用照片”的功能代码;

同样不行。

如果自定义相机界面,在同样的操作步骤下,在照片返回给自定义界面前,系统的“使用照片”相关代码已默认触发,因此无法摆脱此问题。

三、禁用闪光灯,降低问题重现几率

禁用闪光灯后,拍照时间很短,问题基本是很难重现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS 相机
相关文章推荐