web-dev-qa-db-fra.com

Comment certaines applications d'alarme telles que Alarmy peuvent-elles jouer un son sur iPhone lorsque l'application est en arrière-plan et que le téléphone est en vibration

Je travaille sur une application qui peut alerter les utilisateurs de certaines choses critiques. J'utilise des notifications locales pour alerter l'utilisateur. Sur iOS, je constate que les notifications ne sonneront pas si le téléphone est en marche. C'est une rupture pour de nombreux utilisateurs de l'application, mais je pose cette question jusqu'à présent depuis que je pensais qu'iOS ne permet pas à une application de jouer un son si l'application est en arrière-plan.

Les applications musicales sont capables de lire des chansons même lorsque le téléphone est en mode vibreur en activant le mode d'arrière-plan audio, mais cela ne vous permet pas de planifier la lecture d'une chanson à un certain moment.

Dernièrement, j'ai vu que certaines applications sont capables de jouer un son à un certain moment, même si l'application est en arrière-plan. Une de ces applications est Alarmy application d'alarme. Je ne pense pas qu'ils lisent la musique via la notification locale lorsque l'alarme expire, car la musique continue de jouer même après avoir effacé la notification. D'après la documentation de notification locale, j'ai compris que je ne pouvais pas exécuter de code lorsque la notification locale se déclenche jusqu'à ce que l'utilisateur clique sur la notification. Donc, je ne peux pas démarrer un lecteur audio qui peut lire le son en vibration.

Comment ces applications peuvent-elles jouer un son même si le téléphone est en vibration et que l'application est en arrière-plan dans iOS?

16
Varun Gupta

Il existe peu de méthodes pour implémenter ce type de fonctionnalité.Pour référence, je recommande ce lien.

Pour jouer réellement le son pendant que l'interrupteur de sonnerie de l'appareil est réglé pour vibrer

Tout d'abord, assurez-vous d'inclure le mode d'arrière-plan audio dans les capacités, afin de lire l'audio en arrière-plan.

Ensuite,

Swift 4

do {
  try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.duckOthers, .defaultToSpeaker])
  try AVAudioSession.sharedInstance().setActive(true)
  UIApplication.shared.beginReceivingRemoteControlEvents()
} catch {
  NSLog("Audio Session error: \(error)")
}

Ici, nous définissons la catégorie de la session audio partagée sur AVAudioSessionCategoryPlayAndRecord , afin que nous puissions lire le son, tandis que le commutateur de sonnerie de l'appareil est réglé pour vibrer.

Le . DuckOthers est spécifié pour rendre les autres sons plus silencieux, s'il y a du son mixable, afin que notre alarme puisse être entendue. Vous pouvez laisser cela de côté ou utiliser une autre option, si vous préférez un comportement différent.

Le . DefaultToSpeaker est spécifié, de sorte que le volume irait au haut-parleur, où il sera beaucoup plus fort et devrait réveiller notre utilisateur avec facilité.

beginReceivingRemoteControlEvents permet à l'application de gérer les options de la télécommande, comme les boutons de lecture/pause sur l'écran de verrouillage, afin de faciliter la tâche de notre l'utilisateur pour désactiver son alarme, une fois qu'il se réveille.

8
T. Pasichnyk

La façon dont cela peut être fait (je l'ai implémenté dans mon application) consiste à démarrer un AVAudioPlayer et à spécifier une heure spécifique pour jouer. Alors:

  1. Activez l'audio d'arrière-plan dans les capacités de l'application.

  2. Démarrez une session audio avec le mode .playback et démarrez un lecteur au moment où vous le souhaitez:

    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 {
        ...
        }
    

Cela ne joue pas le silence en arrière-plan, ce qui viole les règles d'Apple. Cela démarre le lecteur, mais l'audio ne démarre qu'au bon moment. Je pense que c'est probablement la façon dont Alarmy a implémenté leur alarme, étant donné que ce n'est pas une notification à distance qui déclenche l'audio ni l'audio joué par une notification locale (car elle n'est pas limitée à 30 secondes ou réduite au silence par l'interrupteur de sonnerie).

1
Yariv Adam