How are some alarm apps such as Alarmy able to play a sound on iPhone when the app is in the background and the phone is on vibrate

前端 未结 2 1654
南旧
南旧 2021-02-12 17:34

I am working on app that can alert users for some critical things. I use local notifications to alert the user. On iOS, I find that the notifications will not ring if the phone

2条回答
  •  臣服心动
    2021-02-12 18:20

    The way this can be done (I have implemented this in my app) is by starting an AVAudioPlayer and specifying a specific time to play. So:

    1. Enable background audio in the app capabilities.

    2. Start and audio session with .playback mode, and start a player at the time you like it to play:

      do {
            //set up audio session
            try AVAudioSession.sharedInstance().setCategory(.playback, options: [.defaultToSpeaker, .duckOthers])
            try AVAudioSession.sharedInstance().setActive(true)
      
            //Start AVAudioPlayer
            player.play(at: time) //time is a TimeInterval after which the audio will start
          }
          catch {
          ...
          }
      

    This does not play silence in the background, which violates Apple's rules. It actually starts the player, but the audio will only start at the right time. I think this is probably how Alarmy implemented their alarm, given that it's not a remote notification that triggers the audio nor is the audio played by a local notification (as its not limited to 30 seconds or silenced by the ringer switch).

提交回复
热议问题