当手机处于静音模式时,在后台应用程序上播放声音

2024-04-13

我已经构建了一个计时器应用程序,我遇到的一个问题是当它处于后台时,如果用户关闭音量,我无法敲响计时器。关闭音量或声音也会使通知静音,这是我在后台敲响计时器的方法。

我刚买了一块瓷砖,发现了它即使在静音状态下也可以让您的手机响铃 https://support.thetileapp.com/hc/en-us/articles/207274527-Use-Tile-to-Ring-your-Phone。我已经对此进行了测试,它可以在 iOS 9 中运行,但我不确定如何复制此行为。

iPhone静音模式下响铃是如何实现的?后台刷新?运动和活动?还有别的事吗?

现有技术:

  • 这个答案 https://stackoverflow.com/questions/10322040/how-to-play-a-sound-using-avaudioplayer-when-in-silent-mode-in-iphone以静音模式播放,但在应用程序关闭时不处理。相同的here https://stackoverflow.com/questions/3740528/play-sound-on-iphone-even-in-silent-mode

首先,为了在后台播放声音,您的应用程序必须能够在后台启动响应回调事件的相关代码。仅允许特定的应用程序类型在后台响应回调事件。例如,“Tile”应用程序可以在后台播放声音,以响应当应用程序处于后台时触发的 BLE 相关回调事件(例如,BLE 外围设备连接和断开连接)。相反,当应用程序进入后台时,简单的计时器会被挂起,因此计时器到期回调不会被触发,并且在这种情况下无法启动任何代码来播放声音。 (你可以阅读here https://oleb.net/blog/2014/02/alarm-clock-apps-ios/了解一些细节以及在 iOS 中构建闹钟的可能方法)

如果您的应用程序类型属于特殊后台模式应用程序集,则即使手机处于静音模式,您也可以使用 AVAudioPlayer 播放响应后台事件的声音。在视图控制器中导入 AVFoundation 框架:

import AVFoundation

比声明一个 AVAudioPlayer 变量

var player: AVAudioPlayer?;

为了播放应用程序包中的 mp3 文件:

    func playSound() {
    
        guard let url = Bundle.main.url(forResource: "MY_MP3_FILE", withExtension: "mp3") else {
            print("error");
            return;
        }
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.mixWithOthers);
            player = try AVAudioPlayer(contentsOf: url);
            guard let player = player else {
                print("error");
                return;
            }
            player.play();
        } catch let error {
            print(error.localizedDescription);
        }
    }

重要的:在 Xcode 中的“能力“选项卡,您还必须启用”音频、AirPlay 和画中画“ 特征在 ”背景模式“ 部分。

(Swift 4 解决方案在 iOS 11 和 12 中使用不同的 iPhone 型号进行了测试)。

Warning:按照此方法,声音将以手机中设置的当前音量播放,因此如果音量等于零,则不会播放声音。您可以通过编程将音量强制设置为给定值这样 https://stackoverflow.com/a/50740234/2610888:

    let volumeView = MPVolumeView();
    if let view = volumeView.subviews.first as? UISlider{
        
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
            view.value = 0.5; //Set the volume level between 0 and 1
        }
    }

但是,请考虑到这种方法会显示系统音量条,可能会导致不良的用户体验。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当手机处于静音模式时,在后台应用程序上播放声音 的相关文章

随机推荐