我最近将我的应用程序更新为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没有拒绝新版本:)
答案 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
}
}
}