рд╣рдо рдбреЙрдХ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХреНрд╕рдХреЛрдб рдХреЗ рдмрд┐рдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ



рд╣рдо рд╕реНрдЯреЗрдЯрд╕ рдмрд╛рд░ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВрдЧреЗред
рдЖрдкрдХреЛ рдЯрд░реНрдорд┐рдирд▓, рд╕реНрд╡рд┐рдлреНрдЯ рд╕рдВрд╕реНрдХрд░рдг 3.1 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдФрд░ рдХрд┐рд╕реА рднреА рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдореИрдВрдиреЗ рдЗрд╕реЗ macOS Sierra 10.12.6 рдФрд░ macOS Catalina 10.15 рдкрд░ рдЯреЗрд╕реНрдЯ рдХрд┐рдпрд╛ред

рдЯрд░реНрдорд┐рдирд▓ / рдПрдкреНрд▓реАрдХреЗрд╢рди / рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ / рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВред

touch toolbar.swift 

Toolbar.swift рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦреЗрдВ:

 import AppKit var app: NSApplication var statusItem: NSStatusItem #if swift(>=5.1) app = NSApplication.shared statusItem = NSStatusBar.system.statusItem( withLength: CGFloat(NSStatusItem.variableLength)) #else app = NSApplication.shared() statusItem = NSStatusBar.system().statusItem(withLength: CGFloat(32)) #endif if #available(macOS 10.10, *) { statusItem.button?.title = "\u{2699}\u{FE0F}" } // extension // menu app.setActivationPolicy(.prohibited) app.run() 

рднрд╛рд╖рд╛ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рднрд╛рдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд▓рд╛рдЗрди app.setActivationPolicy (.prohibited) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдХреНрд░рд┐рдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЖрдЗрдХрди рдбреЙрдХ рдореЗрдВ рдкреНрд░рдХрдЯ рди рд╣реЛред

рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВ:

 swift toolbar.swift 

рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ "рдмреЗрдХрд╛рд░" рдмрдЯрди рд╕реНрдерд┐рддрд┐ рдкреИрдирд▓ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдореИрдВрдиреЗ UTF рдЧрд┐рдпрд░ рд╕рд┐рдВрдмрд▓ "\ u {2699} \ u {FE0F}" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЖрдк рд╡рд╣ рдЪрд┐рддреНрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рд╕реНрдЯреЗрдЯрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВред



рдЯрд░реНрдорд┐рдирд▓ ctrl-c рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВред

рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП AppDelegate рд╡рд░реНрдЧ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди NSApplication рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ред // рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 extension NSApplication { func runTask(_ appName: String, _ arg: String = "") { let task = Process() #if swift(>=5.1) task.executableURL = URL(fileURLWithPath: "/usr/bin/open") #else task.launchPath = "/usr/bin/open" #endif task.arguments = arg.isEmpty ?[appName] : [arg, appName] #if swift(>=5.1) do {try task.run()} catch {print(error)} #else task.launch() #endif } @objc func securityRun () { self.runTask("/System/Library/PreferencePanes/Security.prefPane") } @objc func diskRun () { self.runTask( "disk utility", "-a") } @objc func automatorRun () { self.runTask( "automator", "-a") } } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рди рдХреЗрд╡рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреЗрдЬреА рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рд┐рд╕реНрдЯрдо рдкреЗрдЬ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЗ рдмрд╛рдж // рдореЗрдиреВ рдкреНрд░рдХрд╛рд░:

 let menu = NSMenu() let items: [String] = ["Security", "Disk Utility", "Automator", "Quit"] var sel: [Selector] = [] let shared = NSApplication.shared #if swift(>=5.1) sel = [ #selector(shared.securityRun), #selector(shared.diskRun), #selector(shared.automatorRun), #selector(shared.terminate)] #else sel = [ #selector(shared().securityRun), #selector(shared().diskRun), #selector(shared().automatorRun), #selector(shared().terminate)] #endif for i in 0..<items.count { menu.addItem(NSMenuItem( title: items[i], action: sel[i], keyEquivalent: "")) if i==items.count-2 { menu.addItem(NSMenuItem.separator()) } } statusItem.menu = menu 

рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ NSApplication рд╡рд░реНрдЧ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рд╕реЗ рдмрдЯрди рдФрд░ рд╕рдВрд▓рдЧреНрди рд╡рд┐рдзрд┐рдпрд╛рдБ рдмрдирд╛рдИрдВред рд╣рдордиреЗ "рдХреНрд╡рд┐рдЯ" рдмрдЯрди рдЬреЛрдбрд╝рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЗ рдмрдЬрд╛рдп, рдЯрд╛рдЗрдк рдХрд░реЗрдВ рд╕реНрд╡рд┐рдлреНрдЯред

 swiftc toolbar.swift 

