为啥我添加到我的 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 上部署应用程序时不可用的主要内容,如果未能解决你的问题,请参考以下文章