如何使用音频反馈在WatchOS上构建Workout应用程序?

时间:2017-04-03 16:55:48

标签: swift avaudioplayer watch-os-3

我正在WatchOS上构建一个非常简单的锻炼应用程序:其中一个功能是在训练期间提供音频反馈。我可以在显示器打开时播放文件,但是当显示器很暗时,手表不会播放我的文件。

有人可以查看我的快速代码并帮助我弄清楚我错过了什么吗?

这是我的extensionDelegate.swift:

var audioPlayer = AVAudioPlayer()

class ExtensionDelegate: NSObject, WKExtensionDelegate {


   func applicationDidFinishLaunching() {
    let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.setCategory(AVAudioSessionCategoryAmbient, with: .duckOthers)
    } catch {
        print("audiosession cannot be set")
    }
    do { try audioSession.setActive(true) }
    catch {
        print ("audiosession cannot be activated")
    }


    let test = URL(fileURLWithPath: Bundle.main.path(forResource: "1", ofType: "m4a")!)
    try! audioPlayer = AVAudioPlayer(contentsOf: test)
    audioPlayer.prepareToPlay()
    audioPlayer.play()



}

func applicationDidBecomeActive() {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print ("shared Instance could not be activated")
    }
}

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
        // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one.
    for task : WKRefreshBackgroundTask in backgroundTasks {
        // Check the Class of each task to decide how to process it

        print ("received background tasks")
        if task is WKApplicationRefreshBackgroundTask {
            // Be sure to complete the background task once you’re done.
            let backgroundTask : WKApplicationRefreshBackgroundTask = task as! WKApplicationRefreshBackgroundTask
            backgroundTask.setTaskCompleted()
        } else if task is WKSnapshotRefreshBackgroundTask {
            // Snapshot tasks have a unique completion call, make sure to set your expiration date
            let backgroundTask : WKSnapshotRefreshBackgroundTask = task as! WKSnapshotRefreshBackgroundTask
            backgroundTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: .distantFuture, userInfo: nil)
        } else if task is WKWatchConnectivityRefreshBackgroundTask {
            // Be sure to complete the background task once you’re done.
            let backgroundTask : WKWatchConnectivityRefreshBackgroundTask = task as! WKWatchConnectivityRefreshBackgroundTask
            backgroundTask.setTaskCompleted()
        } else if task is WKURLSessionRefreshBackgroundTask {
            // Be sure to complete the background task once you’re done.
            let backgroundTask : WKURLSessionRefreshBackgroundTask = task as! WKURLSessionRefreshBackgroundTask
            backgroundTask.setTaskCompleted()
        } else {
            // make sure to complete unhandled task types
            task.setTaskCompleted()
        }
    }
}

在InterfaceController.swift中我调用函数:

    func startTimer() {
    // every 30 seconds
    print ("timer function started")

    timer = Timer.scheduledTimer(withTimeInterval: 30.0, repeats: true) { [weak self] _ in
        print("play")
        audioPlayer.play()
    }
}

1 个答案:

答案 0 :(得分:4)

我弄清楚我做错了什么: 要关闭屏幕播放声音,将类别设置为AVAudioSessionCategoryPlayback非常重要,而不是环境。

这就是我所做的就是让它工作:我在extensionDelegate.swift的第10行中改了一个字:

        try audioSession.setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers)