2012-07-30 1 views
1

Я надеюсь, что ошибаюсь, но я не думаю, что это возможно. В руководстве по программированию локальных и push-уведомлений в разделе «Подготовка пользовательских звуков оповещения» говорится, что «Звуковые файлы должны быть в основном комплекте клиентского приложения».не основной файл связки в качестве предупреждающего звука

Если вы не можете писать в основной комплект, то как вы можете получить записанную пользователем запись (используя, скажем, AVAudioRecorder), чтобы воспроизводить звуковой сигнал?

С одной стороны, это кажется невозможным, но, с другой стороны, я думаю, что есть приложения, которые делают это (и я буду искать их).

+0

Ну, я нашел приложение, которое делает это: VoCal XL. Какие-нибудь идеи, что там происходит? –

+0

Возможно, документы неправильные, и звуковые файлы не обязательно должны быть в комплекте приложений, но в изолированной программной среде приложения. –

+0

Хм. Я тестировал его, и он не работает. Однако, если я использую звуки, которые я загрузил с помощью Xcode (т. Е. В основном комплекте), тогда он работает, что заставляет меня думать, что документы правильные. Любые идеи о том, как я могу проверить вещи? –

ответ

2

Я решил это, скопировав системный звуковой файл в каталог ~/Library/Sounds и назовите его как notification.caf. Полезная нагрузка сервера указывает это как имя воспроизводимого звука. Всякий раз, когда пользователь выбирает другой звук, этот звук будет скопирован в ту же папку и перезапишет старый звук.

Payload:

{ 
"aps": { 
    "sound": "notification.caf" 
} 

}

// get the list of system sounds, there are other sounds in folders beside /New 
let soundPath = "/System/Library/Audio/UISounds/New" 
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)") 
    } 
} 

Уведомление звук толчок может быть багги, хотя, я должен перезагрузить мой телефон до того, как звук будет играть надежно для каждого уведомления.