如何在 WatchOS 上构建带有音频反馈的锻炼应用程序?

2023-11-26

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

有人可以查看我的 swift 代码并帮助我找出我缺少的内容吗?

这是我的扩展Delegate.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()
    }
}

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

这就是我为使其正常工作所做的一切:我更改了扩展 Delegate.swift 第 10 行中的一个单词:

        try audioSession.setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WatchOS 上构建带有音频反馈的锻炼应用程序? 的相关文章

随机推荐