iOS how to don't stop music when the app start launching - objective-c

I've noticed that when my app start, the music I'm listening is automatically stopped, and I've noticed that when I start some other apps, the music just continue... this means that I don't know how to manage the actual playing music in the device to let it plays or stop.
I'm developing a game with obj-c and cocos2d btw, I've searched but sadly I've found nothing... so here's my question, how can I let the music I'm listening with my device continue to play even if I start the app ?
edit: I'm using SimpleAudioEngine to start a background music and some sound effects in my app

Place this line in your application:didFinishLaunchingWithOptions: method of your AppDelegate or in general before using the audio player.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
According to the documentation, the AVAudioSessionCategoryAmbient category is
for an app in which sound playback is nonprimary—that is, your app can
be used successfully with the sound turned off.
This category is also appropriate for “play along” style apps, such as a virtual piano that a user plays over iPod audio. When you
use this category, audio from other apps mixes with your audio. Your
audio is silenced by screen locking and by the Silent switch (called
the Ring/Silent switch on iPhone).
please import AVFoundation/AVFoundation.h

Swift:
Before playing enter this line:
let audioSession = AVAudioSession.sharedInstance()
if audioSession.otherAudioPlaying {
_ = try? audioSession.setCategory(AVAudioSessionCategoryAmbient, withOptions: AVAudioSessionCategoryOptions.MixWithOthers)
}

For people looking to solve this within react native (iOS)
My problem was quite the opposite where some of our muted videos with no music was causing background sound to be paused from other apps for no reason.
To fix this, also pass ignoreSilentSwitch="obey" prop alongside disableFocus and muted props through your Video component.

According to the docs:
You can activate the audio session at any time after setting its category, but it’s generally preferable to defer this call until your app begins audio playback. Deferring the call ensures that you won’t prematurely interrupt any other background audio that may be in progress.
Be sure not to be starting the audio session directly via its setActive method or indirectly via AVAudioEngine or other playback engine(s) immediately after the app launches. You should set only the category at this stage if you don't want your app to interrupt others on launch. If you're using AVAudioEngine, defer setting up the engine or connecting anything to the engine's mainMixerNode or outputNode until you actually need to start playing something.

When your app starts playing music, it will pause any audio currently playing. For obvious reasons. If you want your music to carry on playing when the app launches then don't let the app play any music.

Related

Stop background sound if Sound id played from react native app

I have video player in my app, which is working fine. But there is one problem when I play the video , if there is another sound playing in the background , it keeps on playing. The ideal scenario should be that background sound should stop playing and when I pause video then background sound should start playing again. I don't know how to handle such scenarios. Any help would be appreciated
On iOS you can use AVAudioSessionCategoryAmbient to set how should sounds mix. Here is the list for possible options. Here and Here are the methods for react-native-sound for how you can set.
Sound.setCategory(value, mixWithOthers)
value {string} Sets AVAudioSession category, which allows playing
sound in background, stop sound playback when phone is locked, etc.
Parameter options: "Ambient", "SoloAmbient", "Playback", "Record",
"PlayAndRecord", "AudioProcessing", "MultiRoute".
Sound.setMode(value)
value {string} Sets AVAudioSession mode, which works in conjunction
with the category to determine audio mixing behavior. Parameter
options: "Default", "VoiceChat", "VideoChat", "GameChat",
"VideoRecording", "Measurement", "MoviePlayback", "SpokenAudio".
This should be called in conjunction with Sound.setCategory.

how to keep ios app using opentok video chat in foreground

