2017-02-10 25 views
0

Я пытаюсь получить доступ к файлу я сохранил от моих сегодня extension.In моих сегодня extenson я сделал это, чтобы сохранить файл:Доступ Файл сохраняется в расширении сегодня от проекта

func startRecording() { 
    let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a") 

    let settings = [ 
     AVFormatIDKey: Int(kAudioFormatMPEG4AAC), 
     AVSampleRateKey: 12000, 
     AVNumberOfChannelsKey: 1, 
     AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue 
    ] 

    do { 
     audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings) 
     audioRecorder.delegate = self 
     audioRecorder.record() 

     recordButton.setTitle("Stop", for: .normal) 
    } catch { 
     finishRecording(success: false) 
    } 
} 

func getDocumentsDirectory() -> URL { 
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 
    let documentsDirectory = paths[0] 
    return documentsDirectory 
} 

Затем я попытался получить данные для моего AVAudio игрока в основной части проекта, используя этот код:

let path = Bundle.main.path(forResource: "recording.m4a", ofType:nil)! let url = URL(fileURLWithPath: path)

Однако он дал ошибку: неожиданно нашла ноль в то время как разворачивание необязательного значения. Спасибо за помощь.

ответ

1

Ваше расширение сохраняет файл в его каталоге документов, а ваш код приложения ищет файл в комплекте приложения. Пакет приложений содержит только ресурсы, которые распространяются вместе с приложением. Вам нужно будет вникать в файловую систему.

Однако есть еще одна проблема. Приложение расширения и содержащее приложение не имеет общего доступа к каталогу документов. У каждого из них свой контейнер для записи локальных данных. Если вы хотите поделиться данными между ними, это немного больше. Вкратце:

  1. Создайте идентификатор группы приложений для приложения и расширения для совместного использования.
  2. Используйте FileManager.containerURL(forSecurityApplicationGroupIdentifier:), чтобы получить URL-адрес файла для общей папки-контейнера.
  3. Из URL-адреса контейнера добавьте имя файла.
  4. В расширении вы должны установить AVAudioRecorder как обычно и начать запись.
  5. В главном приложении вы хотите использовать API NSFileCoordinator, чтобы гарантировать, что только один процесс записывает файл одновременно. Надеемся, что AVAudioRecorder использует API NSFileCoordinator, хотя я не сразу нашел подтверждение этого.

Подробнее об общих контейнерах см. Здесь blog post.

+0

Итак, как бы реализовать это в моем коде? – joshLor

0

Я просто пробовал то же самое - записывать аудио из Today Extension. Код выглядит настолько ооочень знакомым, поэтому я беру на себя дикую догадку: вы хотите захватить голос и отправить файл в Google Speech API, правильно?

Тем не менее, я думаю, что мы нажимаем ограничения расширений: судя по https://developer.apple.com/library/content/qa/qa1872/_index.html, расширения не могут записывать аудио. Статья написана для iOS 8, но я не думаю, что Apple когда-либо снимала ограничение. Пожалуйста, поправьте меня, если я ошибаюсь, так как у меня все время возникают проблемы с тем, что делает OP.

btw, проверьте результат audioRecorder.record(). Это может быть false и указать, что захват никогда не запускался (это моя ошибка в настоящее время).

+0

Да, я понял это. Это настоящая боль. – joshLor