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.
und müssen 'Hintergrund-Modi-Fähigkeiten' für Audio zu aktivieren. – iphonic
@iphonic bitte lesen Sie die Frage. Er sagt, dass er das getan hat. Die Frage ist, warum das nicht ausreicht. – matt
@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