2014-10-21 18 views
7

Sto usando AVSpeechSynthesizer in un singleton. In iOS 8, quando l'app viene messa in background per un po ', quando riprende il singleton AVSpeechSynthesizer non parlerà più. Questo problema non si verifica su iOS 7.AVSpeechSynthesizer smette di funzionare dopo lo sfondo

Quando l'applicazione viene in background, il seguente messaggio si presenta nel mio ceppo:

AVSpeechSynthesizer Audio interruption notification: { 
    AVAudioSessionInterruptionTypeKey = 1; 
} 

ho inizializzare la AVSpeechSynthesizer come questo in init il metodo del Singleton:

self.speechSynthesizer = [[AVSpeechSynthesizer alloc] init]; 
    self.speechSynthesizer.delegate = self; 

e parlo il utterance In questo modo:

AVSpeechUtterance *utt = [[AVSpeechUtterance alloc] initWithString:dialogue]; 
utt.voice = [AVSpeechSynthesisVoice voiceWithLanguage:voice]; 

utt.pitchMultiplier = pitch; 
utt.rate = rate; 
utt.preUtteranceDelay = preDelay; 
utt.postUtteranceDelay = postDelay; 
utt.volume = volumeSetting; 

[self.speechSynthesizer speakUtterance:utt]; 

Qualcuno ha visto qualcosa di simile su iOS 8?

+0

Questo accade sul simulatore e il dispositivo stesso? – FiddleMeRagged

+0

Sul dispositivo - AVSpeechSynthesizer non funziona affatto sul simulatore (almeno in Xcode 6.0). – bmueller

+0

AVSpeechSynth funziona nel simulatore nella versione 8.2 beta 5. –

risposta

12

Ho passato l'intera giornata a inseguire questa pazzia e penso di aver trovato una soluzione. Il mio problema era che AVSpeechSynthesizer funzionava bene in primo piano e in background con il ducking dell'altro audio fino al momento in cui si verifica una telefonata.

In quel momento, parlare smetterebbe di funzionare silenziosamente, senza errori. Tutti gli oggetti sono ancora lì ma le chiamate delegate non vengono richiamate, né avviate né terminate.

Ho notato che con le telefonate, la mia app avrebbe ricevuto la notifica su AudioRouteChanged. Quindi, quando ciò accade, vorrei ricreare l'impostazione vocale: in pratica distruggi lo AVSpeechSynthesizer esistente e ricrearlo di nuovo. Da quel momento in poi, il parlare continuerà a funzionare. Funzionerebbe anche durante la telefonata :)

+0

Sì, funziona! Grazie per aver trovato il tempo per farlo. Oh, e il nome corretto della notifica è 'AVAudioSessionRouteChangeNotification' per chiunque lo ottenga in futuro. – bmueller

+0

Questo hack funziona ancora? Ho lo stesso scenario ma nel mio caso questo non funziona. iOS8.3/Xcode 6.3.2.Sto usando AVAudioSessionCategoryPlayback + AVAudioSessionCategoryOptionDuckOthers – Ivan

+0

Ho dovuto usare: var err: NSError? = nil AVAudioSession.sharedInstance(). setCategory (AVAudioSessionCategoryAmbient, error: & err) – BaseZen

0

Dopo aver esaminato ulteriormente, sembra che AVSpeechSynthesizer si interrompa quando l'app viene avviata in background (a causa di recupero dello sfondo o qualsiasi altra cosa). Una semplice chiamata per verificare se l'app è attualmente attiva prima di parlare risolve il problema.

if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) 
    [self.speechSynthesizer speakUtterance:utt]; 
+0

Tuttavia, in questo modo si impedisce sostanzialmente che il parlato funzioni in background, il che non è ideale, specialmente per le app di fitness. AVSpeechSynth funziona correttamente in background fino alla chiamata telefonica, dopo di che le chiamate delegate di AVSpeechSynth non si verificano e non viene eseguita alcuna operazione. –

2
  1. È necessario impostare "Audio e AirPlay" in modalità background.
  2. È necessario configurare la sessione audio nel vostro AppDelegate:

    NSError *error = NULL; 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    [session setCategory:AVAudioSessionCategoryPlayback error:&error]; 
    if(error) { 
        // Do some error handling 
    } 
    [session setActive:YES error:&error]; 
    if (error) { 
        // Do some error handling 
    } 
    

(vedi questo post: https://stackoverflow.com/a/19200177/330067)

Problemi correlati