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 switchAVAudioSessionCategoryPlayBack: 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
How to Tap on a Specific Point Using Xcode Uitests
Can't Cast Value of Type Uiviewcontroller to Patterndetailviewcontroller
Switch Universal App to iPhone Only App
Programmatically Go Back to Previous Viewcontroller in Swift
Delete Specified File from Document Directory
How to Find Out Distance Between Coordinates
Drawviewhierarchyinrect:Afterscreenupdates: Delays Other Animations
iPhone X How to Handle View Controller Inputaccessoryview
Mfmailcomposeviewcontroller in iOS 7 Statusbar Are Black
Fbsdkloginmanager Loginwithpublishpermissions Always Returns Iscancelled=Yes
Memory Leak Every Time Uiscrollview Is Released
Run iPhone as an Ibeacon in the Background
iOS 11 Safe Area Layout Guide Backwards Compatibility
iOS - Ensure Execution on Main Thread
Styling the Cancel Button in a Uisearchbar
How to Add a Button with Click Event on Uitableviewcell in Swift