How do I start playing audio when in silent mode &

2019-01-04 19:31发布

End-user process

  1. Open app
  2. Switch on 'Silent Mode'.
  3. Press 'Lock-button'
  4. App can still START playing a sound after hours have passed, not playing any audio in the interim.

Apps that do this

A lot of alarm apps have manage to do this & I dont think they are using silent audio to keep the app running as they do not sound if you actually exit the app with home.

  • Alarm Clock Pro
  • My Clock
  • Wave Alarm
  • Alarmed
  • iHome
  • ...

...Are they keeping a loop running after being locked some how or it a notification(which cant play sound in silent) starting the app back up to play the audio, or some other method?

Current Methods Implemented

AVAudioPlayer using:

AudioSessionInitialize(nil, nil, nil, nil);
AudioSessionSetActive(YES);

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory);

And setting Info.plist to:

Required background modes(UIBackGroundModes) - App plays audio (audio)

At Present

I can play audio even in silent when the app is running and on screen. If the audio is already running the app can be closed with home button and audio will run. BUT if the app is not playing audio, and the screen is locked, all threads are killed and audio is never played. How do theses apps manage to work around this?

Possible approaches Found So Far

A. Use 'beginBackgroundTaskWithExpirationHandler:' with an infinite loop to keep app running indefinitely.

Pros:

  • Looks like you can make this work in a lot of situations, even when the user presses home.

Cons:

  • This goes against apple policies as far as I can tell.
  • will use more resources

Comments:

I've almost got this to work and might with some tweaking. This does not seem to be what all these other alarms are doing as they do not keep on running if you press home BTN. Which suggest that they use some method that gives them permission to run while locked but not in the BG. (Which is what I need)

Also, When you ask how much time you have left running you get aprox 10 min. By dropping an infinite loop in there the numbers will actually run down to 0 and then go into the negatives for hours on end.(tested) Im not sure how this would behave in the real world or in terms of app acceptance.

B. Use a silent audio loop to pose as a continus audio playing media center

Pros:

  • Worked when locked, and will keep up running in most situations.

Cons:

  • Can fail if interrupted by another media center and in some other occasions.
  • Can also go agains apple policy.

Comments:

This can work I a lot of situations but is by far not ideal. And since Like I say again, there has to be another method that is not documented.

Conclussions Thus Far

Testing with the listed APPs suggests that they are not using any of the two methods I just described. Method 'A' seems to be closer but if implemented would not behave how these apps behave.

I used a apple developer ticket to get more info, I'll post any new findings along those means as well.

Thank You

Any insight is appreciated, and for your participation thus far.

8条回答
你好瞎i
2楼-- · 2019-01-04 19:59

Look into SystemSoundID; their audio plays at the volume of the "Ringer and Alerts" slider in Settings>Sounds despite the volume set by volume buttons and silent mode.

查看更多
够拽才男人
3楼-- · 2019-01-04 20:01

I notice that these apps are very clear about their requirements. They won't work unless (1) the user permits local notification alerts for this app, in Settings > Notifications, and (2) the app is frontmost when the user locks the screen (e.g., they won't work if the user clicks the Home button to quit the app and then locks the screen).

Therefore it's probably a combination of a local notification and a silent sound playing in the background. The silent sound means that when the screen is locked, if the app was frontmost, it is not suspended. The local notification is thus sent to the app itself and the app is able to respond by producing the alarm sound. Or perhaps there's no silent sound and the alarm sound you're hearing is just the custom sound attached to the local notification (but if so, then it isn't clear to me why the app would require to be frontmost when the screen is locked).

Also, though I haven't tested this, behaviour of the silent switch on the iPhone may have changed in 5.1 in response to the Mahler incident (http://www.nytimes.com/2012/01/13/nyregion/ringing-finally-stopped-but-concertgoers-alarm-persists.html). This would explain why developers are commenting that they could do this until 5.1.

查看更多
登录 后发表回答