Я новичок в Swift и работаю над небольшим приложением в строке меню, чтобы получить воспроизводимую в данный момент песню в Spotify с помощью ScriptBuilder. У меня проблема с тем, что код не получает значение из текущей воспроизводимой песни при запуске кода в XCode, однако, код отлично работает в Playgrounds. Мне интересно, если это проблема с песочницей, когда я не могу получить эти данные, или у меня просто неправильное понимание того, как структурировать мой код по нескольким файлам. Любое руководство высоко ценится.
Моя текущая структура в XCode:
AppDelegate.swift - я использую метод applicationDidFinishLaunching
, чтобы установить заголовок значка в строке меню = текущая песня , (Никогда не получает значение)
import Cocoa
import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var pt = PlayingTracks()
let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
let icon = NSImage(named: "statusIcon")
icon?.isTemplate = true
let display = pt.getSong()
if display == ""
{
statusItem.button?.title = "?"
}
else
{
statusItem.button?.title = display
}
//statusItem.menu = statusMenu
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
}
GetAudio.swift - здесь я создал код для получения текущей песни.
import Cocoa
import ScriptingBridge
let workspace = NSWorkspace.shared
let apps = workspace.runningApplications
var openMusicApps = [String]()
//var currentApp = [String]()
//SPOTIFY:
@objc protocol SpotifyApplication {
@objc optional var currentTrack: SpotifyTrack {get}
}
extension SBApplication : SpotifyApplication {}
@objc protocol SpotifyTrack {
@objc optional var name: String {get}
@objc optional var album: String {get}
@objc optional var artist: String {get}
}
class PlayingTracks {
let spotifyApp: SpotifyApplication = SBApplication(bundleIdentifier: "com.spotify.Client")!
lazy var sTrack: SpotifyTrack? = spotifyApp.currentTrack!
lazy var sTrackName: String = (sTrack?.name)!
lazy var sArtistName: String = (sTrack?.artist)!
func getSong() -> (String) {
return (sTrackName)
}
}
Это код моей игровой площадки, который работает:
import Cocoa
import AppKit
import ScriptingBridge
@objc public protocol SBObjectProtocol: NSObjectProtocol {
func get() -> Any!
}
@objc public protocol SBApplicationProtocol: SBObjectProtocol {
func activate()
var delegate: SBApplicationDelegate! { get set }
// var running: Bool { @objc(isRunning) get }
}
// MARK: SpotifyApplication
@objc public protocol SpotifyApplication: SBApplicationProtocol {
@objc optional var currentTrack: SpotifyTrack { get } // The current playing track.
//@objc optional var playerState: SpotifyEPlS { get } // Is Spotify stopped, paused, or playing?
@objc optional var name: String { get } // The name of the application.
}
extension SBApplication : SpotifyApplication {
}
// MARK: SpotifyTrack
@objc public protocol SpotifyTrack: SBObjectProtocol {
@objc optional var artist: String { get } // The artist of the track.
@objc optional var album: String { get } // The album of the track.
@objc optional var name: String { get } // The name of the track.
@objc optional var albumArtist: String { get } // That album artist of the track.
}
extension SBObject: SpotifyTrack {
}
class PlayingTracks {
let spotifyApp: SpotifyApplication = SBApplication(bundleIdentifier: "com.spotify.Client")!
lazy var sTrack: SpotifyTrack? = spotifyApp.currentTrack!
lazy var sTrackName = sTrack?.name
lazy var sArtistName = sTrack?.artist
func getSong() -> (String, String) {
return (sTrackName!, sArtistName!)
}
}
let np = PlayingTracks()
np.getSong()