iOS 10 UserNotifications 后台模式自定义声音
iOS 10 UserNotifications custom sound in background mode
由于 UILocalNotification
在 iOS 10 中已弃用,因此我使用 UNUserNotification 框架更新了我的本地通知流程。
应用程序在前景时使用AVPlayer播放自定义声音,并且它工作正常。但在 background 模式下,当触发本地通知时,将播放默认通知声音,而不是自定义声音。
但是,在 iOS9 中一切正常,使用 "didReceiveLocalNotification" 方法应用程序即使在后台模式下也可以播放自定义声音。
更新 1:
我将本地通知设置如下:
let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationStringForKey("reminder!", arguments: nil)
content.body = NSString.localizedUserNotificationStringForKey("Reminder body.", arguments: nil)
if let audioUrl == nil {
content.sound = UNNotificationSound.defaultSound()
} else {
let alertSound = NSURL(fileURLWithPath: self.selectedAudioFilePath)
content.sound = UNNotificationSound(named: alertSound.lastPathComponent!)
}
content.userInfo = infoDic as [NSObject : AnyObject]
content.badge = 1
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: false)
let identifier = "Reminder-\(date)"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
let center = UNUserNotificationCenter.currentNotificationCenter()
center.addNotificationRequest(request, withCompletionHandler: { (error) in
if error != nil {
print("local notification created successfully.")
}
})
我已经解决了很多 SO 问题,但没有得到解决方案。
任何帮助将不胜感激!
在您的推送通知包中,您需要包含您想要在后台播放的自定义声音。此声音也需要包含在您的应用程序中。
例如,这是我在 PHP 中为 iOS 创建自定义通知包的方法。请注意,在我的通知对象中我有一个声音对象。
array("to" => $sDeviceID,
"data" => array($sMessageType => $sMessage,
"customtitle" => $sMessageTitle,
"custombody" => $sMessage,
"customimage" => "$mIcon") ,
"notification" => array("title" => "sMessageTitle",
"text" => $sMessage,
"icon" => "$mIcon",
"sound" => "mySound.mp3"));
以下是如何使用带有自定义声音的 UserNotifications
框架创建通知。
如果 notification
是您的 UNNotificationContent
并且您的捆绑包中的自定义媒体文件的名称是 a.mp4,只需使用以下代码:
notification.sound = UNNotificationSound(named: "a.mp4")
因此,您不需要使用 didRecieveLocalNotification
。
发现 alertSound
没有正确的文件路径,因此 content.sound
没有设置任何内容。我将录制的文件保存在文档目录中,与模拟器相比,真实设备的文件路径检索不同。
设置一个放在项目包中的声音文件就可以了
content.sound = UNNotificationSound(named: "out.caf")
我明白
let notificationContent = UNMutableNotificationContent()
...
notificationContent.sound = UNNotificationSound(named: "out.mp3")
工作正常,但是:
1) 声音文件不应超过 30 秒(我认为可以)
2) 声音文件必须是 Bundle.mail 文件的一部分。如果它存储在其他地方,则在后台时通知将无法访问它。它在前台工作正常。据我所知,Apple 不提供访问其他文件夹的权限。
3) 声音格式有限制。请参考苹果指南
4) 我不确定 Bundle.main 中的声音文件是否可以更改
以编程方式。例如:我写了一个例程,提取存储在苹果音乐中并由用户选择的歌曲的 30 秒......一切正常,如果信息存储在不同的目录中,但仅在前台......一旦锁定或在后台无法访问它。我无法 change/overwrite Bundle.main 中的文件。如果那是可能的,那么问题就会得到解决……但我认为那将是一个安全问题。我得出结论,只要满足上述条件,警报声音和音乐就可以正常工作。
在 Swift 4.2 和 Xcode 10.1
本地通知播放声音
let content = UNMutableNotificationContent()
content.title = "Notification Tutorial"
content.subtitle = "from ioscreator.com"
content.body = " Notification triggered"
//Default sound
content.sound = UNNotificationSound.default
//Play custom sound
content.sound = UNNotificationSound(named:UNNotificationSoundName(rawValue: "123.mp3"))
“123.mp3”文件需要在您的包中。
let notificationContent1 = UNMutableNotificationContent()
notificationContent1.title = "Good morning! Would you like to listen to a morning meditation to start the day fresh ? Or maybe a cool relaxing soundscape? Open the app and browse our collection which is updated daily."
notificationContent1.subtitle = ""
notificationContent1.body = ""
notificationContent1.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "AlarmSound.wav"))
var dateComponents1 = DateComponents()
dateComponents1.hour = 08
dateComponents1.minute = 00
let trigger1 = UNCalendarNotificationTrigger(dateMatching: dateComponents1, repeats: true)
let request1 = UNNotificationRequest(
identifier: UUID().uuidString,
content: notificationContent1,
trigger: trigger1
)
let notificationContent2 = UNMutableNotificationContent()
notificationContent2.title = "Good evening! Hope you had a great day. Would you like to meditate on a particular topic ? Or just some relaxing sleep sounds ? Open the app and pick what you want so you can go to sleep relaxed."
notificationContent2.subtitle = ""
notificationContent2.body = ""
notificationContent2.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "AlarmSound.wav"))
var dateComponents2 = DateComponents()
dateComponents2.hour = 20
dateComponents2.minute = 00
let trigger2 = UNCalendarNotificationTrigger(dateMatching: dateComponents2, repeats: true)
let request2 = UNNotificationRequest(
identifier: UUID().uuidString,
content: notificationContent2,
trigger: trigger2
)
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().add(request1, withCompletionHandler: nil)
UNUserNotificationCenter.current().add(request2, withCompletionHandler: nil)
由于 UILocalNotification
在 iOS 10 中已弃用,因此我使用 UNUserNotification 框架更新了我的本地通知流程。
应用程序在前景时使用AVPlayer播放自定义声音,并且它工作正常。但在 background 模式下,当触发本地通知时,将播放默认通知声音,而不是自定义声音。
但是,在 iOS9 中一切正常,使用 "didReceiveLocalNotification" 方法应用程序即使在后台模式下也可以播放自定义声音。
更新 1:
我将本地通知设置如下:
let content = UNMutableNotificationContent()
content.title = NSString.localizedUserNotificationStringForKey("reminder!", arguments: nil)
content.body = NSString.localizedUserNotificationStringForKey("Reminder body.", arguments: nil)
if let audioUrl == nil {
content.sound = UNNotificationSound.defaultSound()
} else {
let alertSound = NSURL(fileURLWithPath: self.selectedAudioFilePath)
content.sound = UNNotificationSound(named: alertSound.lastPathComponent!)
}
content.userInfo = infoDic as [NSObject : AnyObject]
content.badge = 1
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: false)
let identifier = "Reminder-\(date)"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
let center = UNUserNotificationCenter.currentNotificationCenter()
center.addNotificationRequest(request, withCompletionHandler: { (error) in
if error != nil {
print("local notification created successfully.")
}
})
我已经解决了很多 SO 问题,但没有得到解决方案。
任何帮助将不胜感激!
在您的推送通知包中,您需要包含您想要在后台播放的自定义声音。此声音也需要包含在您的应用程序中。
例如,这是我在 PHP 中为 iOS 创建自定义通知包的方法。请注意,在我的通知对象中我有一个声音对象。
array("to" => $sDeviceID,
"data" => array($sMessageType => $sMessage,
"customtitle" => $sMessageTitle,
"custombody" => $sMessage,
"customimage" => "$mIcon") ,
"notification" => array("title" => "sMessageTitle",
"text" => $sMessage,
"icon" => "$mIcon",
"sound" => "mySound.mp3"));
以下是如何使用带有自定义声音的 UserNotifications
框架创建通知。
如果 notification
是您的 UNNotificationContent
并且您的捆绑包中的自定义媒体文件的名称是 a.mp4,只需使用以下代码:
notification.sound = UNNotificationSound(named: "a.mp4")
因此,您不需要使用 didRecieveLocalNotification
。
发现 alertSound
没有正确的文件路径,因此 content.sound
没有设置任何内容。我将录制的文件保存在文档目录中,与模拟器相比,真实设备的文件路径检索不同。
设置一个放在项目包中的声音文件就可以了
content.sound = UNNotificationSound(named: "out.caf")
我明白
let notificationContent = UNMutableNotificationContent()
...
notificationContent.sound = UNNotificationSound(named: "out.mp3")
工作正常,但是:
1) 声音文件不应超过 30 秒(我认为可以)
2) 声音文件必须是 Bundle.mail 文件的一部分。如果它存储在其他地方,则在后台时通知将无法访问它。它在前台工作正常。据我所知,Apple 不提供访问其他文件夹的权限。
3) 声音格式有限制。请参考苹果指南
4) 我不确定 Bundle.main 中的声音文件是否可以更改 以编程方式。例如:我写了一个例程,提取存储在苹果音乐中并由用户选择的歌曲的 30 秒......一切正常,如果信息存储在不同的目录中,但仅在前台......一旦锁定或在后台无法访问它。我无法 change/overwrite Bundle.main 中的文件。如果那是可能的,那么问题就会得到解决……但我认为那将是一个安全问题。我得出结论,只要满足上述条件,警报声音和音乐就可以正常工作。
在 Swift 4.2 和 Xcode 10.1
本地通知播放声音
let content = UNMutableNotificationContent()
content.title = "Notification Tutorial"
content.subtitle = "from ioscreator.com"
content.body = " Notification triggered"
//Default sound
content.sound = UNNotificationSound.default
//Play custom sound
content.sound = UNNotificationSound(named:UNNotificationSoundName(rawValue: "123.mp3"))
“123.mp3”文件需要在您的包中。
let notificationContent1 = UNMutableNotificationContent()
notificationContent1.title = "Good morning! Would you like to listen to a morning meditation to start the day fresh ? Or maybe a cool relaxing soundscape? Open the app and browse our collection which is updated daily."
notificationContent1.subtitle = ""
notificationContent1.body = ""
notificationContent1.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "AlarmSound.wav"))
var dateComponents1 = DateComponents()
dateComponents1.hour = 08
dateComponents1.minute = 00
let trigger1 = UNCalendarNotificationTrigger(dateMatching: dateComponents1, repeats: true)
let request1 = UNNotificationRequest(
identifier: UUID().uuidString,
content: notificationContent1,
trigger: trigger1
)
let notificationContent2 = UNMutableNotificationContent()
notificationContent2.title = "Good evening! Hope you had a great day. Would you like to meditate on a particular topic ? Or just some relaxing sleep sounds ? Open the app and pick what you want so you can go to sleep relaxed."
notificationContent2.subtitle = ""
notificationContent2.body = ""
notificationContent2.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "AlarmSound.wav"))
var dateComponents2 = DateComponents()
dateComponents2.hour = 20
dateComponents2.minute = 00
let trigger2 = UNCalendarNotificationTrigger(dateMatching: dateComponents2, repeats: true)
let request2 = UNNotificationRequest(
identifier: UUID().uuidString,
content: notificationContent2,
trigger: trigger2
)
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().add(request1, withCompletionHandler: nil)
UNUserNotificationCenter.current().add(request2, withCompletionHandler: nil)