iOS后台文本转语音

8

我遇到了一个间歇性(啊!)问题,从Apple Watch触发的Text-to-Speech在后台播放。 我已经正确设置了后台模式、AVSession类别和WatchKitExtensionRequest处理程序。(见下文。)我以前做过这个,但是想不出有什么变化。(可能是iOS 9有问题吗?“以前”指的是iOS 8等其他事情。)

问题是:当应用程序收到来自手表的请求并且应用程序处于后台或手机处于休眠状态(锁定),语音 有时 立即播放,而 有时 直到将应用程序带到前景才播放。 操作系统似乎有时会将音频排队,有时则不会。我找不到成功和失败案例之间的任何共同点。 我可以通过日志记录验证,在所有情况下都调用speakUtterance()。但是它的行为变化,显然是随机的。唯一的线索是它可能是这样的,越久应用程序处于后台,它就越不可能立即播放。
这让我抓狂了。欢迎建议。

在info.plist中:

所需的后台模式:应用程序播放音频或使用AirPlay流式传输音频/视频

在AppDelegate.application:didFinishLaunching:withOptions()中:

do {
    try AVAudioSession.sharedInstance().setCategory(
        AVAudioSessionCategoryPlayback, 
        withOptions:.DuckOthers
    )
    try AVAudioSession.sharedInstance().setActive(true)
} catch let error as NSError {
    // etc...
}

在AppDelegate.application:handleWatchKitExtensionRequest...()函数中:

var bgTaskId:UIBackgroundTaskIdentifier = 0
bgTaskId = application.beginBackgroundTaskWithName(
    "Prose WKE handler",
    expirationHandler: {
        application.endBackgroundTask(bgTaskId)
    }
)
//... Post notification to call Text-to-Speech
application.endBackgroundTask(bgTaskId)

我也遇到了同样的问题,尽管是由推送通知引起的。但我一定会尝试你的解决方法 :) - Jens Schwarzer
祝你好运!我最近没有检查过是否不再需要这个。我怀疑这是苹果的一个bug。请告诉我它对你有什么作用。 - Andrew Duncan
1个回答

8

以下是一个解决方法:在调用speakUtterance()之后,使用AVAudioPlayer播放第二个音频片段(我使用了半秒钟的静音),这似乎可以“激活管道”。


嗨,安德鲁 - 你的解决方法在周末成功地起作用了 - 谢谢:D 我已经向苹果提交了一个错误报告。 - Jens Schwarzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接