Ios 应用程序在发布时崩溃,被苹果拒绝

Ios 应用程序在发布时崩溃,被苹果拒绝,ios,swift,Ios,Swift,我最近将我的应用程序更新为Swift 4并做了一些更改,但出于某种原因,苹果拒绝了我的应用程序,因为它在iOS 10.2上的iPad上崩溃了。。。不幸的是,我只能在iPad模拟器、iPhone模拟器和两部真正的iPhone上测试我的应用程序,所以我不能在真正的iPad上测试它 他们给我发了一个崩溃日志,我用一个命令来表示崩溃(从这里:) 这是我的代码最后一次调用的结果: specialized closure #1 in ScannerViewController.setUpViews() (i

我最近将我的应用程序更新为Swift 4并做了一些更改,但出于某种原因,苹果拒绝了我的应用程序,因为它在iOS 10.2上的iPad上崩溃了。。。不幸的是,我只能在iPad模拟器、iPhone模拟器和两部真正的iPhone上测试我的应用程序,所以我不能在真正的iPad上测试它

他们给我发了一个崩溃日志,我用一个命令来表示崩溃(从这里:)

这是我的代码最后一次调用的结果:

specialized closure #1 in ScannerViewController.setUpViews() (in QR Code Reader) (ScannerViewController.swift:595)
这是该方法的第595行:

case .auto: self.flashButton.setImage(#imageLiteral(resourceName: "FlashAuto"), for: .normal)
这是方法的一部分:

...
self.flashButton.isEnabled = self.captureDevice?.hasTorch ?? false
self.flashButton.isHidden = true

self.switchCameraButton.isHidden = true

switch UserDefaultsManager.torchModeState {
    case .on: self.turnTorch(.on)
    case .off: self.turnTorch(.off)
    case .auto: self.flashButton.setImage(#imageLiteral(resourceName: "FlashAuto"), for: .normal)
}
更多信息: 此方法在
DispatchQueue.main.async
调用内调用,在
awakeFromNib()内调用。该应用程序在iOS 11.0 GM的iPhone7 Plus上运行良好,在iOS 10.3.3的iPhone6S上也运行良好

我联系了一个朋友在一台真正的iPad上测试这个应用程序,但我仍然不知道为什么这个应用程序会在那个设备上崩溃,而不是在我的设备上

也许我必须在隐藏按钮之前而不是之后设置按钮图像,但我不知道

编辑:

我还检查设备是否有火炬:

内部
self.turnthorch()

和内部
flashButtonAction()

编辑2:


回答了一些问题后,我手动检查(使用
UIDevice.current.userInterfaceIdiom
)该设备是否为iPad,如果是,则不应使用火炬。。。这似乎很好,因为苹果没有拒绝新版本:)

iPad根本没有闪光灯。所以你不能用它。如果您使用的是
AVCaptureDevice
或类似软件,则必须确保应用程序不会进入自动闪存模式。否则应用程序将崩溃

// Example //
class CameraViewController: BasicViewController, AVCapturePhotoCaptureDelegate {
    @IBOutlet weak var flashSegcontrol: UISegmentedControl! // flashSegcontrol

    func snapPicture() {
        let settingsForMonitoring = AVCapturePhotoSettings()
        if flashSegcontrol.selectedSegmentIndex == 0 {
            if !isDeviceIpad() {
                settingsForMonitoring.flashMode = .on
            } else {
                settingsForMonitoring.flashMode = .off
            }
        }
        else if flashSegcontrol.selectedSegmentIndex == 1 {
            settingsForMonitoring.flashMode = .off
        }
        else {
            if !isDeviceIpad() {
                settingsForMonitoring.flashMode = .auto
            } else {
                settingsForMonitoring.flashMode = .off
            }
        }
        settingsForMonitoring.isAutoStillImageStabilizationEnabled = true
        settingsForMonitoring.isHighResolutionPhotoEnabled = false
        imagePhotoOutput?.capturePhoto(with: settingsForMonitoring, delegate: self as AVCapturePhotoCaptureDelegate)    
    }

    func isDeviceIpad() -> Bool {
        if UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad {
            return true
        } else {
            return false
        }
    }
}

你确定那不是操作系统打字错误吗?也许是从10.2改为10.3的功能。你可以将你的应用程序部署到iOS 10.3+版本MM,但我以前将我的应用程序部署到9.0或更高版本,而这个版本是10.0或更高版本。。。我以前没有遇到过这个问题:/我这么说是因为我曾经遇到过一个问题,因为我没有用
arch(x86\u 64)
正确地检查操作系统架构,所以被拒绝了。注意行动表演示,您还必须指向演示按钮。我这么说是因为你们的问题似乎只会在iPad上触发。你在其他iPad上试过吗?在任何需要演示的按钮/项目上,我使用“popoverPresentationController”,它在iPad模拟器上工作嗯。。。您是否在UserDefaultsManager中实现了单例共享实例?在设置视图时,它似乎会崩溃。确保您的用户默认值指向正确的位置,不知何故,它可能找不到您的路径,如果是这样,则
torchModeState
不会启动,并且可能会导致崩溃错误。不,这不是问题所在:在
self.turnTorch()内部
如果device.hasTorch,device.istochavailable,device.istochaveable,device.istocModesupported(mode){…}
和内部
flashButtonAction()
保护let device=captureDevice,device.hasTorch,device.istochavable-else{return}
实际上。。。出于某种原因,即使我检查了这个设备是否有手电筒,检查这个设备是否是iPad似乎是唯一可行的事情,所以我想现在已经解决了,这很好。事实上,我的iPhone/iPad应用程序因为这个自动闪光模式被拒绝了半年。无论如何,祝你的应用程序好运。
guard let device = captureDevice, device.hasTorch, device.isTorchAvailable else { return }
// Example //
class CameraViewController: BasicViewController, AVCapturePhotoCaptureDelegate {
    @IBOutlet weak var flashSegcontrol: UISegmentedControl! // flashSegcontrol

    func snapPicture() {
        let settingsForMonitoring = AVCapturePhotoSettings()
        if flashSegcontrol.selectedSegmentIndex == 0 {
            if !isDeviceIpad() {
                settingsForMonitoring.flashMode = .on
            } else {
                settingsForMonitoring.flashMode = .off
            }
        }
        else if flashSegcontrol.selectedSegmentIndex == 1 {
            settingsForMonitoring.flashMode = .off
        }
        else {
            if !isDeviceIpad() {
                settingsForMonitoring.flashMode = .auto
            } else {
                settingsForMonitoring.flashMode = .off
            }
        }
        settingsForMonitoring.isAutoStillImageStabilizationEnabled = true
        settingsForMonitoring.isHighResolutionPhotoEnabled = false
        imagePhotoOutput?.capturePhoto(with: settingsForMonitoring, delegate: self as AVCapturePhotoCaptureDelegate)    
    }

    func isDeviceIpad() -> Bool {
        if UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad {
            return true
        } else {
            return false
        }
    }
}