为什么我添加到我的xcode项目的音频文件在模拟器中可用,但在iPhone上部署应用程序时不可用

时间:2016-01-19 08:07:27

标签: ios swift nsfilemanager

我正在使用AVQueuePlayer播放我已添加到Xcode项目中的本地音频文件,方法是将.mp3文件拖放到项目导航器窗格中的我的文件夹中。然后我使用此代码搜索我的文件并提取我想要的文件,然后我用它来填充表格视图并创建AVPlayerItems以便在我的AVQueuePlayer中播放。

当我在模拟器上运行应用程序时,我的代码工作正常但是当我在iPhone上运行应用程序时,会发生错误并返回

  

致命错误:在解包可选值时意外发现nil

以下是导致问题的代码......

var songNameArray: Array<String> = [String]()
let fileManager = NSFileManager.defaultManager()
let enumerator:NSDirectoryEnumerator = fileManager.enumeratorAtPath("/Users/UsersName/Desktop/Xcode Projects Folder/LocalAudioFilePlayer/LocalAudioFilePlayer")!

while let element = enumerator.nextObject() as? String {
    if element.hasSuffix("mp3") {
        songNameArray.append(element)
        print(element)
    }
}

文件是否未正确复制到捆绑包中然后部署到iPhone?如果是这样,添加音频文件的正确方法是什么?

我也试过了......

var songNameArray: Array<String> = [String]()
let path = String(NSBundle.mainBundle().resourcePath)
let songFiles = try!      NSFileManager.defaultManager().contentsOfDirectoryAtPath(path)

for item in songFiles {
    if item.hasSuffix("mp3"){
        songNameArray.append(item)
        print("appended to songNameArray \(item)")
    }
}

但是我收到了错误

  

文件夹“LocalAudioFilePlayer.app”)“不存在

非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

您是否选择了#34;如果需要,复制文件&#34;然后将mp3拖入Project?

尝试按以下方式加载文件:

let path = NSBundle.mainBundle().pathForResource("filename", ofType: "ext")
let url = NSURL.fileURLWithPath(path!)
var audioPlayer: AVAudioPlayer?
do {
    try audioPlayer = AVAudioPlayer(contentsOfURL: url)
} catch {
    print("Unable to load file")
}

注意:此处仅使用文件名,而不是整个路径。

答案 1 :(得分:1)

听起来您还没有在Xcode项目中将声音文件添加到目标中。如果他们不属于&#34;对于一个目标,他们不会被复制到&#34;资源&#34;建设期间的文件夹。

选择要在项目导航器中使用的声音文件,并检查文件检查器(view-&gt; Utilities-&gt; File Inspector,并确保在&#34;目标成员资格&#下选择了适当的目标34。

编辑:在这种情况下,这绝对不是问题。留下这个答案,因为它可能对遇到类似问题的其他人有用。

答案 2 :(得分:1)

let path = String(NSBundle.mainBundle().resourcePath)

这条线没有做你想象的那样。 NSBundle.mainBundle().resourcePath返回String?,这是一种可选类型。当你通过在它周围包裹String()来创建一个字符串时,不会打开可选项,它会创建一个字符串描述可选的,看起来像这样:

Optional("/Users/markbes/Library/Developer/CoreSimulator/Devices/18D62628-5F8A-4277-9045-C6DE740078CA/data/Containers/Bundle/Application/3DDC064C-0DD1-4BE9-8EA4-C151B65ED1E1/Resources.app")

你想要什么更像是

var path = NSBundle.mainBundle().resourcePath!

打开字符串?键入,并为您提供一个字符串(或抛出错误)。