我使用最新的Google Cast SDK for iOS(版本3.1.1.10003),我们的应用程序是远程控制Google Cast设备,例如它改变了音量。当我们的应用程序进入后台时,它也需要这样做。
但是,当应用转到后台时,GCKSessionManager
会调用suspendSessionWithReason:
。这就是说,会话将被暂停,因此我们的应用程序无法再控制它。
如何在应用转到后台后让GCKSessionManager
暂停会话?
修改:我在下方提供解决方案,但由于重新连接时出现严重延误,因此用户不友好。
答案 0 :(得分:4)
在最新的Google Cast SDK中,您可以像options一样设置它:
package:
name: r-decipher
version: "2.6.0"
source:
git_url: https://git.bioconductor.org/packages/DECIPHER
requirements:
build:
- r
- bioconductor-biostrings
- r-rsqlite
run:
- r
- bioconductor-biostrings
- r-rsqlite
test:
test:
commands:
# You can put additional test commands to be run here.
- $R -e "library('DECIPHER')" # [not win]
- "\"%R%\" -e \"library('DECIPHER')\"" # [win]
about:
home: https://bioconductor.org/packages/release/bioc/html/DECIPHER.html
然而,无论如何,会话都会从丢失的网络连接中消失。诀窍是从设备播放“空”音频文件,使其保持活动状态。愚蠢认为这必须是行业标准。
答案 1 :(得分:2)
当Google Cast SDK在应用程序转到后台时调用GCKSessionManager.suspendSessionWithReason
时,一种解决方案是使用不同的实现替换此方法,该实现检查原因是.AppBackgrounded
然后实际忽略该调用。 / p>
然后,当应用程序转到后台时,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开始,它有一个新选项可以让会话在后台保持活动状态。