Вопрос или проблема
Я не могу получить уведомление GCControllerDidConnect в VisionOS 2.0 (эмулятор) и, следовательно, не могу настроить поддержку джойстика. Однако это работает в VisionOS 1.2.
Для VisionOS 2.0 я попробовал добавить:
.handlesGameControllerEvents(matching: .gamepad)
атрибут к представлениюSupports Controller User Interaction
вInfo.plist
Supported game controller types
->Extended Gamepad
вInfo.plist
…но уведомление все равно не срабатывает. Оно срабатывает, когда код выполняется из эмулятора VisionOS 1.2, в обоих случаях включена опция Send Game Controller To Device
.
Вот пример кода. Он основан на шаблоне проекта Xcode. Единственными измененными файлами были ImmersiveView.swift
и Info.plist
, как описано выше:
import SwiftUI
import GameController
import RealityKit
import RealityKitContent
struct ImmersiveView: View {
var body: some View {
RealityView { content in
// Добавьте начальное содержимое RealityKit
if let immersiveContentEntity = try? await Entity(named: "Immersive", in: realityKitContentBundle) {
content.add(immersiveContentEntity)
}
NotificationCenter.default.addObserver(
forName: NSNotification.Name.GCControllerDidConnect,
object: nil, queue: nil) { _ in
print("Обработка уведомления GCControllerDidConnect")
}
}
.modify {
if #available(visionOS 2.0, *) {
$0.handlesGameControllerEvents(matching: .gamepad)
} else {
$0
}
}
}
}
extension View {
func modify<T: View>(@ViewBuilder _ modifier: (Self) -> T) -> some View {
return modifier(self)
}
}
Ответ или решение
Проблема, с которой вы сталкиваетесь, связана с тем, что уведомление GCControllerDidConnect не срабатывает в VisionOS 2.0, несмотря на успешную работу в версии 1.2. Давайте рассмотрим несколько шагов, которые могут помочь в решении этой проблемы.
1. Проверьте настройки проекта
Убедитесь, что вы правильно указали все необходимые атрибуты в Info.plist
:
- Добавьте ключ
Supports Controller User Interaction
и установите значениеYES
. - Включите ключ
Supported game controller types
и добавьтеExtended Gamepad
.
2. Проверка конфигурации симулятора
Если вы используете симулятор VisionOS 2.0, убедитесь, что в нем действительно активирована отправка игровых контроллеров на устройство. После включения опции Send Game Controller To Device
в настройках симулятора попробуйте перезапустить симулятор.
3. Регистрация уведомления
Ваш код для регистрации уведомления выглядит правильно. Однако, попробуйте вынести регистрацию уведомления в метод onAppear
, чтобы убедиться, что она выполняется после того, как представление станет активным:
import SwiftUI
import GameController
import RealityKit
import RealityKitContent
struct ImmersiveView: View {
var body: some View {
RealityView { content in
// Добавьте начальное содержимое RealityKit
if let immersiveContentEntity = try? await Entity(named: "Immersive", in: realityKitContentBundle) {
content.add(immersiveContentEntity)
}
}
.modify {
if #available(visionOS 2.0, *) {
$0.handlesGameControllerEvents(matching: .gamepad)
} else {
$0
}
}
.onAppear {
NotificationCenter.default.addObserver(
forName: NSNotification.Name.GCControllerDidConnect,
object: nil, queue: nil) { _ in
print("Handling GCControllerDidConnect notification")
}
}
}
}
4. Использование GameController Framework
Убедитесь, что вы инициализируете и проверяете доступные контроллеры в начале. Это может помочь в установлении соединения.
import GameController
if let controller = GCController.controllers().first {
// Контроллер подключен, можно выполнять дальнейшие действия
}
5. Проверка на устройстве
Если проблема сохраняется, стоит протестировать приложение на реальном устройстве с VisionOS 2.0. Иногда существуют различия в поведении симулятора и реального устройства, особенно в отношении внешних устройств, таких как игровые контроллеры.
6. Обновление и исправления
Наконец, убедитесь, что вы используете последнюю версию Xcode и SDK для VisionOS 2.0. Желательно проверить наличие обновлений и исправлений, которые могли бы решить проблемы совместимости.
Если после выполнения всех этих шагов проблема все еще не решена, рекомендуется обратиться к сообществу разработчиков Apple или официальной документации, чтобы получить дополнительную помощь и информацию об известных проблемах в новой версии системы.