Требует ли ScriptBuilder специальных разрешений для доступа к внешним приложениям? - PullRequest
1 голос
/ 03 февраля 2020

Я новичок в Swift и работаю над небольшим приложением в строке меню, чтобы получить воспроизводимую в данный момент песню в Spotify с помощью ScriptBuilder. У меня проблема с тем, что код не получает значение из текущей воспроизводимой песни при запуске кода в XCode, однако, код отлично работает в Playgrounds. Мне интересно, если это проблема с песочницей, когда я не могу получить эти данные, или у меня просто неправильное понимание того, как структурировать мой код по нескольким файлам. Любое руководство высоко ценится.

Моя текущая структура в XCode:

  1. 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
            }
        }
    
  2. 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)
    
        }
    
    }
    
  3. Это код моей игровой площадки, который работает:

    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()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...