iOS text a voz en segundo plano

Estoy teniendo un problema intermitente (aargh!) Jugando Text-to-Speech en segundo plano, desencadenada desde Apple Watch. He configurado correctamente el modo de background, la categoría AVSession y el controller WatchKitExtensionRequest. (Ver más abajo.) Tenía esto funcionando antes, y no puedo entender qué cambió. (¿Podría ser iOS 9 tiene problemas? "Antes" significa, entre otras cosas, iOS 8.)

El problema es este: cuando la aplicación obtiene la request del reloj y la aplicación está en segundo plano o el teléfono está durmiendo (bloqueado), el discurso a veces se reproduce de inmediato y otras veces no se reproduce hasta que se presenta la aplicación al primer plano Parece que el sistema operativo está haciendo queue en el audio y, en ocasiones, no. No puedo encontrar ningún hilo común entre los casos de éxito y fracaso. Puedo verificar con el logging que la llamada a speakUtterance () se realiza en todas las situaciones. Pero su comportamiento varía, aparentemente random. La única pista es que podría ser el caso de que cuanto más time esté la aplicación en segundo plano, less probable es que hable de inmediato.

Esto me está haciendo tirarme el pelo. Sugerencias bienvenidas.

En info.plist:

Modos de background necesarios: la aplicación reproduce audio o transmite audio / video usando AirPlay

En AppDelegate.application: didFinishLaunching: withOptions ():

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

En 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) 

Aquí hay una solución: reproducir un segundo fragment de sonido (utilicé medio segundo de silencio), usando AVAudioPlayer, justo después de la llamada a speakUtterance (), Esto parece "activar la tubería".