I've integrated opentok ios sdk in my iOS 7 app, it is working fine, except this problem:
During video chat if I don't access iPhone for 5-10 seconds..then my app moves into background, causing viewer at other end to hear only audio. Video is disabled after app goes to background state.
I've observed same thing with their official example
https://github.com/opentok/opentok-ios-sdk/tree/master/samples/OpenTokFullTutorial
How can I avoid my app going to background while video chat is ongoing. Skype is working fine in this case, I want to achieve same thing.
What you want to do is prevent the iPhone from going to sleep. To do this, you cant try this:
[UIApplication sharedApplication].idleTimerDisabled = YES;
Here is iOS documentation on idleTimerDisabled
If you don't want the app going into background at all (like when the user taps on home button), you can opt to kill the app when it's not running instead of having it run in the background. To do that, check out iOS guide on opting out of background execution
If you do not want your app to run in the background at all, you can
explicitly opt out of background by adding the
UIApplicationExitsOnSuspend key (with the value YES) to your app’s
Info.plist file. When an app opts out, it cycles between the
not-running, inactive, and active states and never enters the
background or suspended states. When the user presses the Home button
to quit the app, the applicationWillTerminate: method of the app
delegate is called and the app has approximately 5 seconds to clean up
and exit before it is terminated and moved back to the not-running
state.
Hope that helped!

How can I prevent my application (using AVPlayer) is muted when the ringtone is muted?

The topic may sound strange, but please keep reading on.
I am using AVPlayer to play some sound from the iPod library and everything works fine when using it with headphones plugged in, but when I want to use the app to play from the built in speakers there is no sound output. (The time counter and everything else in the application is still working like there would be sound output. Like it is just muted.)
I checked the volume and the mute lock and then found out that the ringtone was muted. But ringtone muting doesn't affect other applications like the iPod app itself or the Spotify music app.
How can I prevent my application (using AVPlayer) is muted when the ringtone is muted and behave like other music player apps?
You should set your app's audio session to AVAudioSessionCategoryPlayback. From the docs:
Use this category for an
application whose audio playback is of primary importance. Your audio
plays even with the screen locked and with the Ring/Silent switch set
to silent.

background app listen to audio input

Our app knows how to listen to the audio input. Can I open the app in the background (multi-tasking) and still get it to work as if it is open? Or can my app stay in the background and still get audio inputs,and output audio sounds? How i do that?
Set your AudioSessionCategory as AVAudioSessionCategoryRecord. The docs explain here that this category will allow you to record audio input even when the app is in the background. This will allow you to listen to the device input in an AudioQueue recording callback function. However, when this is occurring in the background, the status bar is tinted red by the system to alert the user that a backgrounded app is listening (and possibly recording) device input.
The phone is only allowed to do a few things in the background, like play sounds, and monitor location.
My guess is that this won't work, or if it does, it will be rejected by apple.
You may be able to get it working by playing a sound in the background and using that to keep the app alive to listen to the input. I'm not sure if this will work.

OverrideCategoryDefaultToSpeaker not responding with iPod Touch

A little background:
I am working on an iOS app which does audio recording and makes use of the audio session category AVAudioSessionCategoryPlayAndRecord. The app also plays sound effects which I want to play through the device's main speaker (while the user is not recording). In order stop output audio from playing through the main speakers while recording I use the following code snippet:
UInt32 defaultRoute = 1;
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
sizeof (defaultRoute),
&defaultRoute);
When the user starts recording I run the same code again with a defaultRoute of 0 which causes output audio to stop being played through the speakers and therefore not included in the recording. This method has been working fine on the iPhone.
The Issue:
When I run the same code on an iPod Touch (4th generation), the kAudioSessionProperty_OverrideCategoryDefaultToSpeaker property does not seem to have any affect. The result is that while a user is recording audio on their iPod Touch, sound effects will still play through the speaker and are included in the recording.
Does anyone know why this is happening, or how to fix it? I want to the behaviour on the iPod Touch to match the behaviour on the iPhone: output audio does not play through the main speakers while recording.
Note:
The closest to a solution that I have gotten is detecting if the device is an iPod Touch and if it is, mute system audio when recording starts using the following code snippet:
[MPMusicPlayerController iPodMusicPlayer].volume = 0.0;
This was not a desirable solution as when this code is executed, the volume overlay view pops up showing that the volume was turned down. This adds confusion to the UI and is not a good enough solution.
Any help would be appreciated!