UILocalNotification:播放保存在文档目录中的自定义音频文件
UILocalNotification: Playing a Custom Audio File saved in Documents Directory
目前我正在创建一个闹钟应用程序,它可以播放来自服务器的自定义音频剪辑。我的实现计划是在本地保存所有音频剪辑,然后相应地设置 soundName。
但我有一些问题。目前我无法将音频文件保存在捆绑目录中,只能将文件保存在文档目录中。是否可以从文档目录而不是包目录设置 soundName?
或
我可以将音频文件从服务器保存到包目录吗?
var localNotification = UILocalNotification()
localNotification.fireDate = self.timePicker.date
localNotification.alertBody = "Alert Fired"
localNotification.soundName = "fakesound.caf" // File saved in Document Directory
UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
谢谢,如果您对我的问题有任何困惑,请告诉我。或者,如果您能想到我如何解决这个问题的另一种解决方案。
不幸的是,答案是否定的。
您只能在本地通知中播放捆绑包中的声音,并且捆绑包是只读的。
您可以通过本地通知播放的唯一声音必须随您的应用一起提供。别无选择。
幸运的是,是的。访问这个 link :
这里我已经将系统铃声复制到 Library/Sounds,同样你必须通过将路径作为源路径和目标从你的数据目录复制,如下所示,通过创建一个目录 声音名字。
// get the list of system sounds, there are other sounds in folders beside /New
let soundPath = "/System/Library/Audio/UISounds/New"
var arrayOFSoundNames = [String] ()
// MARK: - scene setup
func doAnyAdditionalSetup()
{
arrayOFSoundNames = getSoundList()
}
// MARK: - File manager methods
func getSoundList() -> [String] {
var result:[String] = []
let fileManager = NSFileManager.defaultManager()
let enumerator:NSDirectoryEnumerator =
fileManager.enumeratorAtPath(soundPath)!
for url in enumerator.allObjects {
let string = url as! String
let newString = string.stringByReplacingOccurrencesOfString(".caf", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
result.append(newString)
}
return result
}
// copy sound file to /Library/Sounds directory, it will be auto detect and played when a push notification arrive
class func copyFileToDirectory(fromPath:String, fileName:String) {
let fileManager = NSFileManager.defaultManager()
do {
let libraryDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let directoryPath = "\(libraryDir.first!)/Sounds"
try fileManager.createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil)
let systemSoundPath = "\(fromPath)/\(fileName)"
let notificationSoundPath = "\(directoryPath)/notification.caf"
let fileExist = fileManager.fileExistsAtPath(notificationSoundPath)
if (fileExist) {
try fileManager.removeItemAtPath(notificationSoundPath)
}
try fileManager.copyItemAtPath(systemSoundPath, toPath: notificationSoundPath)
}
catch let error as NSError {
print("Error: \(error)")
}
}
// MARK: - tableview methods
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrayOFSoundNames.count
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
copyFileToDirectory(fromPath:soundPath, fileName:arrayOFSoundNames[indexPath.row])
}
你会得到你的答案,同时检查apple document
还有一种方法,您可以直接将自定义音频文件保存在 Library/Sounds 中,而不是保存在文档目录中。然后只需将带有扩展名的文件名放在通知负载中,它就会在 local/push 通知上播放您的自定义音频;前提是不超过 30 秒。
如有需要请参考代码:
let libraryDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let directoryPath = "\(libraryDir.first!)/Sounds"
try fileManager.createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil)
这里,在directoryPath变量中得到了Library/Sounds的路径,使用这个可以保存或者做其他操作。
目前我正在创建一个闹钟应用程序,它可以播放来自服务器的自定义音频剪辑。我的实现计划是在本地保存所有音频剪辑,然后相应地设置 soundName。
但我有一些问题。目前我无法将音频文件保存在捆绑目录中,只能将文件保存在文档目录中。是否可以从文档目录而不是包目录设置 soundName?
或
我可以将音频文件从服务器保存到包目录吗?
var localNotification = UILocalNotification()
localNotification.fireDate = self.timePicker.date
localNotification.alertBody = "Alert Fired"
localNotification.soundName = "fakesound.caf" // File saved in Document Directory
UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
谢谢,如果您对我的问题有任何困惑,请告诉我。或者,如果您能想到我如何解决这个问题的另一种解决方案。
不幸的是,答案是否定的。
您只能在本地通知中播放捆绑包中的声音,并且捆绑包是只读的。
您可以通过本地通知播放的唯一声音必须随您的应用一起提供。别无选择。
幸运的是,是的。访问这个 link :
这里我已经将系统铃声复制到 Library/Sounds,同样你必须通过将路径作为源路径和目标从你的数据目录复制,如下所示,通过创建一个目录 声音名字。
// get the list of system sounds, there are other sounds in folders beside /New
let soundPath = "/System/Library/Audio/UISounds/New"
var arrayOFSoundNames = [String] ()
// MARK: - scene setup
func doAnyAdditionalSetup()
{
arrayOFSoundNames = getSoundList()
}
// MARK: - File manager methods
func getSoundList() -> [String] {
var result:[String] = []
let fileManager = NSFileManager.defaultManager()
let enumerator:NSDirectoryEnumerator =
fileManager.enumeratorAtPath(soundPath)!
for url in enumerator.allObjects {
let string = url as! String
let newString = string.stringByReplacingOccurrencesOfString(".caf", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
result.append(newString)
}
return result
}
// copy sound file to /Library/Sounds directory, it will be auto detect and played when a push notification arrive
class func copyFileToDirectory(fromPath:String, fileName:String) {
let fileManager = NSFileManager.defaultManager()
do {
let libraryDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let directoryPath = "\(libraryDir.first!)/Sounds"
try fileManager.createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil)
let systemSoundPath = "\(fromPath)/\(fileName)"
let notificationSoundPath = "\(directoryPath)/notification.caf"
let fileExist = fileManager.fileExistsAtPath(notificationSoundPath)
if (fileExist) {
try fileManager.removeItemAtPath(notificationSoundPath)
}
try fileManager.copyItemAtPath(systemSoundPath, toPath: notificationSoundPath)
}
catch let error as NSError {
print("Error: \(error)")
}
}
// MARK: - tableview methods
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrayOFSoundNames.count
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
copyFileToDirectory(fromPath:soundPath, fileName:arrayOFSoundNames[indexPath.row])
}
你会得到你的答案,同时检查apple document
还有一种方法,您可以直接将自定义音频文件保存在 Library/Sounds 中,而不是保存在文档目录中。然后只需将带有扩展名的文件名放在通知负载中,它就会在 local/push 通知上播放您的自定义音频;前提是不超过 30 秒。
如有需要请参考代码:
let libraryDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let directoryPath = "\(libraryDir.first!)/Sounds"
try fileManager.createDirectoryAtPath(directoryPath, withIntermediateDirectories: true, attributes: nil)
这里,在directoryPath变量中得到了Library/Sounds的路径,使用这个可以保存或者做其他操作。