web-dev-qa-db-ja.com

アプリがバックグラウンドにあり、電話が振動しているときに、Alarmyなどの一部のアラームアプリはiPhoneで音を再生できますか

私はいくつかの重要なことをユーザーに警告できるアプリに取り組んでいます。ローカル通知を使用してユーザーに警告しています。 iOSでは、スマートフォンがバイブレーションになっていると通知が鳴りません。これはアプリの多くのユーザーにとって取り引きになりますが、アプリがバックグラウンドにある場合、iOSではアプリがサウンドを再生することを許可しないと思ったので、これまでこの質問を延期してきました。

音楽アプリは、オーディオバックグラウンドモードを有効にすることで、電話が振動しているときでも曲を再生できますが、特定の時間に曲を再生するようにスケジュールすることはできません。

最近、一部のアプリがバックグラウンドで実行されている場合でも、特定の時間にサウンドを再生できることがわかりました。そのようなアプリの1つは Alarmy アラームアプリです。通知をクリアした後も音楽は再生し続けるため、アラームが期限切れになったときにローカル通知を介して音楽を再生しているとは思わない。ローカル通知のドキュメントから、ユーザーが通知をクリックするまでローカル通知が起動すると、コードを実行できないことがわかりました。そのため、振動で音を再生できるオーディオプレーヤーを起動できません。

そのようなアプリは、電話がバイブレーション状態でiOSのバックグラウンドにある場合でも、どのようにしてサウンドを再生できますか?

16
Varun Gupta

この種類の機能を実装する方法はいくつかあります。参考までに、私は this link。 をお勧めします

デバイスのリンガースイッチがバイブレーションに設定されているときに実際にサウンドを再生する場合

最初に、バックグラウンドでオーディオを再生するために、機能にオーディオバックグラウンドモードが含まれていることを確認してください。

そして、

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)")
}

ここでは、共有オーディオセッションのカテゴリをAVAudioSessionCategoryPlayAndRecordに設定します。これにより、デバイスのリンガースイッチをオンにしながらサウンドを再生できます。振動するように設定されています。

。duckOthersは、混合可能なオーディオが再生されている場合に他のオーディオを静かにするために指定されており、アラームを聞くことができます。別の動作が必要な場合は、それを省略するか、別のオプションを使用できます。

。defaultToSpeakerが指定されているため、音量がスピーカーに送られ、音量が大きくなり、ユーザーを簡単に目覚めさせることができます。

beginReceivingRemoteControlEventsを使用すると、アプリがリモートコントロールオプション(ロック画面の再生/一時停止ボタンなど)を処理できるようになります。ユーザーが目覚めたら、アラームをミュートします。

8
T. Pasichnyk

これを行う方法(これをアプリに実装しました)は、AVAudioPlayerを起動し、再生する特定の時間を指定することです。そう:

  1. アプリの機能でバックグラウンドオーディオを有効にします。

  2. .playbackモードでオーディオセッションを開始し、再生したいときにプレーヤーを開始します。

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

これはバックグラウンドで沈黙を演じ​​ないため、Appleのルールに違反します。実際にはプレーヤーを起動しますが、オーディオは適切なタイミングでのみ開始されます。音声をトリガーするのはリモート通知ではなく、ローカル通知によって再生される音声でもないため、これはおそらくAlarmyがアラームを実装した方法だと思います(30秒に制限されたり、リンガースイッチによって消音されたりしないため)。

1
Yariv Adam