使用UIImagePickerController选图时遇AX Lookup错误(errorCode:1100)求解决
使用UIImagePickerController时遇到AX Lookup错误(错误码1100)的解决方法
问题现象
- 弹出图片选择器时出现错误日志:
2023-08-03 16:47:45.979280-0700 MyAppName[7794:1889375] [AXRuntimeCommon] Unknown client: MyAppName
- 选择图片时触发错误码1100的权限问题:
2023-08-03 16:47:51.357123-0700 DownStream[7794:1889385] [AXRuntimeCommon] AX Lookup problem - errorCode:1100 error:Permission denied portName:'com.apple.iphone.axserver' PID:7795 ( 0 AXRuntime 0x00000001c1bb8acc _AXGetPortFromCache + 968 1 AXRuntime 0x00000001c1bbb038 AXUIElementPerformFencedActionWithValue + 852 2 UIKit 0x0000000220f7ae5c D402ECD6-842A-3487-9D23-92A0EA9DFBEA + 790108 3 libdispatch.dylib 0x00000001069f4520 _dispatch_call_block_and_release + 32 4 libdispatch.dylib 0x00000001069f6038 _dispatch_client_callout + 20 5 libdispatch.dylib 0x00000001069fe0b0 _dispatch_lane_serial_drain + 984 6 libdispatch.dylib 0x00000001069fedf4 _dispatch_lane_invoke + 412 7 libdispatch.dylib 0x0000000106a0bc74 _dispatch_workloop_worker_thread + 736 8 libsystem_pthread.dylib 0x00000001f68f5ddc _pthread_wqthread + 288 9 libsystem_pthread.dylib 0x00000001f68f5b7c start_wqthread + 8 )
相关实现代码
internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { var selectedImageFromPicker: UIImage? if let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage{ selectedImageFromPicker = editedImage } else if let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { selectedImageFromPicker = originalImage } if let imageUrl = info[UIImagePickerController.InfoKey.imageURL] as? URL{ let imgName = imageUrl.lastPathComponent let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first let localPath = documentDirectory?.appending(imgName) let data = selectedImageFromPicker!.pngData()! as NSData data.write(toFile: localPath!, atomically: true) _ = URL.init(fileURLWithPath: localPath!) try! selectedImageFromPicker?.jpegData(compressionQuality: 0.1)?.write(to: imageUrl) uploadFile(image: selectedImageFromPicker!) picker.dismiss(animated: true, completion: nil) } }
解决方法与变通方案
1. 修复代码中的强制解包风险
代码里多处使用!强制解包,一旦可选值为nil会直接崩溃,也可能触发系统权限异常。替换为安全的可选绑定和错误处理:
// 替换强制解包部分 if let image = selectedImageFromPicker, let pngData = image.pngData(), let localPath = localPath { (pngData as NSData).write(toFile: localPath, atomically: true) } // 替换try!为do-catch错误处理 do { if let image = selectedImageFromPicker, let jpegData = image.jpegData(compressionQuality: 0.1) { try jpegData.write(to: yourLocalDocumentURL) // 这里写自己App的本地路径,不要写系统相册路径 } } catch { print("写入图片失败:\(error)") }
2. 验证相册权限配置
确保Info.plist中添加了正确的权限描述:
- 读取相册:添加
NSPhotoLibraryUsageDescription,值为权限申请说明(比如"需要访问您的相册以选择图片") - 写入相册(若涉及):添加
NSPhotoLibraryAddUsageDescription
3. 禁止直接修改系统相册文件
代码中尝试write(to: imageUrl),这个imageUrl是系统相册内的原图路径,App没有权限直接修改该路径的文件,这是触发权限错误的核心原因之一。放弃修改原路径文件,改为仅保存到自己的documentDirectory,如果需要修改相册内容,使用PHAssetChangeRequest(需额外权限)。
4. 改用PHPickerViewController替代UIImagePickerController
从iOS 14开始,苹果推荐使用PHPickerViewController,它的权限模型更清晰,能避免很多系统权限冲突问题,示例用法:
import PhotosUI func presentImagePicker() { var config = PHPickerConfiguration() config.filter = .images // 仅允许选择图片 let picker = PHPickerViewController(configuration: config) picker.delegate = self present(picker, animated: true) } extension YourViewController: PHPickerViewControllerDelegate { func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true) guard let provider = results.first?.itemProvider, provider.canLoadObject(ofClass: UIImage.self) else { return } provider.loadObject(ofClass: UIImage.self) { [weak self] image, error in guard let image = image as? UIImage else { return } DispatchQueue.main.async { self?.uploadFile(image: image) // 这里添加保存到本地文档目录的逻辑 } } } }
5. 重置设备隐私权限
如果是模拟器测试,可通过设置 > 通用 > 传输或还原iPhone > 还原 > 还原位置与隐私重置权限;真机则在设置 > 隐私与安全性 > 照片中检查App权限状态,重新授权。
内容的提问来源于stack exchange,提问作者Mr. Man
相关产品推荐
相关产品推荐

