UILocalNotification:播放保存在文档目录中的自定义音频文件

时间:2015-07-01 00:40:25

标签: ios swift uilocalnotification

目前我正在创建一个警报应用程序,可以从服务器播放自定义音频剪辑。我实现这一点的计划是在本地保存所有音频片段,然后相应地设置soundName。

但我有一些问题。目前我在捆绑目录中保存音频文件时遇到麻烦,只能将文件保存在文档目录中。是否可以从文档目录而不是bundle目录中设置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)

谢谢,如果您对我的问题感到困惑,请告诉我。或者,如果你能想到如何解决这个问题的另一个解决方案。

3 个答案:

答案 0 :(得分:3)

不幸的是,答案是否定的。

您只能在本地通知中播放捆绑包中的声音,并且捆绑包是只读的。

您可以随应用附带的唯一声音来自本地通知。别无选择。

答案 1 :(得分:1)

幸运的是,这是肯定的。请点击此链接:How do I add a file to the main bundle's /Library/Sounds directory?

在这里,我已将系统铃声复制到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

答案 2 :(得分:0)

还有一种方法,您可以直接将自定义音频文件保存在Library / Sounds中,而不是保存在文档目录中。然后只需将带扩展名的文件名放在通知有效负载中,它就会在本地/推送通知上播放自定义音频;提供不超过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路径,使用此路径可以保存或执行其他操作。