Как сохранить 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, в ней появилась новая возможность поддерживать сеансы в фоновом режиме.