SwiftUI Пытается использовать MPMusicPlayerController и PlaybackState

#ios #swift #swiftui #mpmusicplayercontroller #apple-music

Вопрос:

Я довольно новичок в SwiftUI и изо всех сил пытаюсь использовать документацию Apple Swift. Я пытаюсь получить текущее состояние воспроизводимой сейчас музыки, надеюсь, напечатать что-то вроде

сделал паузу

или

играющий

Итак, вот код, который я придумал.

 import SwiftUI
import MediaPlayer
import AVKit

struct MusicView: View {
        
    @State var playbackState: MPMusicPlaybackState? = MPMusicPlayerController.systemMusicPlayer.playbackState

    @State var updater = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    
    var body: some View {
        Text("Hello")
            .onAppear(){
                print(playbackState)
            }
            .onReceive(updater){_ in
                playbackState = MPMusicPlayerController.systemMusicPlayer.playbackState
                print(playbackState)
            }
    }
}
 

Я нахожу его очень запутанным в использовании, и я не понимаю, почему он постоянно печатается:

Необязательно(__C. MPMusicPlaybackState)

Я понимаю, почему это необязательно, но почему я не могу заставить его напечатать какое-то состояние? И любой исходный код, который я, кажется, нахожу, написан 9 лет назад в Obj-C. На этом этапе мы будем признательны за любую помощь.

Ответ №1:

Свифт не знает, как перевести это перечисление на С в печатный текст для вас. Вы можете использовать switch инструкцию для печати значений.

Вы также можете прослушивать NotificationCenter обновления для изменений состояния, а не использовать Timer .

 extension MPMusicPlaybackState {
    func printState() {
        print(self)
        switch self {
        case .interrupted:
            print("interrupted")
        case .stopped:
            print("stopped")
        case .playing:
            print("playing")
        case .paused:
            print("paused")
        case .seekingForward:
            print("seekingForward")
        case .seekingBackward:
            print("seekingBackward")
        @unknown default:
            break
        }
    }
}

struct MusicView: View {
        
    @State var playbackState: MPMusicPlaybackState? = MPMusicPlayerController.systemMusicPlayer.playbackState
    
    var body: some View {
        Text("Hello")
            .onAppear(){
                playbackState?.printState()
            }
            .onReceive(NotificationCenter.default.publisher(for: .MPMusicPlayerControllerPlaybackStateDidChange)){ _ in
                playbackState = MPMusicPlayerController.systemMusicPlayer.playbackState
                playbackState?.printState()
            }
    }
}