I have an app that uses CoreBluetooth
background modes. When a certain event happens I need to play an alarm sound. Everything works fine in the foreground and all bluetooth functionality works fine in the background. I also have it working where it schedules UILocalNotification
's in the background to sound the alarm, however I don't like the lack of volume control with these so want to play the alarm sound using AVAudioPlayer.
I've added the background mode audio
to my .plist
file but can't get the sound to play properly.
I am using a singleton class for the alarm and initialise the sound like this:
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:soundName
ofType:@"caf"]];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
player.numberOfLoops = -1;
[player setVolume:1.0];
I start the sound like this:
-(void)startAlert
{
playing = YES;
[player play];
if (vibrate)
[self vibratePattern];
}
and use this for the vibration:
-(void)vibratePattern
{
if (vibrate && playing) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
[self performSelector:@selector(vibratePattern) withObject:nil afterDelay:0.75];
}
}
The vibration works fine in the background, but no sound.
If I use Systemsound
to play the sound like this, it plays fine (But no volume control):
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &_sound);
AudioServicesPlaySystemSound(_sound);
So what could be the reason why the AVAudioPlayer is not playing the sound file?
Thanks
EDIT -------
The sound will play if it's already playing when the app is backgrounded. However making it start to play whilst backgrounded is not working.
Apart from
plist
settings you have to modify app delegate.Also in your
controller
write the following code.This (hopefully) may be as simple as retaining the audio. If you could check where you have set the player property that it is strong.
I hope this helps,
Cheers, Jim
add a key named Required background modes in property list (.plist) file ..
as following picture..
may you get help..
and add following code in
AppDelegate.h
AppDelegate.m
in application didFinishLaunchingWithOptions
If you want changes as per events you have to add following code in AppDelegate.m
based on notification have to work on it..
code.tutsplus.com provides a tutorial.
for HandsetBluetooth you have to add following code in AppDelegate
Maybe you should make your app's audio session higher than others.
Besides the process to setting background mode, you must set AudioSession correctly.
Sometimes just doing this is not enough
because in Help document there is a discussion about setActive
So, setActive:withOptions:error: is needed. Just like this
That is you must make your app's audio session higher than others.
By default,
AVAudioPlayer
uses theAVAudioSessionCategorySoloAmbient
category, which is silenced by the ringer switch. TheAVAudioSessionCategoryPlayback
category is more appropriate for your situation, since it is not silenced by the switch, and will continue to play in the background: