iOS CAMImagePickerCameraViewController 在 iOS 10.3.1 中崩溃
Posted
技术标签:
【中文标题】iOS CAMImagePickerCameraViewController 在 iOS 10.3.1 中崩溃【英文标题】:iOS CAMImagePickerCameraViewController crashes in iOS 10.3.1 【发布时间】:2017-05-02 09:01:30 【问题描述】:我的应用在更新到 ios 10.3.1 后开始崩溃。当我尝试使用相机选择视频时发生崩溃。该应用程序在较旧的 ios 版本(9.3.5 和 10.2.1)上运行良好。 崩溃日志显示崩溃的是 CAMImagePickerCameraViewController:
OS Version: iPhone OS 10.3.1 (14E304)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000019
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
Triggered by Thread: 0
Filtered syslog:
None found
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x1b946f4e realizeClass(objc_class*) + 18
1 libobjc.A.dylib 0x1b94704c realizeClass(objc_class*) + 272
2 libobjc.A.dylib 0x1b94abc6 lookUpImpOrForward + 94
3 libobjc.A.dylib 0x1b94ab64 _class_lookupMethodAndLoadCache3 + 26
4 libobjc.A.dylib 0x1b9511ae _objc_msgSend_uncached + 14
5 CameraUI 0x2f8d6896 -[CAMImagePickerCameraViewController _handleCapturedImagePickerVideoAtPath:withEditingMetadata:] + 166
6 CameraUI 0x2f8d609a -[CAMImagePickerCameraViewController cropOverlayWasOKed:] + 478
7 UIKit 0x2191e804 -[UIApplication sendAction:to:from:forEvent:] + 76
8 UIKit 0x2191e798 -[UIControl sendAction:to:forEvent:] + 62
9 UIKit 0x21908dc8 -[UIControl _sendActionsForEvents:withEvent:] + 478
10 UIKit 0x2191e0d4 -[UIControl touchesEnded:withEvent:] + 604
11 UIKit 0x2191dc1e -[UIWindow _sendTouchesForEvent:] + 2094
12 UIKit 0x21918b5e -[UIWindow sendEvent:] + 2798
13 UIKit 0x218ea702 -[UIApplication sendEvent:] + 308
14 UIKit 0x2207dd36 __dispatchPreprocessedEventFromEventQueue + 2254
15 UIKit 0x220786da __handleEventQueue + 4186
16 UIKit 0x22078abc __handleHIDEventFetcherDrain + 144
17 CoreFoundation 0x1c677fdc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
18 CoreFoundation 0x1c677b04 __CFRunLoopDoSources0 + 424
19 CoreFoundation 0x1c675f50 __CFRunLoopRun + 1160
20 CoreFoundation 0x1c5c90ee CFRunLoopRunSpecific + 470
21 CoreFoundation 0x1c5c8f10 CFRunLoopRunInMode + 104
22 GraphicsServices 0x1dd73b40 GSEventRunModal + 80
23 UIKit 0x2194de82 UIApplicationMain + 150
24 Stringr Dev 0x00181604 0x82000 + 1046020
25 libdyld.dylib 0x1bdb64ea start + 2
我在 crashlytics 中看到的类似崩溃是:
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x00000000c839e660
libobjc.A.dylib realizeClass(objc_class*) + 25
libobjc.A.dylib _objc_msgSend_uncached + 14
CameraUI -[CAMImagePickerCameraViewController _handleCapturedImagePickerVideoAtPath:withEditingMetadata:]
CameraUI -[CAMImagePickerCameraViewController cropOverlayWasOKed:]
UIKit UIApplicationMain + 150
这是我的代码的摘录:
/// Presents the video selection/capture dialog
fileprivate func presentPickerController()
// Request authorization to access photo library if not yet granted
phphotoLibrary.requestAuthorization status in
guard status == .authorized else
self.alert(.notPermittedToSelectVideos)
return
// Create the custom asset picker (to get multiple at once)
let assetsPickerController = DKImagePickerController()
assetsPickerController.defaultAssetGroup = .smartAlbumVideos
assetsPickerController.showsCancelButton = true
assetsPickerController.assetType = .allVideos
assetsPickerController.didSelectAssets = self.didSelectAssets
assetsPickerController.didCancel = self.didCancel
assetsPickerController.disableCaptureWhenSelected = true
assetsPickerController.createCaptureController = self.createCaptureController
self.assetsPickerController = assetsPickerController
DispatchQueue.main.async
self.present(assetsPickerController, animated: true)
fileprivate func createCaptureController() -> UIViewController?
let imagePickerController = UIImagePickerController()
imagePickerController.sourceType = .camera
imagePickerController.mediaTypes = [kUTTypeMovie as String]
imagePickerController.videoQuality = .typeHigh
imagePickerController.delegate = self
guard canCaptureVideo() else
Logger.info?.message("Attempted to capture video when cannot capture video")
alert(.cantCaptureVideo)
return nil
guard permittedToCaptureVideo() else
Logger.info?.message("Attempted to capture video when cannot capture video")
alert(.notPermittedToCaptureVideo)
return nil
guard permittedToCaptureAudio() else
Logger.info?.message("Attempted to capture video when cannot capture audio")
alert(.notPermittedToCaptureAudio)
return nil
return imagePickerController
崩溃的控制器不是我的应用程序的一部分,我无法触摸它。有谁知道如何解决这个问题? CAMImagePickerCameraViewController 的用途是什么?为什么只在 ios 10.3.1 上会崩溃,而在之前的版本上不会崩溃?
【问题讨论】:
我们遇到了完全相同的问题。你找到解决办法了吗? 【参考方案1】:我这里有一些类似的问题,我发现这是代表的问题。
我的问题是 viewController 保留了一个对象,我将对象的弱委托设置为 viewController,当 viewController 被解除并且对象仍然尝试使用委托做某事时,发生了崩溃...
所以我认为弱引用出错了......不知道为什么会发生,但你可以通过向 viewController dealloc 方法添加代码来解决这个问题
- (void)dealloc
self.assetsPickerController = nil
【讨论】:
以上是关于iOS CAMImagePickerCameraViewController 在 iOS 10.3.1 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章