非主要捆绑文件作为警报声音
我希望我错了,但我不认为这是可能的。 在“本地和推送通知编程指南”中的“准备自定义警报声音”下,它说“声音文件必须位于客户端应用程序的主包中”。
如果您不能写入主包,那么如何获得用户生成的录音(使用AVAudioRecorder)作为警报声?
一方面它似乎是不可能的,但另一方面,我认为有应用程序在那里做(我会寻找那些)。
我通过将系统声音文件复制到〜/ Library / Sounds目录并将其命名为notification.caf来解决此问题。 服务器警报有效负载将此指定为要播放的声音的名称。 每当用户select另一个声音时,该声音将被复制到相同的文件夹并覆盖旧的声音。
有效载荷:
{ "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)") } }
推送通知声音可能是越野车,但我必须重新启动我的手机之前,声音将可靠地播放每个通知。