рдЯреВрд▓рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рд╣реИред рдЗрд╕реЗ рдХрдорд╛рдВрдб рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 ./toolbar 

рдпрджрд┐ рд╣рдо рдЯреВрд▓рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрдмрд▓ рдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред

рдЖрдЗрдП рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рд╕рднреА рдХрдорд╛рдВрдб рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЯреНрд░реА рдмрдирд╛рдПрдВред

 mkdir -p ToolBar.app/Contents/MacOS 

рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪ рдмрджрд▓рддреЗ рд╣реИрдВред

 chmod a+x ToolBar.app 

рдЖрдЗрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБред

 mkdir ToolBar.app/Contents/Resources 

рдорд╛рдирдХ рдЖрдЗрдХрди рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдирд╛рдо рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдмрджрд▓реЗрдВред

 cp /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/ToolbarAdvanced.icns ToolBar.app/Contents/Resources/AppIcon.icns 

рд╕рдВрдХрд▓рд┐рдд рдЯреВрд▓рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ MacOS рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдБред

 mv toolbar ToolBar.app/Contents/MacOS 

рдЯреВрд▓рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдореЛрдб рдмрджрд▓реЗрдВред

 chmod a+x ToolBar.app/Contents/MacOS/toolbar 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ PkgInfo рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВред -N рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ PkgInfo рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЛрдИ рдкрдВрдХреНрддрд┐ рдлрд╝реАрдб рд╡рд░реНрдг рди рд╣реЛред

 echo -n "APPL????" > ToolBar.app/Contents/PkgInfo 

рдПрдХреНрд╕реЗрд╕ рдореЛрдб рдХреЛ PkgInfo рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓реЗрдВред

 chmod a+x ToolBar.app/Contents/PkgInfo 

рдЖрд╡реЗрджрди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдиреНрдпреВрдирддрдо Info.plist рдмрдирд╛рдПрдБ:

 echo '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleIdentifier</key> <string>example.ToolBar</string> <key>CFBundleExecutable</key> <string>toolbar</string> <key>CFBundleIconFile</key> <string>AppIcon</string> </dict> </plist>' > ToolBar.app/Contents/Info.plist 

ToolBar.app рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВред
рдЯрд░реНрдорд┐рдирд▓ рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛ред

 sudo mv ToolBar.app /Applications/Utilities 

рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рдореЗрдВ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рд▓реЙрдиреНрдЪрдкреИрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдпреВрдЯрд┐рд▓рд┐рдЯреА рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдЕрдиреНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)



рдпрд╣ рдСрдЯреЛрд░реБрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ ~ / рд▓рд╛рдЗрдмреНрд░реЗрд░реА / LaunchAgents / example.ToolBar.plistред рдЪрд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рдмрдирд╛рддреЗ рд╣реИрдВ:

 echo '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>example.ToolBar</string> <key>ProgramArguments</key> <array> <string>open</string> <string>/Applications/Utilities/ToolBar.app</string> <string>--args</string> <string>-silent</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>' > ~/Library/LaunchAgents/example.ToolBar.plist 

рдЕрдЧрд░ рд╡рд╛рдВрдЫрд┐рдд рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВред

 ls ~/Library/LaunchAgents 

рд░рд┐рдмреВрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдСрдЯреЛрд░рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд╡реЗрджрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:

 launchctl load -w ~/Library/LaunchAgents/example.ToolBar.plist 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдЗрдХрди рд╕реНрдЯреЗрдЯрд╕ рдмрд╛рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рдФрд░ рдХрдорд╛рдВрдб рдХреЛ рдЕрдирд▓реЛрдб рдХрд░реЗрдВ:

 launchctl unload -w ~/Library/LaunchAgents/example.ToolBar.plist 

рдЕрдм рд╕рд┐рд╕реНрдЯрдо рд░рд┐рдмреВрдЯ рд╣реЛрдиреЗ рдкрд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдбреЙрдХ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдЗрдХрди рд╣рдЯрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЖрдИрдЯреНрдпреВрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдиреА-рдкреНрд▓реЗрдпрд░, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреВрдбреВ рд╕реВрдЪреА рдпрд╛ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi480876/


All Articles