Уведомление GCControllerDidConnect не получено в VisionOS 2.0

Вопрос или проблема

Я не могу получить уведомление 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 или официальной документации, чтобы получить дополнительную помощь и информацию об известных проблемах в новой версии системы.

Оцените материал
Добавить комментарий

Капча загружается...