月度归档:2014年02月

SpriteKit 播放声音应用切换到背景时Crush解决办法

好像又好一段时间没有写结绳记事。一是因为最近没发生什么大事,第二个是最近的时间都被占满了。春节一回来,工作日忙得跟狗似的,感觉比年前那段疯狂的时间更甚。周末的时间迷上了写代码。

说到写代码,好像都是放下了快十年的爱好了。春节无聊读了读IOS编程的一些东西,得益于苹果已经把开发包装得足够简单,对于我这种十年没写过代码的人还算可以上手。边看春晚和春晚重播读了80多页的developer guide,跟读科幻小说一样欢乐。回来手痒就开始写点东西。

对于我这种初学者每写一行代码都会遇到很多问题,很感谢网络上很多大牛分享的一些学习笔记。所以决定有时间也要把我遇到的一些简单可笑的问题总结一下以示后人。当然,前提是有时间。

周末照例是装修日 + 代码日。一个恼人的bug折磨了我周六晚上好几个小时的时间,好吧 说正事儿。

=====开始说正事儿的分割线======

最近在写一个使用SpriteKit的IOS小游戏联系。在模拟器上运行都没什么问题,真机调试的时候,每次回到HOME的时候,就是applicationDidEnterBackground的时候,程序就会Crush。

报的错误是main.m中 Thread1:EXC_BAD_ACCESS(code=1,address=0x1)。网上搜了一下大概这种问题是ARC错误release的对象再次被release。花了几个小时挨个方法注释代码,终于发现当运行SKAction的-playSoundFileNamed: waitForCompletion: 方法时必出现这个错误。

后来终于在万能的SteakOverFlow找到了遇到同样问题的人,解决办法也在同一个帖子里。

答案在这里http://stackoverflow.com/questions/18976813/sprite-kit-playing-sound-leads-to-app-termination/21349677#21349677

简单的说,是因为-playSoundFileNamed: waitForCompletion: 用到了AVAudioSession类,当应用进入背景运行时,AVAudioSession 必须是非激活的,否则就会报错。然而SpriteKit在播放声音是并没有对其进行处理。解决办法也很简单,就是在应用背景运行时将AVAudioSession设置为inActive,应用回到前景时,重新设置为Active。

具体的处理方式这里就不当搬运工了,大家去看讨论原文吧。