Что ж, у меня возникла та же проблема. Похоже, что раньше это не поддерживалось или невозможно воспроизвести пользовательский звук для локальных уведомлений, которые не включены в комплект приложений. Но позже это поддерживается, и вы можете назначить пользовательские звуки из контейнера приложения, в частности, в каталоге Library / Sounds. И это сработало со мной. вы можете либо загрузить звуки с сервера в этот каталог, либо протестировать его, скопировав файл .caf (Apple сказал, что другие расширения могут работать) из комплекта в каталог Library / sounds, а затем удалить ссылку на файл из комплекта, чтобы убедиться, что если звуки воспроизводятся, это из каталога вне пакета. Все это работает очень хорошо, главная проблема для меня, если пользователь принудительно цитирует приложение, оно перестает работать для локальных уведомлений, пока оно все еще работает с уведомлениями push-комплектов, я планирую локальное, хотя, когда приходит push-комплект push-уведомлений.
Вот код для тестирования воспроизведения звука из каталога:
func copyFileToDirectoryFromBundle()
{
// get reference to library directory
let LibraryDirectoryPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
// see what is in there
for path in LibraryDirectoryPaths
{
print("di=\(path)")
}
// prepare for sound directory
let libraryDirectoryPath: AnyObject = LibraryDirectoryPaths[0]
let soundsDirectoryPath = libraryDirectoryPath.stringByAppendingPathComponent("Sounds")
// create sounds directory under library if not there already
if !NSFileManager.defaultManager().fileExistsAtPath(soundsDirectoryPath)
{
do {
try NSFileManager.defaultManager().createDirectoryAtPath(soundsDirectoryPath, withIntermediateDirectories: false, attributes: nil)
print("sounds library created,,,")
} catch let error as NSError {
print("creating sounds directory error = \(error.localizedDescription)");
}
}
else
{
print("Sounds directory is there already under Library")
}
do {
// sounds directory should have been added under library
let directoryContents = try NSFileManager.defaultManager().contentsOfDirectoryAtURL( NSURL(string: libraryDirectoryPath as! String)!, includingPropertiesForKeys: nil, options: [])
print("Library directs=\(directoryContents)")
// prepare for adding subdirectory with file name from bundle
// here is where you should save files if downloaded from server
// here im just moving one from bundle
let subDirectoryPath = directoryContents.last!
if let pathFromBundle = NSBundle.mainBundle().pathForResource("notification", ofType:"caf") {
let myFilePathUnderSounds = "\(subDirectoryPath.path!)\("/notification.caf")"
if !NSFileManager.defaultManager().fileExistsAtPath(myFilePathUnderSounds)
{
do {
print("bundle path=\(pathFromBundle)and datacontainer path=\(subDirectoryPath.path!)")
try NSFileManager.defaultManager().copyItemAtPath(pathFromBundle, toPath:myFilePathUnderSounds )
print("item copied")
} catch let error as NSError {
print(error.localizedDescription);
}
}
else
{
print("Your file from bundle path = \(pathFromBundle) is already there under Sounds")
}
}
else
{
print("Item not found in bundle")
}
// see item there after you add it
let subDirectories = try NSFileManager.defaultManager().contentsOfDirectoryAtURL( subDirectoryPath, includingPropertiesForKeys: nil, options: [])
print("files under sounds")
for fileDirectory in subDirectories
{
print(fileDirectory)
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
Убедившись, что файл .caf находится в каталоге Library / Sounds. Все, что вам нужно сделать, это просто назначить имя файла с расширением для свойства soundName локального уведомления, например, если файл находится в комплекте.