私はいくつかの重要なことをユーザーに警告できるアプリに取り組んでいます。ローカル通知を使用してユーザーに警告しています。 iOSでは、スマートフォンがバイブレーションになっていると通知が鳴りません。これはアプリの多くのユーザーにとって取り引きになりますが、アプリがバックグラウンドにある場合、iOSではアプリがサウンドを再生することを許可しないと思ったので、これまでこの質問を延期してきました。
音楽アプリは、オーディオバックグラウンドモードを有効にすることで、電話が振動しているときでも曲を再生できますが、特定の時間に曲を再生するようにスケジュールすることはできません。
最近、一部のアプリがバックグラウンドで実行されている場合でも、特定の時間にサウンドを再生できることがわかりました。そのようなアプリの1つは Alarmy アラームアプリです。通知をクリアした後も音楽は再生し続けるため、アラームが期限切れになったときにローカル通知を介して音楽を再生しているとは思わない。ローカル通知のドキュメントから、ユーザーが通知をクリックするまでローカル通知が起動すると、コードを実行できないことがわかりました。そのため、振動で音を再生できるオーディオプレーヤーを起動できません。
そのようなアプリは、電話がバイブレーション状態でiOSのバックグラウンドにある場合でも、どのようにしてサウンドを再生できますか?
この種類の機能を実装する方法はいくつかあります。参考までに、私は 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を使用すると、アプリがリモートコントロールオプション(ロック画面の再生/一時停止ボタンなど)を処理できるようになります。ユーザーが目覚めたら、アラームをミュートします。
これを行う方法(これをアプリに実装しました)は、AVAudioPlayerを起動し、再生する特定の時間を指定することです。そう:
アプリの機能でバックグラウンドオーディオを有効にします。
.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秒に制限されたり、リンガースイッチによって消音されたりしないため)。