gpt4 book ai didi

ios - Swift iOS -UIImagePicker 的照片库在模拟器上显示,但在运行 Xcode 时在实际设备上崩溃(不会显示)

转载 作者:搜寻专家 更新时间:2023-10-31 22:56:33 24 4
gpt4 key购买 nike

我使用的是 Swift 3、iOS 10.3 和 Xcode 8.3.3。

当我在模拟器上访问照片库时,UIImagePicker 显示没有问题,我可以选择照片。 一旦我尝试在实际设备(iPhone 7+)上访问照片库,应用程序就会崩溃,因为 UIImagePicker 不会显示(我什至没有选择一个照片)。奇怪的是在实际设备上 imagePicker 会显示相机,我可以毫无问题地拍照。

即使我没有在这个问题中添加它,在我的实际代码中我也有运行的 api 权限。在我的实际代码中,我使用了它们并将它们注释掉,但问题仍然存在:

import AVFoundation

//there is way more code then this I just put these here to show that I'm using them
PHPhotoLibrary.authorizationStatus()
PHPhotoLibrary.requestAuthorization()
AVCaptureDevice.authorizationStatus(forMediaType: ...)
AVCaptureDevice.requestAccess(forMediaType: ...)

更新:我仍然没有解决问题,但我发现了更多信息。我一直在玩这个应用程序,在崩溃后我再次尝试了这个应用程序,它让我可以访问图书馆。我逐渐意识到,只要 Xcode 未运行,该应用程序就可以让我访问手机上的库。一旦我将手机重新插入 Xcode 并尝试再次访问该库,我就会崩溃。我不知道该怎么做。

只要 Xcode 未连接到设备,我就可以成功地从库中获取照片。使用模拟器我可以毫无问题地获取照片。在设备未连接到 Xcode 的情况下,我可以获得照片。但是,一旦连接设备和 Xcode,我就会崩溃。我已经尝试用 3 种不同的方式(如下所述)初始化 UIImagePicker,看看它们中的任何一种是否会改变结果,但结果总是一样的。我的应用程序有 100 多个类和 50 个 vc,也许问题出在其他地方。但是,如果它发生在其他地方,那么当 Xcode 也没有连接到设备时它应该会崩溃。

在使用 UIImagepicker 的类中,我注释掉了所有不必要的代码,只关注库和相机按钮。一旦设备和 Xcode 交织在一起,崩溃总是发生。好消息是,一旦他们未连接,我就可以访问库,这样用户就不会遇到问题,因为他们永远不会让 Xcode 与我的应用程序一起运行。

应该注意的是,当设备和 Xcode 连接后,我可以使用相机并成功拍照。问题好像是监管到图书馆。

这个问题我已经看过好几次了,但答案总是一样

"the permissions inside your info.plist have to be set"

在我的情况下,权限是在 info.plist 中设置的:

info.plist

source files

这是在模拟器的“设置”页面中设置为“打开”的开关图片。我无法为实际设备的设置页面拍照,但相机和照片开关都设置为“开”

permissions

我的代码:

MyController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 

fileprivate var imagePicker = UIImagePickerController()

override func viewDidLoad() {
super.viewDidLoad()

imagePicker.delegate = self
}

@IBAction fileprivate func libraryButton(_ sender: UIButton){

self.imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
self.imagePicker.allowsEditing = false
presentViewController(self.imagePicker, animated: true, completion: nil)
}

@IBAction fileprivate func cameraButton(_ sender: UIButton){

self.imagePicker.sourceType = UIImagePickerControllerSourceType.camera
self.imagePicker.allowsEditing = false
present(self.imagePicker, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

if let myImage = info[UIImagePickerControllerOriginalImage] as? UIImage{
imageView.image = myImage
}
else if let myImage = info[UIImagePickerControllerEditedImage] as? UIImage{
imageView.image = myImage
}
else{"UIImagePicker Problem")
}

imagePicker.dismiss(animated: true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
imagePicker.dismiss(animated: true, completion: nil)
}
}
}

我也试过:

fileprivate var imagePicker:UIImagePickerController?

@IBAction fileprivate func libraryButton(_ sender: UIButton){

self.imagePicker = UIImagePickerController()
self.imagePicker?.delegate = self
self.imagePicker?.sourceType = UIImagePickerControllerSourceType.photoLibrary
self.imagePicker?.allowsEditing = false
present(self.imagePicker!, animated: true, completion: nil)
}

@IBAction fileprivate func cameraButton(_ sender: UIButton){

self.imagePicker = UIImagePickerController()
self.imagePicker?.delegate = self
self.imagePicker?.sourceType = UIImagePickerControllerSourceType.camera
self.imagePicker?.allowsEditing = false
present(self.imagePicker!, animated: true, completion: nil)
}

我也试过:

fileprivate let imagePicker:UIImagePickerController?

override func viewDidLoad() {
super.viewDidLoad()

imagePicker = UIImagePickerController()
imagePicker!.delegate = self
}


@IBAction fileprivate func libraryButton(_ sender: UIButton){

imagePicker!.sourceType = UIImagePickerControllerSourceType.photoLibrary
imagePicker!.allowsEditing = false
present(imagePicker!, animated: true, completion: nil)
}

@IBAction fileprivate func cameraButton(_ sender: UIButton){

imagePicker!.sourceType = UIImagePickerControllerSourceType.camera
imagePicker!.allowsEditing = false
present(imagePicker!, animated: true, completion: nil)
}

