background-playback.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import {
  2. isBackgroundPlaybackEnabled,
  3. setBackgroundPlaybackEnabled
  4. } from '@/features/feed/background-playback-settings'
  5. export { isBackgroundPlaybackEnabled, setBackgroundPlaybackEnabled }
  6. let appInBackground = false
  7. export function markAppInBackground(value) {
  8. appInBackground = !!value
  9. }
  10. export function isAppInBackground() {
  11. return appInBackground
  12. }
  13. /** 页面 onHide 时是否应保持 Feed 播放(仅 App 切后台且开关开启) */
  14. export function shouldKeepFeedPlaybackOnPageHide() {
  15. return appInBackground && isBackgroundPlaybackEnabled()
  16. }
  17. export function applyBackgroundPlaybackSession(active) {
  18. // #ifdef APP-PLUS
  19. if (!active) {
  20. resetIosPlaybackSession()
  21. return
  22. }
  23. if (!isBackgroundPlaybackEnabled()) return
  24. try {
  25. const os = String(plus.os.name || '').toLowerCase()
  26. if (os === 'ios') {
  27. enableIosPlaybackSession()
  28. }
  29. } catch (e) {
  30. console.warn('[background-playback] apply session', e)
  31. }
  32. // #endif
  33. }
  34. // #ifdef APP-PLUS
  35. function enableIosPlaybackSession() {
  36. const AVAudioSession = plus.ios.import('AVAudioSession')
  37. const session = AVAudioSession.sharedInstance()
  38. try {
  39. session.setCategory('AVAudioSessionCategoryPlayback', null)
  40. session.setActive(true, null)
  41. } finally {
  42. plus.ios.deleteObject(session)
  43. plus.ios.deleteObject(AVAudioSession)
  44. }
  45. }
  46. function resetIosPlaybackSession() {
  47. const AVAudioSession = plus.ios.import('AVAudioSession')
  48. const session = AVAudioSession.sharedInstance()
  49. try {
  50. session.setActive(false, null)
  51. } catch (_) {
  52. } finally {
  53. plus.ios.deleteObject(session)
  54. plus.ios.deleteObject(AVAudioSession)
  55. }
  56. }
  57. // #endif