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

时间:2016-11-29 20:47:12

标签: ios iphone permissions uikit

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

我刚买了一块瓷砖并发现它can ring your phone even on silent。我已经测试了它,它可以在iOS 9中运行,但我不确定如何复制这种行为。

如何在无声模式下完成iPhone的铃声?后台刷新?动议和活动?还有别的吗?

现有技术:

  • this answer以静音模式播放,但在应用关闭时无法解决。相同的here

2 个答案:

答案 0 :(得分:7)

首先,为了在后台播放声音,您的应用程序必须能够在后台启动响应回调事件的相关代码。如here所示,只允许特定的应用程序类型在后台响应回调事件。例如,“ Tile”应用程序可以在后台播放声音,以响应与BLE相关的回调事件,该事件在应用程序处于后台时触发(例如BLE外围设备连接和断开连接)。相反,当应用程序进入后台时,一个简单的计时器将被挂起,因此不会触发计时器过期回调,并且在这种情况下无法启动任何代码来播放声音。 (您可以阅读here以获得一些详细信息以及在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和画中画”功能在“ 背景模式”部分中。

XCode, Capabilities tab

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

警告:按照这种方法,声音将以手机中设置的当前音量播放,因此,如果音量等于零,则不会播放声音。您可以通过编程in this way将音量调整为给定值:

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

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

答案 1 :(得分:2)

首先,我认为我们需要清理一些事情(如果我错了,请纠正我):

  1. 您正在安排计时器到期时的本地通知
  2. 您的应用程序根本不在后台运行
  3. 即使电话处于静音状态,您也希望本地通知播放声音。

我实际上不确定这是否可行,您提到了Tile应用程序,重要的区别是Tile应用程序实际上确实在应用程序无法运行的后台运行。

Apple定义了允许在后台运行的特定用例。这些允许的模式之一是与Bluetooth LE设备通信。因此,有效的方法是iPhone识别图块设备,并向该图块应用发送通知,此时该应用实际上正在执行。进一步了解后台执行here

我不认为您可以使用任何已批准的背景模式来实现可解决此问题的解决方案。

我的建议是,当用户在您的应用中设置计时器时,请检查手机是否处于静音状态(请参阅here),如果是,请提醒用户该应用不会播放声音计时器完成时。

还下载其他一些计时器应用程序,并查看它们如何处理。