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

Ios 为什么我添加到xcode项目中的音频文件在模拟器中可用,但在iPhone上部署应用程序时却不可用,ios,swift,nsfilemanager,Ios,Swift,Nsfilemanager,我正在使用AVQueuePlayer播放本地音频文件,通过将.mp3文件拖放到“项目导航器”窗格中的我的文件夹中,我已将这些文件添加到我的Xcode项目中。然后,我使用这段代码搜索我的文件并提取我想要的文件,然后使用这些文件填充表视图并创建要在我的AVQueuePlayer中播放的AVPlayerItems 当我在模拟器上运行应用程序时,我的代码工作正常,但当我在iPhone上运行应用程序时,会发生错误并返回 致命错误:在展开可选值时意外发现nil 以下是导致问题的代码 var songName

我正在使用AVQueuePlayer播放本地音频文件,通过将.mp3文件拖放到“项目导航器”窗格中的我的文件夹中,我已将这些文件添加到我的Xcode项目中。然后,我使用这段代码搜索我的文件并提取我想要的文件,然后使用这些文件填充表视图并创建要在我的AVQueuePlayer中播放的AVPlayerItems

当我在模拟器上运行应用程序时,我的代码工作正常,但当我在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”不存在


非常感谢您的帮助

您是否选择了复制文件(如果需要),然后将MP3拖到项目中

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

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")
}

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

听起来您还没有将声音文件添加到Xcode项目中的目标中。如果它们不属于目标,则在生成过程中不会被复制到资源文件夹中

选择要在“项目导航器”中使用的声音文件,并检查“文件检查器”视图->实用程序->文件检查器,确保在“目标成员资格”下选择了相应的目标

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

let path = String(NSBundle.mainBundle().resourcePath)
这条线并不是你想象的那样。NSBundle.mainBundle.resourcePath返回字符串?,该字符串是可选类型。当您通过环绕字符串来创建字符串时,它不会展开可选项,而是创建一个描述可选项的字符串,如下所示:

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!

那会解开绳子吗?键入,并给您一个字符串或抛出一个错误。

您的第一条路径肯定是错误的,因为该路径不在设备上。关于内容,您是否检查过构建中是否包含这些文件?单击Xcode中的文件并查看目标成员身份OK,您知道设备上要使用的路径吗?是的,这些文件包含在构建中。您的第二个代码块会出现什么错误?只是找不到什么?您是否已将它们包含在子文件夹中?这可能有助于@Flexicoder我在第二段代码中遇到的错误是。。。致命错误:“尝试!”表达式意外引发错误:error Domain=nscocaerorrordomain Code=260文件夹“LocalAudioFilePlayer.app”不存在。它们位于项目的子文件夹中。对我来说,.app意味着它与应用程序包有关。链接的答案提到子文件夹,请仔细查看。对不起,我没有想到其他事情。我将MP3拖到项目中,然后选择了复制项目(如果需要)。我使用的不是AVAudioPlayer,而是AVPlayer的AVQueuePlayer子类。所以我需要遍历多个文件并获取它们,然后将它们放入一个数组中。然后,我使用该数组创建一个AVPlayerItems数组,然后在播放这些项目之前将其加载到我的AVQueuePlayer中。@flexicoder建议这样做,但我已经检查过了,这不是问题所在。这很有帮助!现在,当我在iPhone上加载视图时,我可以打印所有带有mp3后缀的项目,并将它们相应地附加到数组中。没有更多的错误。然而,音频在我的iPhone上无法播放,在模拟器tho上运行良好。我获取[songNameArray],通过将每个路径连接到/Users/userName/Desktop/Xcode Projects Folder/LocalAudioFilePlayer/LocalAudioFilePlayer/,将其转换为完整的SongPath,然后获取[FullSongPath]并将其转换为NSURL,然后使用NSURL创建[AVPlayerItems]数组,然后用于在queuePlayer中播放。可能值得提出一个新问题。当我在iPhone上测试时,它成功地将适当的文件附加到songNameArray,但它不会播放任何应有的音频。当我在模拟器上调用queuePlayer.play时,它工作正常。在iPhone上,没有音频输出。在调用play函数后,我连接了一个按钮来调用queuePlayer.currentItem.currentTime,当我点击该按钮时,应用程序在该行崩溃。我是否应该把这单独列为一个问题?