Доступ к камере не работает в приложении macCataylst, но в версии для iOS работает нормально. ⇐ IOS
-
Anonymous
Доступ к камере не работает в приложении macCataylst, но в версии для iOS работает нормально.
Я ориентируюсь на iOS 17.4 и macOS 14.2 с помощью приложения iOS/macCatalyst. Приложение предоставляет средство выбора фотографий или доступ к камере для захвата изображения. Моя подпись и возможности имеют следующие настройки: Песочница приложения — Оборудование — Камера Среда выполнения оборудования — библиотека камер и фотографий
В файл info.plist включена строка Конфиденциальность – описание использования камеры, указывающая, почему требуется камера.
в моем контроллере представления SwiftUI есть следующий код:
struct NewGreetingCardView: Просмотр { @State var frontImageSelected: Изображение? = Изображение("переднее изображение") @State var frontPhoto = false @State var sourceType: UIImagePickerController.SourceType = .photoLibrary @State var captureFrontImage: Bool = false @State Private var cameraNotAuthorized = false @State Private var isCameraPresented = false var body: some View { НавигацияВью { Форма { // удалены другие разделы для ясности Раздел("Изображение") { ZStack { frontImageВыбрано? .изменяемый размер() .aspectRatio(contentMode: .fit) .shadow(радиус: 10 ) Изображение (имя системы: «камера.заполнение») .foregroundColor(.white) .font(.largeTitle) .shadow(радиус: 10) .frame(ширина: 150) .onTapGesture { self.frontPhoto = true } .actionSheet(isPresented: $frontPhoto) { () -> ActionSheet в Лист Действия( title: Text("Выбрать режим"), message: Text("Выберите один."), кнопки: [ ActionSheet.Button.default(Text("Камера"), действие: { проверкаКамераАвторизация() self.captureFrontImage.toggle() self.sourceType = .камера }), ActionSheet.Button.default(Text("Библиотека фотографий"), действие: { self.captureFrontImage.toggle() self.sourceType = .photoLibrary }), ActionSheet.Button.cancel() ] ) } .sheet(isPresented: $captureFrontImage) { ImagePicker( исходный тип: исходный тип, изображение: $frontImageSelected) } } .frame(ширина: 300, высота: 300) } } .onAppear(выполнить: { проверкаКамераАвторизация() }) .alert(isPresented: $cameraNotAuthorized) { Тревога( title: Text("Невозможно получить доступ к камере"), message: Text("Чтобы включить доступ, перейдите в «Настройки» > «Конфиденциальность» > Камера и включите доступ к камере для этого приложения.")), PrimaryButton: .default(Text("Настройки")) { открыть настройки() } , вторичная кнопка: .cancel() ) } } } функция openSettings() { #if os(macOS) НастройкиСсылка { Текст("Настройки") } #еще Guard let settingsUrl = URL (строка: UIApplication.openSettingsURLString) else { return } если UIApplication.shared.canOpenURL(settingsUrl) { UIApplication.shared.open(settingsUrl,completeHandler: { _ in }) } #endif } функция checkCameraAuthorization() { вар checkCamera: Bool checkCamera = AVCaptureDevice.authorizationStatus(for: .video) == .authorized если checkCamera == true { камераNotAuthorized = ложь } еще { камераNotAuthorized = правда } } } Код правильно запрашивает у пользователя аутентификацию на iOS и macCataylst, но когда я показываю кадр обзора камеры, на macOS я получаю пустой экран, и приложение вылетает с ошибкой: Поток 1: EXC_BAD_ACCESS(code=1, адрес=0x1c8) и трассировка стека
Очередь потока 1: com.apple.main-thread (последовательный) #0 0x000000018107365c в class_getMethodImplementation() #1 0x000000018260aad8 в _NSKVONotifyingOriginalClassForIsa() #2 0x000000018262ad44 в _NSKeyValueObservationInfoGetObservances() #3 0x0000000182d46b10 в NSKeyValueWillChangeWithPerThreadPendingNotifications () # 4 0x000000019f120c10 в -[AVCapturefigVideoDevice _setVideoHDREnabled:forceResetVideoHDRSuspended:] () #5 0x000000019f16d2fc в -[AVCaptureSession _updateVideoHDREnabledForDevice:forceResetVideoHDRSuspended:] () #6 0x000000019f16b600 в -[AVCaptureSession _updateDeviceActiveFormatsAndActiveConnections] () #7 0x000000019f169aa0 в -[AVCaptureSession _buildAndRunGraph:] () #8 0x000000019f161684 в -[AVCaptureSession _commitConfiguration] () #9 0x000000019f161288 в -[AVCaptureSession commitConfiguration] () #10 0x000000019f12c97c в -[AVCaptureVideoPreviewLayer Dealloc] () #11 0x0000000182d47898 в _NSKVOPerformWithDeallocatingObservable () #12 0x00000001826659b8 в NSKVODeallocate() #13 0x0000000189713888 в CA::Transaction::commit() () #14 0x00000001898e8bc8 в CA::Transaction::flush_as_runloop_observer(bool) () #15 0x0000000181521254 в __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ () #16 0x0000000181521140 в __CFRunLoopDoObservers() #17 0x000000018151fe58 в CFRunLoopRunSpecific () #18 0x000000018bcc0000 в RunCurrentEventLoopInMode() #19 0x000000018bcbfe3c в ReceiveNextEventCommon() #20 0x000000018bcbfb94 в _BlockUntilNextEventMatchingListInModeWithFilter () #21 0x0000000184d77970 в _DPSNextEvent() #22 0x0000000185569dec в -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] () #23 0x0000000184d6acb8 в -[Запуск NSApplication] () #24 0x0000000184d41f54 в NSApplicationMain() #25 0x0000000184f94610 в _NSApplicationMainWithInfoDictionary() #26 0x000000019a7b00dc в UINSApplicationMain() #27 0x00000001b089c778 в UIApplicationMain() #28 0x00000001ca74affc в ___lldb_unnamed_symbol178559 () #29 0x00000001ca74ae44 в ___lldb_unnamed_symbol178557 () #30 0x00000001ca3802bc в статическом App.main() () #31 0x0000000100cddf28 в статическом GreetKeeperApp.$main() () #32 0x0000000100cde090 в главном каталоге /Users/michaelrowe/Documents/TheApApp/CardTracker/CardTracker/GreetKeeperApp.swift:13 #33 0x00000001810ba0e0 в начале () В журнале отладки есть несколько сообщений, связанных с тем, что CMIQHardware не поддерживает асинхронный захват неподвижных изображений, но я не уверен, как это вписывается в простую картину.
Есть ли какие-то конкретные моменты, на которые следует обратить внимание при использовании Mac Catalyst? В предыдущей версии этого приложения (до macOS 14) я не делал ничего особенного для Mac Catalyst.
Я ориентируюсь на iOS 17.4 и macOS 14.2 с помощью приложения iOS/macCatalyst. Приложение предоставляет средство выбора фотографий или доступ к камере для захвата изображения. Моя подпись и возможности имеют следующие настройки: Песочница приложения — Оборудование — Камера Среда выполнения оборудования — библиотека камер и фотографий
В файл info.plist включена строка Конфиденциальность – описание использования камеры, указывающая, почему требуется камера.
в моем контроллере представления SwiftUI есть следующий код:
struct NewGreetingCardView: Просмотр { @State var frontImageSelected: Изображение? = Изображение("переднее изображение") @State var frontPhoto = false @State var sourceType: UIImagePickerController.SourceType = .photoLibrary @State var captureFrontImage: Bool = false @State Private var cameraNotAuthorized = false @State Private var isCameraPresented = false var body: some View { НавигацияВью { Форма { // удалены другие разделы для ясности Раздел("Изображение") { ZStack { frontImageВыбрано? .изменяемый размер() .aspectRatio(contentMode: .fit) .shadow(радиус: 10 ) Изображение (имя системы: «камера.заполнение») .foregroundColor(.white) .font(.largeTitle) .shadow(радиус: 10) .frame(ширина: 150) .onTapGesture { self.frontPhoto = true } .actionSheet(isPresented: $frontPhoto) { () -> ActionSheet в Лист Действия( title: Text("Выбрать режим"), message: Text("Выберите один."), кнопки: [ ActionSheet.Button.default(Text("Камера"), действие: { проверкаКамераАвторизация() self.captureFrontImage.toggle() self.sourceType = .камера }), ActionSheet.Button.default(Text("Библиотека фотографий"), действие: { self.captureFrontImage.toggle() self.sourceType = .photoLibrary }), ActionSheet.Button.cancel() ] ) } .sheet(isPresented: $captureFrontImage) { ImagePicker( исходный тип: исходный тип, изображение: $frontImageSelected) } } .frame(ширина: 300, высота: 300) } } .onAppear(выполнить: { проверкаКамераАвторизация() }) .alert(isPresented: $cameraNotAuthorized) { Тревога( title: Text("Невозможно получить доступ к камере"), message: Text("Чтобы включить доступ, перейдите в «Настройки» > «Конфиденциальность» > Камера и включите доступ к камере для этого приложения.")), PrimaryButton: .default(Text("Настройки")) { открыть настройки() } , вторичная кнопка: .cancel() ) } } } функция openSettings() { #if os(macOS) НастройкиСсылка { Текст("Настройки") } #еще Guard let settingsUrl = URL (строка: UIApplication.openSettingsURLString) else { return } если UIApplication.shared.canOpenURL(settingsUrl) { UIApplication.shared.open(settingsUrl,completeHandler: { _ in }) } #endif } функция checkCameraAuthorization() { вар checkCamera: Bool checkCamera = AVCaptureDevice.authorizationStatus(for: .video) == .authorized если checkCamera == true { камераNotAuthorized = ложь } еще { камераNotAuthorized = правда } } } Код правильно запрашивает у пользователя аутентификацию на iOS и macCataylst, но когда я показываю кадр обзора камеры, на macOS я получаю пустой экран, и приложение вылетает с ошибкой: Поток 1: EXC_BAD_ACCESS(code=1, адрес=0x1c8) и трассировка стека
Очередь потока 1: com.apple.main-thread (последовательный) #0 0x000000018107365c в class_getMethodImplementation() #1 0x000000018260aad8 в _NSKVONotifyingOriginalClassForIsa() #2 0x000000018262ad44 в _NSKeyValueObservationInfoGetObservances() #3 0x0000000182d46b10 в NSKeyValueWillChangeWithPerThreadPendingNotifications () # 4 0x000000019f120c10 в -[AVCapturefigVideoDevice _setVideoHDREnabled:forceResetVideoHDRSuspended:] () #5 0x000000019f16d2fc в -[AVCaptureSession _updateVideoHDREnabledForDevice:forceResetVideoHDRSuspended:] () #6 0x000000019f16b600 в -[AVCaptureSession _updateDeviceActiveFormatsAndActiveConnections] () #7 0x000000019f169aa0 в -[AVCaptureSession _buildAndRunGraph:] () #8 0x000000019f161684 в -[AVCaptureSession _commitConfiguration] () #9 0x000000019f161288 в -[AVCaptureSession commitConfiguration] () #10 0x000000019f12c97c в -[AVCaptureVideoPreviewLayer Dealloc] () #11 0x0000000182d47898 в _NSKVOPerformWithDeallocatingObservable () #12 0x00000001826659b8 в NSKVODeallocate() #13 0x0000000189713888 в CA::Transaction::commit() () #14 0x00000001898e8bc8 в CA::Transaction::flush_as_runloop_observer(bool) () #15 0x0000000181521254 в __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ () #16 0x0000000181521140 в __CFRunLoopDoObservers() #17 0x000000018151fe58 в CFRunLoopRunSpecific () #18 0x000000018bcc0000 в RunCurrentEventLoopInMode() #19 0x000000018bcbfe3c в ReceiveNextEventCommon() #20 0x000000018bcbfb94 в _BlockUntilNextEventMatchingListInModeWithFilter () #21 0x0000000184d77970 в _DPSNextEvent() #22 0x0000000185569dec в -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] () #23 0x0000000184d6acb8 в -[Запуск NSApplication] () #24 0x0000000184d41f54 в NSApplicationMain() #25 0x0000000184f94610 в _NSApplicationMainWithInfoDictionary() #26 0x000000019a7b00dc в UINSApplicationMain() #27 0x00000001b089c778 в UIApplicationMain() #28 0x00000001ca74affc в ___lldb_unnamed_symbol178559 () #29 0x00000001ca74ae44 в ___lldb_unnamed_symbol178557 () #30 0x00000001ca3802bc в статическом App.main() () #31 0x0000000100cddf28 в статическом GreetKeeperApp.$main() () #32 0x0000000100cde090 в главном каталоге /Users/michaelrowe/Documents/TheApApp/CardTracker/CardTracker/GreetKeeperApp.swift:13 #33 0x00000001810ba0e0 в начале () В журнале отладки есть несколько сообщений, связанных с тем, что CMIQHardware не поддерживает асинхронный захват неподвижных изображений, но я не уверен, как это вписывается в простую картину.
Есть ли какие-то конкретные моменты, на которые следует обратить внимание при использовании Mac Catalyst? В предыдущей версии этого приложения (до macOS 14) я не делал ничего особенного для Mac Catalyst.
Мобильная версия