2016-11-17 3 views
1

Ich arbeite an einer Übungs-App, die Sounds abspielen muss, wenn die App in den Hintergrund tritt und auch wenn der Bildschirm gesperrt ist. Ich muss auch Sounds anderer Apps zulassen (z. B. Musik) und gleichzeitig meine Soundeffekte durchlassen.Wie man Sounds in iOS 10 spielt, wenn App mit Swift 3 im Hintergrund ist

Ich hatte dies funktioniert in iOS 9 mit AVAudioSessionCategoryAmbient, aber sobald meine App inaktiv wird oder der Bildschirm gesperrt wird, hören die Sounds auf.

Hier ist eine vereinfachte Version von meinem Code in einer Demo-Anwendung:

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

var session: AVAudioSession = AVAudioSession.sharedInstance() 
var timer = Timer() 
let countdownSoundFile = "154953__keykrusher__microwave-beep" 
let countdownSoundExt = "wav" 
var audioPlayer = AVAudioPlayer() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    activateAudio() 

} 

func activateAudio() { 
     _ = try? session.setCategory(AVAudioSessionCategoryAmbient, with: []) 
     _ = try? session.setActive(true, with: []) 
} 

@IBAction func play() { 
    timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(ViewController.playSound), userInfo: nil, repeats: true) 
} 

func playSound() { 

    if let soundURL = Bundle.main.url(forResource: countdownSoundFile, withExtension: countdownSoundExt) { 
     do { 

      print("sound playing") 
      try audioPlayer = AVAudioPlayer(contentsOf: soundURL) 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 
     } catch { 
      print("no sound found") 
     } 
    } 

} 
} 

ich auch die Audio, Airplay, and Picture in Picture Fähigkeit in Hintergrund-Modi geprüft, welche den erforderlichen Hintergrundmodus zu meinem plist hinzugefügt.

Ich teste das auf einem Gerät, und sobald ich den Bildschirm sperren oder die Home-Taste drücke, hören meine Sounds auf, und sie werden fortgesetzt, sobald meine App wieder aktiv wird.

fand ich eine Abhilfe durch Verwendung:

var mySound: SystemSoundID = 0 
AudioServicesCreateSystemSoundID(soundURL as CFURL, &mySound) 
AudioServicesPlaySystemSound(mySound); 

aber das Volumen der Töne geändert werden nicht zulassen, und ich brauche auch AVSpeechSynthesizer zu verwenden, und diese Abhilfe für das nicht funktioniert .

Irgendwelche Ideen, was ich tun kann, damit dies funktioniert?

EDIT:

änderte ich die Kategorie Linie _ = try? session.setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers]) und dies ermöglicht es, Musik gespielt werden, während die App läuft, aber die Geräusche noch stoppen, wenn die Bildschirmsperre oder den Hintergrund übergeht. Ich brauche die Sounds, um in diesen Szenarien weiterzuspielen.

EDIT:

Wie die Antwort darauf hingewiesen, kann ich nicht Töne spielen, wenn meine app backgrounded, sondern _ = try? session.setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers]) mit Klängen zu spielen erlaubt, wenn der Bildschirm schaltet sich aus und mischt sich mit Klängen (Musik) aus anderen Anwendungen.

Antwort

3

Sie können nicht mit einer Ambient-Audiositzungskategorie im Hintergrund spielen. Ihre Kategorie muss Wiedergabe sein.

Um die Wiedergabe von Sounds aus anderen Apps zuzulassen, ändern Sie die Kategorie Playback mit der Option Mixable (.mixWithOthers).

(Denken Sie auch daran, dass Sie Ihre Kategorie jederzeit ändern können. Sie können die meiste Zeit Ambient haben, aber zur Wiedergabe wechseln, wenn Sie wissen, dass Sie in den Hintergrund treten, damit Sie sie behalten können spielen.)

BEARBEITEN Es kommt mir auch vor, dass es ein anderes mögliches Missverständnis gibt, das Aufräumen benötigen könnte. Sie können nicht (einfach) einen neuen Sound im Hintergrund starten. All das Hintergrund-Audio ermöglicht es Ihnen, zu tun ist weiterhin den aktuellen Sound spielen, wenn Ihre App in den Hintergrund geht. Sobald dieser Sound aufhört (im Hintergrund), wird Ihre App ausgesetzt und das ist das Ende.

+1

und müssen 'Hintergrund-Modi-Fähigkeiten' für Audio zu aktivieren. – iphonic

+0

@iphonic bitte lesen Sie die Frage. Er sagt, dass er das getan hat. Die Frage ist, warum das nicht ausreicht. – matt

+0

@matt Ich habe meine Frage mit einem Update bearbeitet: Ihr Vorschlag erlaubt Musik von einer anderen App zu spielen, während meine App Töne spielt, aber sobald der Bildschirm ausgeschaltet wird oder die App in den Hintergrund tritt, hört meine App auf zu hören. Irgendwelche Ideen? – OffensivelyBad

1

überprüfen Sie hier this answer im Detail. Sie müssen den Audiomodus auch über die App-Einstellungen aktivieren.

do { 
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers) 
print("AVAudioSession Category Playback OK") 
do { 
    try AVAudioSession.sharedInstance().setActive(true) 
    print("AVAudioSession is Active") 
} catch { 
    print(error) 
} 
} catch { 
print(error) 
} 
Verwandte Themen