【问题标题】:App Crashes When saving image to camera roll将图像保存到相机胶卷时应用程序崩溃
【发布时间】:2020-10-26 20:44:04
【问题描述】:

当我尝试将扫描保存到相机胶卷时,应用程序崩溃

这是代码:

func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
    // Make sure the user scanned at least one page
    guard scan.pageCount >= 1 else {

        // You are responsible for dismissing the VNDocumentCameraViewController.
        controller.dismiss(animated: true)
        return
    }

    // This is a workaround for the VisionKit bug which breaks the `UIImage` returned from `VisionKit`
    // See the `Image Loading Hack` section below for more information.

    var arrImages = [UIImage]()
    for i in 0...scan.pageCount-1 {
        let originalImage = scan.imageOfPage(at: i)
        let fixedImage = reloadedImage(originalImage)
        arrImages.append(fixedImage)
    }

    controller.dismiss(animated: true)

    let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let docURL = documentDirectory.appendingPathComponent("Delete This")

    if Filetype == 1 {
        let data = createNewPDF(arrImage: arrImages)
        do {
            try data?.write(to: docURL, options: .completeFileProtection)
            print("Success")

        } catch(let error) {
            print("error is \(error.localizedDescription)")
        }
    } else {
        if Filetype == 2 {

            if customjg == 68 {
                for i in 0...scan.pageCount-1 {
                    let originalImage = scan.imageOfPage(at: i)
                    let fixedImage =  originalImage.jpegData(compressionQuality: 0.7)
                    let reloadedImage = UIImage(data: fixedImage!)
                    UIImageWriteToSavedPhotosAlbum(reloadedImage!, nil, nil, nil);
                    //arrImages.append(fixedImage)
                }
                if customjg == 69 {

                    let originalImage = scan.imageOfPage(at: 1)
                    let rere =  self.resizeImagezz(image: originalImage, targetSize: CGSize(width: Widthv, height: Heightv))
                    let fixedImage = rere.jpegData(compressionQuality: 0.7)
                    let reloadedImage = UIImage(data: fixedImage!)
                    UIImageWriteToSavedPhotosAlbum(reloadedImage!, nil, nil, nil);
                    //arrImages.append(fixedImage)
                }

            }
        }else{
            if Filetype == 3 {
                for i in 0...scan.pageCount-1 {
                    let originalImage = scan.imageOfPage(at: i)
                    let fixedImage =  originalImage.pngData()
                    let reloadedImage = UIImage(data: fixedImage!)
                    UIImageWriteToSavedPhotosAlbum(reloadedImage!, nil, nil, nil);
                    //arrImages.append(fixedImage)
                }
            }
        }
    }
}

文件类型是一个段控制的开关盒。默认情况下,第一个选项是 JPEG。 它甚至不会在崩溃前询问相机胶卷访问权限(是的,我已将其放入 info.plist 文件中)。

目前只有 PDF 有效。

但奇怪的是,安装在 iOS 14 Beta 上时一切正常。

请尽快帮我解决这个问题。

感谢您提前提供的帮助。

【问题讨论】:

  • 你有相当多的强制解包,你有没有想过在使用它们之前解包它们,因为强制解包是 nil 会导致崩溃?
  • 如果您正在寻求有关崩溃的帮助,您应该添加有关崩溃的信息并指出导致它的行。
  • 究竟是哪一行导致了崩溃?控制台中是否有任何错误消息?你知道每个! 都在喊:如果它是零就崩溃?您需要查明问题,这是调试的重要部分。
  • 无论发生什么崩溃,您都应该使用更现代且易于使用的照片框架。

标签: swift visionkit


【解决方案1】:

根据文档 - https://developer.apple.com/documentation/uikit/1619125-uiimagewritetosavedphotosalbum, 我们应该实现completionSelector。并且对于同一组completionTarget 为self。 实现api如下:

UIImageWriteToSavedPhotosAlbum(reloadedImage!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)

那么在这个completionSelector中:

@objc func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
    guard let error = error else {//success return}
    // found error
    print(error)
}

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2013-03-21
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多