这与设备和 Xcode 连接后我不断收到的崩溃信息相同:

libc++abi.dylib`__cxa_throw:
-> 0x18fd96e70 <+0>: stp x22, x21, [sp, #-0x30]!
0x18fd96e74 <+4>: stp x20, x19, [sp, #0x10]
0x18fd96e78 <+8>: stp x29, x30, [sp, #0x20]
0x18fd96e7c <+12>: add x29, sp, #0x20 ; =0x20
0x18fd96e80 <+16>: mov x19, x2
0x18fd96e84 <+20>: mov x20, x1
0x18fd96e88 <+24>: mov x21, x0
0x18fd96e8c <+28>: bl 0x18fd96a88 ; __cxa_get_globals
0x18fd96e90 <+32>: mov x22, x0
0x18fd96e94 <+36>: bl 0x18fd9756c ; std::get_unexpected()
0x18fd96e98 <+40>: stur x0, [x21, #-0x60]
0x18fd96e9c <+44>: bl 0x18fd975ac ; std::get_terminate()
0x18fd96ea0 <+48>: stur x0, [x21, #-0x58]
0x18fd96ea4 <+52>: stp x20, x19, [x21, #-0x70]
0x18fd96ea8 <+56>: mov x8, #0x434c000000000000
0x18fd96eac <+60>: movk x8, #0x4e47, lsl #32
0x18fd96eb0 <+64>: movk x8, #0x432b, lsl #16
0x18fd96eb4 <+68>: movk x8, #0x2b00
0x18fd96eb8 <+72>: mov x19, x21
0x18fd96ebc <+76>: str x8, [x19, #-0x20]!
0x18fd96ec0 <+80>: orr w8, wzr, #0x1
0x18fd96ec4 <+84>: stur x8, [x19, #-0x58]
0x18fd96ec8 <+88>: ldr w8, [x22, #0x8]
0x18fd96ecc <+92>: add w8, w8, #0x1 ; =0x1
0x18fd96ed0 <+96>: str w8, [x22, #0x8]
0x18fd96ed4 <+100>: adrp x8, 0
0x18fd96ed8 <+104>: add x8, x8, #0xef8 ; =0xef8
0x18fd96edc <+108>: str x8, [x19, #0x8]
0x18fd96ee0 <+112>: mov x0, x19
0x18fd96ee4 <+116>: bl 0x190433be4 ; _Unwind_RaiseException
0x18fd96ee8 <+120>: mov x0, x19
0x18fd96eec <+124>: bl 0x18fd96f20 ; __cxa_begin_catch
0x18fd96ef0 <+128>: ldur x0, [x21, #-0x58]
0x18fd96ef4 <+132>: bl 0x18fd975c4 ; std::__terminate(void (*)())

我的项目中的任何地方都没有 Unwind Segue,所以我不确定为什么会这样说。但无论它是否在模拟器上工作,它都应该在手机上工作,或者如果它不能在手机上工作,那么它也不应该在模拟器上工作。下面是崩溃报告和堆栈跟踪的片段。

错误报告:

enter image description here

enter image description here

enter image description here

我从设备上删除了该应用程序,关闭了 Xcode,重新启动它,接受了允许它访问库的权限,然后出现了同样的问题。

知道问题出在哪里吗?

最佳答案

Ash Furrow 帮助我解决了这个问题,因为这是一个非常不明显的问题并且可能是一个 api 错误。我为不熟悉解决它的过程的人发布了图片。

事实证明,在 Breakpoint Navigator 中我激活了 All Exceptions。出于某种原因,当我的应用程序连接到 Xcode 并且 UIImagePicker 正在显示照片库时,触发了所有异常断点,并且有一个轻微的延迟导致应用程序崩溃。延迟是几毫秒,但足够长,以至于应用程序认为存在问题。 Ash 说他以前从未见过这样的东西,并说我的照片库中可能有一张损坏的 jpg 照片,但这又是一个疯狂的猜测。简单的解决方案是停用或删除 All Exceptions 断点,问题就解决了。他确实说这可能是一个 api 问题,因为它仍然导致非常奇怪的崩溃。

需要注意的是,他说All Exceptions break point最好保持激活,因为它会早发现异常。我忘记了他的详细解释,但基本上最好保持打开状态,如果遇到此问题,只需将其停用即可。

通过停用 All Exceptions 断点来解决 UIImagePicker 库呈现崩溃的步骤:

  1. 在屏幕左侧的导航 Pane 中,从左数第 7 个看起来像箭头的图标是 Breakpoint Navigator

Breakpoint Navigator

  1. All Exceptions 断点被激活/突出显示为蓝色 All Exception Activated

  2. 要停用所有异常(exception),请单击突出显示的蓝色箭头或右键单击单词 All Exceptions 本身,然后从列表中选择禁用或删除

Options to deselect the All Exception breakpoint

  1. 假设您选择禁用或单击蓝色箭头,它将被停用

All Exception Deactivated

  1. 显然,如果您选择删除,它将从断点导航器中删除,但如果您想再次添加它(或者如果您从来没有使用过它),那么您仍然必须在断点导航器中(第 1 步)并且在 Pane 的左下角,按加号按钮并选择异常断点以添加它。

Plust button in at the bottom of the pane on the left side

enter image description here

关于ios - Swift iOS -UIImagePicker 的照片库在模拟器上显示,但在运行 Xcode 时在实际设备上崩溃(不会显示),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45789485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com