Swift - Audio Playback
TODO
Links[Bearbeiten]
Swift (Programmiersprache) Swift - Play a Sound
Einführung[Bearbeiten]
Es gibt untschiedliche Möglichkeiten Audio abzuspielen je nachdem was man möchte.
Jede Möglichkeit ist unterschiedlich aufwändig. Es gibt außerdem Klassen um den Systemmixer zu steuern oder das Verhalten wenn die App in den Hintergrund geht zu beeinflussen.
Glossar[Bearbeiten]
AVFoundation[Bearbeiten]
AVAudioSession[Bearbeiten]
AVAudioSession ist ein Singleton-Objekt, das die Audio-Sitzung für Ihre App verwaltet. Es ist verantwortlich für die Konfiguration der Audio-Routen, wie dem Ausgabegerät (z.B. Lautsprecher oder Headset) und für die Verwaltung des Zustands der Audio-Sitzung (z.B. aktiv oder inaktiv). AVAudioSession bietet auch Methoden zur Steuerung der Eigenschaften der Audio-Sitzung, wie der Lautstärke und der Audio-Kategorie.
AVAudioPlayerNode[Bearbeiten]
AVAudioPlayerNode wird verwendet, um Audio-Puffer und -Dateien innerhalb eines AVAudioEngine-Graphen abzuspielen. Es kann verwendet werden, um das Abspielen von Audio-Puffern und -Dateien zu planen, die Wiedergabegeschwindigkeit, den Pan und die Lautstärke zu ändern und einen Rückruf bereitzustellen, wenn die Wiedergabe abgeschlossen ist.
Zusammengefasst wird AVAudioSession verwendet, um die Gesamt-Audio-Sitzung für Ihre App zu konfigurieren, während AVAudioPlayerNode verwendet wird, um spezifische Audio-Puffer und -Dateien innerhalb dieser Sitzung abzuspielen.
Audio im Hintergrund abspielen[Bearbeiten]
App für Hintergrundplayback konfigurieren
In Info.plist
...
<plist version="1.0">
<dict>
...
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
</dict>
</plist>
Mit AVAudioPlayer[Bearbeiten]
Wenn du die AVAudioPlayer Klasse nutzt stelle die numberOfLoops property to -1 so that the audio will play indefinitely.
audioPlayer.numberOfLoops = -1
audioPlayer.play()
Außerdem mußt du in der AVAudioSession die korrekte Kategorie setzen. Die Kategorie legt z.B. fest wie mit welcher Priorität Background Audio behandelt wird, falls ein Anfruf reinkommt etc.
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
Es gibt außerdem auch eine maximale Dauer die das System für Background Audio erlaubt. Die genaue Zeit hängt von verschiedenen Faktoren ab. Unter anderem welche Ressourcen die App benötigt und auf welche Art Audio abgespielt wird. Wenn die App vom System beendet wird ist natürlich Schluss mit Ton.
Mit AVAudioEngine[Bearbeiten]
Hier ist das Vorgehen ähnlich - auch hier musst du die AVAudioSession richtig konfigurieren:
// Audio session should play in background
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.playback)
// try AVAudioSession.sharedInstance().setActive(true) // neeeded?
} catch {
print("Setting category to AVAudioSessionCategory .playback failed.")
}
Evtl. muss man die Session noch aktivieren. Aber bei meinen Tests war das nicht nötig. Sie wurde automatisch (wahrscheinlich über die AudioEngine) aktiviert (siehe Kommentar im Code.
Allgemeine Tipps für Apps im Background[Bearbeiten]
However, you can help the system to save energy by following some best practices:
Minimize the use of location services, push notifications, and background tasks when your app is not in use. Use the beginBackgroundTaskWithExpirationHandler method to execute any critical tasks before your app is suspended. Avoid using CPU-intensive tasks when your app is in the background, as this can drain the battery. When your app is not in use, release any resources that are not needed, such as images and sounds.
By following these practices, your app will be less likely to consume excessive power and will provide a better user experience by not draining the battery.
It is also possible to suggest to the user to close the app when it's not in use, or to use low power mode in the settings.
Keep in mind that, as a developer, you don't have the power to force the app to go to background or to shut down, but by following best practices you can help the system to save energy.