【问题标题】:Accessing File saved in today extension from project从项目访问保存在今天扩展中的文件
【发布时间】:2017-02-10 22:55:22
【问题描述】:

我正在尝试访问从今天的扩展中保存的文件。在今天的扩展中,我这样做是为了保存文件:

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 Player 获取数据:

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

但是,它给出了错误:在展开 Optional 值时意外发现 nil。 感谢您的帮助。

【问题讨论】:

    标签: swift audio swift3 save today-extension


    【解决方案1】:

    您的扩展程序将文件保存到其文档目录,并且您的应用代码正在应用程序包中查找该文件。应用程序包仅包含与应用程序一起分发的资源。您需要深入研究文件系统。

    但是,还有另一个问题。扩展程序和包含的应用程序不共享文档目录。他们每个人都有自己的容器,用于将数据写入自己的本地。如果您想在它们之间共享数据,则需要做更多的工作。总结:

    1. 为要共享的应用和扩展创建一个应用组标识符。
    2. 使用FileManager.containerURL(forSecurityApplicationGroupIdentifier:) 获取共享容器目录的文件URL。
    3. 从容器 URL 附加文件名。
    4. 在扩展程序中,您将照常设置AVAudioRecorder 并开始录制。
    5. 在主应用程序中,您需要使用NSFileCoordinator API 来确保一次只有一个进程正在写入文件。希望AVAudioRecorder 在内部使用NSFileCoordinator API,尽管我没有立即找到对此的确认。

    有关共享容器的更多详细信息,请参阅blog post

    【讨论】:

      【解决方案2】:

      我只是尝试了相同的方法 - 从 Today Extension 录制音频。代码看起来太熟悉了,所以我大胆猜测:您想捕获语音并将文件发送到 Google Speech API,对吗?

      不过,我认为我们遇到了扩展的限制:从https://developer.apple.com/library/content/qa/qa1872/_index.html 来看,扩展无法录制音频。这篇文章是为 iOS 8 写的,但我不相信 Apple 曾经解除过限制。如果我错了,请纠正我,因为我在做 OP 自己做的事情时一直遇到问题。

      顺便说一句,检查audioRecorder.record() 的结果。可能是false,表示捕获从未开始(这是我目前的错误)。

      【讨论】:

      • 是的,我意识到了。这是一种真正的痛苦。
      猜你喜欢
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多