AVAudioPlayer不能播放声音

我有一个WatchKit应用程序,当在手表上点击一个button时,它会通知iOS应用程序播放声音。 出于某种原因,当我使用自定义类来处理设置AVAudioPlayer的实例并播放声音时,声音不会播放。 如果我在session:didReceiveMessage:replyHandler:做了这个部分session:didReceiveMessage:replyHandler:它会正常播放。

这是自定义类:

 import AVFoundation class ChildClass { let mySound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("test", ofType: "wav")!) var audioPlayer: AVAudioPlayer! func playSound() { do { print("Playing sound") self.audioPlayer = try AVAudioPlayer(contentsOfURL: mySound) self.audioPlayer.play() } catch { print("Error getting audio file") } } } 

在我的ViewController中实例化的是:

 class ViewController: UIViewController, WCSessionDelegate { var session: WCSession! override func viewDidLoad() { super.viewDidLoad() if WCSession.isSupported() { session = WCSession.defaultSession() session.delegate = self session.activateSession() } } func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { let mySounds = ChildClass() mySounds.playSound() } } 

ChildClass.playSound()设置断点我可以确认它正在调用。 但是,不仅声音不起作用,而且print()也不会向控制台输出任何东西。

是否有一些AVAudioPlayer实例在自定义类中,导致它不能播放声音? 或者,也许由于某种原因,iOS应用程序没有播放audio?

声音可以播放之前,你的“mySounds”超出了范围。 把它作为一个实例variables,看看会发生什么。

 func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { let mySounds = ChildClass() mySounds.playSound() } 

没有被调用。 我试着把代码放在里面

 if WCSession.isSupported() { session = WCSession.defaultSession() session.delegate = self session.activateSession() let mySounds = ChildClass() mySounds.playSound() } 

它工作得很好。

WatchConnectivity方法在应用程序生命周期中很早就被调用。 build议您在AppDelegate或ExtensionDelegate中设置它们。 否则,在你的委托设置之前,方法会被调用,你很可能会错过它们。

在iOS中,这应该在application:didFinishLaunchingWithOptions中调用。 在watchOS中,这应该在ExtensionDelegate的init方法中。 它在监视扩展的init方法中的原因是,如果启动复杂function,则不会调用applicationDidFinishLaunching方法,但复杂function和监视扩展都会调用init方法。

如果你需要发送数据到一个UIViewController就像你的情况,你使用NSNotificationCenter来通知控制器。 此外,请记住手表连接方法都在后台线程上调用,以防您尝试更新任何用户界面。