gpt4 book ai didi

ios - 应用程序在后台时本地通知声音不播放 - Swift

转载 作者:行者123 更新时间:2023-12-04 11:48:13 66 4
gpt4 key购买 nike

我正在制作一个闹钟应用程序,并且我已经确认我的闹钟通知被正确触发,但声音并不总是像我预期的那样播放。
例如,当手机未处于静音模式时,通知会成功播放声音(好的,太好了!)。但是,当手机处于静音模式时,声音不会播放,即使应用程序仍在后台运行 (不太好...)。
我知道静音模式应该使所有通知声音静音,但我已经从 App Store 下载了其他闹钟应用程序(如 Alarmy),即使手机处于静音状态,他们也能以某种方式播放通知声音模式,只要应用程序仍在后台运行。只有当应用程序完全退出时,静音模式才会生效。
有谁知道如何达到这个结果?我需要在我的代码或 plist 文件中声明一些设置或选项吗?我已经搜索了互联网,但没有找到任何关于这个特定问题的信息......
我设置 AVAudioSession 类别的代码:

private func setAudioCategory() {
do {
// Enable sound (even while in silent mode) as long as app is in foreground.
try AVAudioSession.sharedInstance().setCategory(.playback)
}
catch {
print(error.localizedDescription)
}
}
我设置通知的代码:
/// Sets a local user notification for the provided `Alarm` object.
static func set(_ alarm: Alarm) {

// Configure the notification's content.
let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationString(forKey: K.Keys.notificationTitle, arguments: nil)
content.body = NSString.localizedUserNotificationString(forKey: K.Keys.notificationBody, arguments: nil)

// Get sound name
let soundName: String = UserDefaultsManager.getAlarmSound().fileNameFull

// Set sound
content.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: soundName))
content.categoryIdentifier = "Alarm"

// Configure the time the notification should occur.
var date = DateComponents()
date.hour = alarm.hour
date.minute = alarm.minute

// Create the trigger & request
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: false)
let request = UNNotificationRequest(identifier: alarm.notifID, content: content, trigger: trigger)

// Schedule the request with the system.
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.add(request, withCompletionHandler: { error in
if error != nil {
// TODO: Show Alert for Error
return
}
})
}

最佳答案

所以我发现了一些东西。
正如问题所述,当手机处于静音模式时,目前无法在本地通知中播放声音。
然而,好消息!
实际上有不同的方法可以达到相同的结果;这就是 Alarmy 等应用程序的做法。

Note: I (FINALLY) discovered this solution from this wonderful SO answer, but I'll summarize it here for reference.


简而言之,本地通知不会播放声音,而是应用程序会播放它(在后台)。
步骤
  • 您必须启用该应用程序才能在后台播放声音。为此,请导航至您的 .plist文件并添加字符串值 App plays audio or streams audio/video using AirPlay到数组键 Required background modes . (这也可以在您的应用程序的 Capabilities 中实现 - 它做同样的事情)。
  • 在您的 App Delegate 中,将 AVAudioSession 的类别设置为 .playBack所以即使手机被锁定或在后台,声音仍然会播放。
  • do {
    try AVAudioSession.sharedInstance().setCategory(.playAndRecord)
    try AVAudioSession.sharedInstance().setActive(true)
    } catch {
    print(error.localizedDescription)
    }
  • 在您希望播放的时间启动您的 AVAudioPlayer(在我的情况下,在我的本地通知时)。
  • let timeInterval = 60.0 // 60.0 would represent 1 minute from now
    let timeOffset = audioPlayer.deviceCurrentTime + timeInverval
    audioPlayer.play(atTime: timeOffset) // This is the magic function

    // Note: the `timeInterval` must be added to the audio player's
    // `.deviceCurrentTime` to calculate a correct `timeOffset` value.
    总之,正如我在上面链接的 SO 答案如此恰本地总结了:

    This does not play silence in the background, which violates Apple's rules. It actually starts the player, but the audio will only start at the right time. I think this is probably how Alarmy implemented their alarm, given that it's not a remote notification that triggers the audio nor is the audio played by a local notification (as its not limited to 30 seconds or silenced by the ringer switch).

    关于ios - 应用程序在后台时本地通知声音不播放 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68684957/

    66 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com