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

Posted

技术标签:

【中文标题】为啥我添加到我的 xcode 项目的音频文件在模拟器中可用,但在我在 iPhone 上部署应用程序时不可用【英文标题】:Why are the audio files I've added to my xcode project available in the simulator but are not available when i deploy the app on iPhone为什么我添加到我的 xcode 项目的音频文件在模拟器中可用,但在我在 iPhone 上部署应用程序时不可用 【发布时间】:2016-01-19 08:07:27 【问题描述】:

我正在使用AVQueuePlayer 播放本地音频文件,这些文件是通过将 .mp3 文件拖放到项目导航器窗格中的文件夹中而添加到我的 Xcode 项目中的。然后我使用此代码搜索我的文件并提取我想要的文件,然后我用它来填充表格视图并创建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”文件夹不存在

非常感谢任何帮助

【问题讨论】:

您的第一个 Path 肯定是错误的,因为它不会出现在设备上。关于内容,您是否检查过文件是否包含在构建中?在 Xcode 中点击文件并查看 Target Membership 好的,你知道在设备上使用什么路径吗?是的,这些文件包含在构建中。 第二个代码块出现什么错误?只是什么都没找到吗?您是否将它们包含在子文件夹中?这可能会帮助***.com/questions/6398937/… @Flexicoder 第二个代码块的错误是... fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=260 "The folder “LocalAudioFilePlayer.app")” doesn’t exist." 。它们位于项目的子文件夹中。 对我来说 .app 意味着它与应用程序包有关。链接的答案提到了子文件夹,请看一下。对不起,没有别的想法了 【参考方案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!

解开字符串?类型,并给你一个字符串(或抛出一个错误)。

【讨论】:

这有帮助!现在,当我在我的 iPhone 上加载视图时,我可以打印所有带有“mp3”后缀的项目,并将它们相应地附加到一个数组中。没有更多的错误。但是,音频没有在我的 iPhone 上播放(在模拟器上运行良好)。我采用[songNameArray],通过将每个连接到/Users/userName/Desktop/Xcode Projects Folder/LocalAudioFilePlayer/LocalAudioFilePlayer/ 的末尾将它们转换为"fullSongPaths",然后我采用[fullSongPaths] 并将它们转换为NSURL,然后用于创建[AVPlayerItems] 的数组,然后曾经在queuePlayer玩过。 可能值得提出一个新问题。 当我在 iPhone 上进行测试时,它成功地将正确的文件附加到 songNameArray,但是它没有播放任何应有的音频。当我在模拟器上调用queuePlayer.play() 时,它工作正常。在 iPhone 上,没有声音输出。我在调用播放功能后连接了一个按钮来调用queuePlayer.currentItem.currentTime,当我点击该按钮时应用程序在该行崩溃。我应该单独提出这个问题吗?【参考方案2】:

您是否选择了“如果需要则复制文件”然后将 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")

注意:这里只使用文件名,而不是整个路径。

【讨论】:

我将 mp3 拖到项目中,然后我选择了“如果需要,复制项目”。而且我没有使用 AVAudioPlayer,我使用的是 AVQueuePlayer(AVPlayer 的子类)。所以我需要遍历多个文件并抓取它们,然后将它们放入一个数组中。然后我使用该数组创建一个 AVPlayerItems 数组,然后在播放项目之前将其加载到我的 AVQueuePlayer 中。【参考方案3】:

听起来您还没有将声音文件添加到 Xcode 项目中的目标中。如果它们不“属于”某个目标,则在构建过程中它们不会被复制到“resources”文件夹中。

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

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

【讨论】:

@flexicoder 提出了这个建议,但我已经检查过了,这不是问题。

以上是关于为啥我添加到我的 xcode 项目的音频文件在模拟器中可用,但在我在 iPhone 上部署应用程序时不可用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 js 文件添加到我的 xcode 项目中?

将 Dlib 添加到我的 Xcode 项目但没有找到 .h 文件

为啥我不能引用将惯性js添加到我的项目的应用程序布局文件?

如何将 MP3 添加到我的 iOS/Xcode 项目?

每当我将文件添加到项目时,XCode 都会崩溃

为啥要将 entitlements.plist 添加到我的项目中?