嗨,我有一个带有计时器部分的音频播放器应用程序,目的是使音频在特定的日期和时间开始/停止。我已经使用UNUserNotificationCenter
实现了此功能。当应用程序处于前台状态时,此方法工作正常。但是,当应用程序非活动状态/后台时,播放器仅在应用程序打开并进入前景状态时才会播放有人可以帮我吗?
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .badge, .sound])
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("Local notification received")
let application = UIApplication.shared
print(response.notification.request.content)
let identifier = response.actionIdentifier
let request = response.notification.request
if(identifier == "StartPlaying")
{
AudioManager.sharedInstance.setAudioPlayer(audioUrl: "http://athmaraksha.org/admin/uploads/audio/040D-Daivathinte Vagdhanangal-329.mp3", fromAudio: true)
AudioManager.sharedInstance.player?.play()
}
else if(identifier == "StopPlaying")
{
AudioManager.sharedInstance.player?.pause()
}
completionHandler()
}
答案 0 :(得分:0)
当然有多种方法可以做到。我更喜欢并且很简单的一种方法是使用Global单例。
所以问题出在从后台重启应用程序的同时处理推送通知中的数据,对吗?
在func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
方法中,我们在这里处理推送通知,对吗?
我有一种方法可以检查当前是否可以推动或显示屏幕(例如,应用已完全打开,并且没有从后台重启)。如果没有办法推送或显示屏幕,因为该应用只是从后台重新启动(意味着尚未向用户显示任何屏幕),那么我会将数据保存到我上面提到的全局单例中
当根屏幕或主屏幕刚刚完全加载时,这意味着我们准备检查是否有来自推送通知的已保存数据,并且这是我们准备进行任何UI更改或演示/推送的时候了根据推送通知显示屏幕。
我希望这个想法有帮助!