Пользовательский звук локального уведомления с URL-адреса iOS Swift

Я успешно записал и воспроизвел голос для локального звука уведомления, и он также воспроизводится при вызове этой функции.

Но проблема в том, что когда я даю ссылку звука на свойство звука уведомления, она не работает.

notification.sound = UNNotificationSound.init(named: "martian-gun copy.m4a")

Код выше работает отлично. Но когда я дал ему URL-адрес (в виде строки), он не воспроизводит точный звук. Код не работает:

        let fm = FileManager.default
        let docsurl = try! fm.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        let myurl = docsurl.appendingPathComponent("sound.m4a")

        notification.sound = UNNotificationSound.init(named: myurl)

myurl имеет тот же путь, по которому воспроизводится голос на playButton. Наконец, вопрос: как установить собственный звук уведомления из звукового URL-адреса?


person Ummar Ahmed    schedule 11.04.2018    source источник


Ответы (1)


Согласно документу UNNotificationSound, вам необходимо поместить копию аудиофайла в папку Library/Sounds каталога контейнера вашего приложения.

let docsurl = try FileManager.default.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let myurl = docsurl.appendingPathComponent("sound.m4a")


let filename = myurl.lastPathComponent

let targetURL = try FileManager.default.soundsLibraryURL(for: filename)

// copy audio file to /Library/Sounds
if !FileManager.default.fileExists(atPath: targetURL.path) {
    try FileManager.default.copyItem(at: sourceURL, to: targetURL)
}

let content = UNMutableNotificationContent()
content.sound = UNNotificationSound(named: UNNotificationSoundName(filename))


extension FileManager {

    func soundsLibraryURL(for filename: String) throws -> URL {
        let libraryURL = try url(for: .libraryDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        let soundFolderURL = libraryURL.appendingPathComponent("Sounds", isDirectory: true)
        if !fileExists(atPath: soundFolderURL.path) {
            try createDirectory(at: soundFolderURL, withIntermediateDirectories: true)
        }
        return soundFolderURL.appendingPathComponent(filename, isDirectory: false)
    }
}
person Jonny    schedule 08.10.2018