Detect Silent Mode in iOS 7

Detect silent mode in iOS 7

Check this thread - Detecting the iPhone's Ring / Silent / Mute switch using AVAudioPlayer not working?

And this API - SoundSwitch

How it works:

  • Play an audio file of 0.5 secs, every sec (after completion..)
  • Check how long it took to play the sound
  • Callback called real fast? nothing was played (silent switch is ON)

Enjoy!

How can I detect whether an iOS device is in silent mode or not?

I don't think there is and you probably don't need to directly call an API to detect if the device is muted or not. What you need to know is this:

When playing a sound, you will do something like:

        try AVAudioSession.sharedInstance().setCategory({AVAudioSessionCategory})
try AVAudioSession.sharedInstance().setActive(true)
audioPlayer = try AVAudioPlayer(contentsOfURL: alertSound)
audioPlayer.prepareToPlay()
audioPlayer.play()

In the {AVAudioSessionCategory}, you can specify:

AVAudioSessionCategorySoloAmbient: Your audio is silenced by screen
locking and by the Silent switch

AVAudioSessionCategoryPlayBack: Your Audio continues with the Silent
switch set to silent or when the screen locks

Detecting the iPhone's Ring / Silent / Mute switch using AVAudioPlayer not working?

I went through this VSSilentSwitch library.

Didn't work for me (doesn't work when you start actually using audio).

I was thinking on how he did it, and then realised that the audio completion call is being called almost as soon as the sound begins playing when we're silent.

To be a bit more specific:

System sounds being played using AudioServicesPlaySystemSound will complete playback as soon as it started.

Of course, this will only work on audio categories that respect the silent switch (the default AVAudioSessionCategoryAmbient respects it).

So the trick is to create a system sound, preferably of a silent sound, and keep playing it over and over again, while checking the time it took from playback to completion (install a completion procedure using AudioServicesAddSystemSoundCompletion).

If the completion proc is called very soon (allow some threshold) - it means the silent switch is on.

This trick has many caveats, the biggest one being the fact that it won't work on all audio categories.

If your app plays audio in the background - make sure you stop this test while in the background or your app will run forever in the background (and will be rejected by apple, too).



Related Topics



Leave a reply



Submit