iOS CAMImagePickerCameraViewController crashes in iOS 10.3.1

0

My app started to crash after an update to ios 10.3.1 .The crash happens when I attempt to pick a video using the camera. The app works well on older ios versions (9.3.5 and 10.2.1). The crash log shows that it is the CAMImagePickerCameraViewController that is crashing:

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

A similar crash that I see in crashlytics is:

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

Here is an excerpt from my code:

    /// 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
    }

The controller that crashes is not part of my application and I cannot touch it. Does anyone have an idea how this problem can be fixed? What is the purpose of CAMImagePickerCameraViewController? Why does it crash only on ios 10.3.1 and doesn't crash on previous versions?

ios
crash
uiimagepickercontroller
asked on Stack Overflow May 2, 2017 by hmitkov

1 Answer

0

I have some similar issue here, and i found it's the delegate's problem.

My issue is viewController retain an object, and i set the object's weak delegate to viewController, when viewController dismissed and the object still try to use delegate to do something, crash occurred...

So i think the weak reference goes wrong...no idea why it happens, but you can fix this by add code blow to the viewController dealloc method - (void)dealloc{ self.assetsPickerController = nil }

answered on Stack Overflow Jul 8, 2017 by Ryan Yan

User contributions licensed under CC BY-SA 3.0