如何创建一个在后台正常运行的iOS闹钟

Fra*_*rre 7 alarm avaudioplayer ios avaudiosession swift

我想在我正在开发的iOS应用程序中插入闹钟功能,作为参考,我安装了一个名为“Alarmy”的流行应用程序。

我设法让我的应用程序在后台运行,仅使用 AVAudioSession 属性;但是,我注意到该应用程序在手机睡眠期间会消耗大量电池。

经过一些测试,我认为这是由于应用程序在 AVAudioSession 激活后立即激活扬声器(并保持打开状态)所致。

即使在触发audioPlayer.play(atTime:audioPlayer.deviceCurrentTime + Double(秒))之前没有实际的声音播放,如果我非常靠近我的iPhone 7扬声器,我可以听到轻微的嗡嗡声,这表明扬声器已打开。这意味着扬声器实际上正在播放“空声音”。

当我用Alarmy设置闹钟时,就不存在这种嗡嗡声了;它只是在应该播放的时候开始播放。

我没有找到任何其他方法来在后台维护我的应用程序并在指定时间播放闹钟声音。当然,有本地通知,但它们不允许在手机静音时播放声音。

回到“警报”,我发现他们不仅能够播放背景警报而无需先激活扬声器,而且还能够将后台音量调到最大。他们是否可能触发其他一些 iOS 后台模式来实现这些目标,也许以某种巧妙的方式使用后台获取或处理?有没有已知的方法可以复制这些行为?

提前致谢!

这是我用来设置闹钟的当前代码:

private func setNewAlarm(audioPlayer: AVAudioPlayer, seconds: Int, ringtone: String) {

        do {

            self.setNotificationAlarm(audioPlayer: audioPlayer, seconds: seconds, ringtone: ringtone, result: result) 
            //This calls the method I use to set a secondary alarm using local notifications, just in case the user closes the app

            try AVAudioSession.sharedInstance().setActive(false)
            try AVAudioSession.sharedInstance().setCategory(.playback, options: [ .mixWithOthers])
            try AVAudioSession.sharedInstance().setActive(true)

        } catch let error as NSError {
            print("AVAudioSession error: \(error.localizedDescription)")
        }

        audioPlayer.prepareToPlay()

        audioPlayer.play(atTime: audioPlayer.deviceCurrentTime + Double(seconds))

        result(true)

    }
Run Code Online (Sandbox Code Playgroud)