Как сохранить GCKCastSession живым, когда приложение переходит в фоновый режим

Я использую последнюю версию Google Cast SDK для iOS (версия 3.1.1.10003), и наше приложение позволяет удаленно управлять устройствами Google Cast, например, изменять их громкость. Это необходимо сделать также, когда наше приложение переходит в фоновый режим.

Тем не мение, GCKSessionManager Запускает suspendSessionWithReason: когда приложение переходит в фоновый режим. Тем не менее, сеанс будет приостановлен, и, следовательно, наше приложение больше не сможет его контролировать.

Как я могу сделать GCKSessionManager не приостанавливать сеансы, когда приложения уходят в фоновый режим?

Изменить: я предоставляю решение ниже, но это не удобно для пользователя из-за значительных задержек при повторном подключении.

2 ответа

В последнем Google Cast SDK вы можете установить его в следующих вариантах:

let criteria = GCKDiscoveryCriteria(applicationID: kGCKDefaultMediaReceiverApplicationID)
var options = GCKCastOptions(discoveryCriteria: criteria)
options.suspendSessionsWhenBackgrounded = false
GCKCastContext.setSharedInstanceWith(options)

Однако независимо от этого сеанс умирает от потерянного сетевого соединения. Хитрость заключается в воспроизведении "пустого" аудиофайла с устройства, который поддерживает его работу. Глупо думать, что это должен быть отраслевой стандарт.

Как называет Google Cast SDK GCKSessionManager.suspendSessionWithReason когда приложение переходит в фоновый режим, одним из решений является замена этого метода другой реализацией, которая проверяет, является ли причина .AppBackgrounded а затем фактически игнорирует вызов.

Затем SDK не завершает сеанс сразу, когда приложение переходит в фоновый режим, но все равно приостанавливает сеанс на более позднем этапе. Сеанс, однако, может быть перезапущен из фонового режима - однако он занимает значительное время, и эта задержка негативно воспринимается с точки зрения пользователя. Кроме того, сессия регулярно приостанавливается снова после нескольких секунд, чтобы не "говорить с ним".

Любое лучшее решение по-прежнему очень ценится.

extension GCKSessionManager {
    static func ignoreAppBackgroundModeChange() {
        let oldMethod = class_getInstanceMethod(GCKSessionManager.self, #selector(GCKSessionManager.suspendSessionWithReason))
        let newMethod = class_getInstanceMethod(GCKSessionManager.self, #selector(GCKSessionManager.suspendSessionWithReasonIgnoringAppBackgrounded))
        method_exchangeImplementations(oldMethod, newMethod)
    }

    func suspendSessionWithReasonIgnoringAppBackgrounded(reason: GCKConnectionSuspendReason) -> Bool {
        guard reason != .AppBackgrounded else { return false }
        return suspendSessionWithReason(reason)
    }
}

Все, что нам нужно сделать сейчас, это позвонить GCKSessionManager.ignoreAppBackgroundModeChange(),

Редактировать:

Начиная с последней версии Google Cast SDK, в ней появилась новая возможность поддерживать сеансы в фоновом режиме.

Другие вопросы по тегам