在 iOS 7 上显示 UIImagePickerController 会导致崩溃

Posted

技术标签:

【中文标题】在 iOS 7 上显示 UIImagePickerController 会导致崩溃【英文标题】:Presenting the UIImagePickerController causes a crash on iOS 7 【发布时间】:2013-10-24 22:44:09 【问题描述】:

我在 ios 7 设备上显示 UIImagePickerController 时遇到问题。我使用以下代码来呈现图像选择器。

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
cameraUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
cameraUI.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
cameraUI.delegate = self;

[[self presentViewController:cameraUI animated:YES completion:NULL];

在调用 presentViewController 后,应用程序由于 exec 错误访问而崩溃。控制台报告以下异常。

[SBSAccelerometer valueRestriction]: unrecognized selector sent to instance 0x1650e360
[__NSCFNumber valueRestriction]: unrecognized selector sent to instance 0x146d0e70

我启用了僵尸来查看一个对象是否被过早地释放。 Zombies 报告以下异常:

[NSISRestrictedToNonNegativeVariable retain]: message sent to deallocated instance 0x156f0010

有什么想法吗?

编辑

这是我在启用僵尸时收到的堆栈跟踪:

【问题讨论】:

您是在实际设备上运行它吗? (如果我没记错的话,它可能会在模拟器上崩溃。)此外,可能值得检查 [UIImagePickerController availableMediaTypesForSourceType: 出于某种原因没有返回空数组。 您看到僵尸报告的堆栈跟踪是什么?您是否尝试过制作最小的测试用例?我不认为您显示的代码是(全部)问题。 我在运行 iOS 7 的 iPhone 5S 上运行代码会导致崩溃,但它适用于运行 iOS 6 的 iPhone 4。我检查了 mediaTypes 和 public.image 和 public.movi​​e被退回。 选择器出现后self是否存在?什么是呈现选择器? 我有更新。是的,在视图控制器出现后 self 就存在了。视图控制器由另一个视图控制器呈现。另外,当我使用 presentViewController:animated:completion 时,我在项目的其他地方遇到了这个问题。有趣的是,当我不为过渡设置动画时,我不会遇到崩溃。 【参考方案1】:

这是 iPad 上 iOS 7 中的一个错误。目前的解决方案似乎是在打开 UIPopoverControl 之前请求照片的权限。以下是我实施解决方案的方式:

**// Photo Library
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])

    void(^blk)() =  ^() 
        UIImagePickerController* picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        if (NIIsPad()) 
            UIPopoverController* popover = [[UIPopoverController alloc] initWithContentViewController:picker];
            [popover presentPopoverFromBarButtonItem:self.popoverAnchor permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
         else 
            [self.navigationController presentModalViewController:picker animated:YES];
        
    ;

    // Make sure we have permission, otherwise request it first
    ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
    ALAuthorizationStatus authStatus;
    if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0"))
        authStatus = [ALAssetsLibrary authorizationStatus];
    else
        authStatus = ALAuthorizationStatusAuthorized;

    if (authStatus == ALAuthorizationStatusAuthorized) 
        blk();
     else if (authStatus == ALAuthorizationStatusDenied || authStatus == ALAuthorizationStatusRestricted) 
        [[UIAlertView alertViewWithTitle:@"Grant photos permission" message:@"Grant permission to your photos. Go to Settings App > Privacy > Photos."] show];
     else if (authStatus == ALAuthorizationStatusNotDetermined) 
        [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
            // Catch the final iteration, ignore the rest
            if (group == nil)
                dispatch_async(dispatch_get_main_queue(), ^
                    blk();
                );
            *stop = YES;
         failureBlock:^(NSError *error) 
            // failure :(
            dispatch_async(dispatch_get_main_queue(), ^
                [[UIAlertView alertViewWithTitle:@"Grant photos permission" message:@"Grant permission to your photos. Go to Settings App > Privacy > Photos."] show];
            );
        ];
    
**

不要忘记将 AssetsLibrary.framework 添加到您的项目中。

【讨论】:

感谢 Vizlix 的回答;但是,我在***的其他地方看到了这个答案,并在发布问题之前检查了我的权限。此外,崩溃发生在 iPhone 而不是 iPad 上。 我一直坚持这个或多年。我正在使用 iOS SDK 6.1,而我的 UIImagePickerController 在 iOS7 的 iPhone4S 上崩溃。它在 iOS7 的 iPhone4 上运行良好!有人能解决这个问题吗?

以上是关于在 iOS 7 上显示 UIImagePickerController 会导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS8 上使用 UIImagePicker 结果 URL 和 PHAsset 从“我的照片流”加载图像

UIImagePicker 无法在 iOS 3.1.3 上执行全屏转换

如何在 iOS 上的 UIImagePicker 中获取实际图像框架的大小?

UIView子视图中的IOS UIImagePicker

如何模仿 iOS 7 相机

更改 UIImagePicker 纵横比