应用程序在发布时崩溃,被Apple拒绝

时间:2017-09-17 10:47:53

标签: ios swift

我最近将我的应用程序更新为Swift 4并进行了一些更改但由于某些原因Apple拒绝我的应用程序,因为它在iOS 10.2上的iPad上崩溃...不幸的是我只能在iPad模拟器,iPhone模拟器中测试我的应用程序和两个真正的iPhone,所以我无法在真正的iPad上测试它。

他们给我发了一个崩溃日志,我用命令来表示崩溃(来自这里:https://medium.com/@nikhilmshchs/symbolicating-ios-crash-reports-e97ad0d6b4dc

这是我代码上次调用的结果:

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的iPhone 7 Plus上完美运行,也适用于iOS 10.3.3的iPhone 6s。

我联系了一位朋友在真正的iPad上测试该应用,但我仍然不知道为什么该应用应该在该设备上崩溃,而不是在我的设备上...

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

修改

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

内部self.turnTorch()

if device.hasTorch, device.isTorchAvailable, device.isTorchModeSupported(mode) {...}

flashButtonAction()内:

guard let device = captureDevice, device.hasTorch, device.isTorchAvailable else { return }

编辑2:

在得到一些答案后,我手动检查(使用 UIDevice.current.userInterfaceIdiom ),如果该设备是 iPad ,如果是,则不应使用火炬......这似乎工作正常,因为Apple没有拒绝新版本:)

1 个答案:

答案 0 :(得分:2)

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