2016-01-25 209 views
4

我有一個WatchKit應用程序,當手表上的按鈕被點擊時,它會通知iOS應用程序播放聲音。出於某種原因,當我使用自定義類來處理設置AVAudioPlayer的實例並播放聲音時,聲音不會播放。如果我在session:didReceiveMessage:replyHandler:之內做到這一點,它會很好。AVAudioPlayer不播放聲音

這是自定義類:

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應用可能沒有播放音頻?

回答

1
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() 
    } 

它工作得很好。

+0

奇怪。這對我也不起作用。但是如果這樣做的話,看起來像是一個問題,那就是當WatchKit發送消息時它不一定會觸發播放聲音,而是在WatchKit會話啓動時播放聲音。 –

1

WatchConnectivity方法在應用程序生命週期中很早就被調用。建議您在AppDelegate或ExtensionDelegate中設置它們。否則,這些方法會在你的委託設置之前被調用,你很可能會錯過它們。

在iOS中,應該在應用程序中調用:didFinishLaunchingWithOptions。在watchOS中,這應該在ExtensionDelegate的init方法中。它在Watch擴展的init方法中的原因是,如果啓動複雜功能,則不會調用applicationDidFinishLaunching方法,但複雜功能和監視擴展都會調用init方法。

如果你需要發送數據到UIViewController就像你的情況,你使用NSNotificationCenter來通知控制器。另外,請記住手錶連接方法都在後臺線程上調用,以防您嘗試更新任何UI。

+0

我試過了,它仍然無法工作。看起來好像在'ChildClass'中有音頻播放是相關的。如果我將音頻代碼移回'session:didReceiveMessage:replyHandler:'它可以工作。 –

2

在播放聲音之前,您的「mySounds」超出了範圍。 將其設爲實例變量並查看會發生什麼。