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 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别