当我使用 Xcode 9 构建用 Swift 4 编写的简单菜单栏 cocoa 应用程序时,许多 libswift*.dylib 库被链接/下载/嵌入到 .app 包中,进入 Frameworks 文件夹,如下所示:
我只在我的项目中使用import Cocoa
and import Foundation
,以及一些 @objc 函数作为计时器函数的选择器。我真的不认为我非常简单的菜单栏应用程序需要一些 3D 渲染 Metal 库函数或任何 SwiftOnoneSupport,所以我希望将它们从 .app 包中删除。(相同的库也包含在帮助程序应用程序中,用于在登录时启动功能,这甚至使帮助程序应用程序超过 10 MB)
我本以为 Xcode 实际上会默认复制所需的内容。这里和这里提出了一些类似的问题,但我认为这两个问题都没有令人满意的最新答案。
到目前为止我已经尝试过的
我设置ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
为NO
in Build Settings
. 好像没有什么效果。
我设置LINK_WITH_STANDARD_LIBRARIES
为NO
in Build Settings
. 它毁了一切,无法构建它,即使我尝试在“链接框架和库”部分下自己添加一些框架(Cocoa、Foundation)。
目标
每当标题(或当然是活动应用程序)发生变化时,我想在 Swift 中打印到控制台,最前面的活动应用程序的最前面窗口的完整窗口标题。我对 Swift/Objective-C 都很陌生,所以如果也建议 ObjC 中的任何解决方案,我也会非常高兴。(因为有一个叫做AppleScriptObjc的东西,但我只是不明白它是如何工作的)
到目前为止我做了什么
class activeApp: NSObject {
override init() {
super.init()
NSWorkspace.shared.notificationCenter.addObserver(self,
selector: #selector(printMe(notification:)),
name: NSWorkspace.didActivateApplicationNotification,
object:nil)
}
@objc func printMe(notification: NSNotification) {
let app = notification.userInfo!["NSWorkspaceApplicationKey"] as! NSRunningApplication
let myAppleScript = """
tell application "System Events"
return name of first window of (first application process whose frontmost is true)
end tell
"""
let script = NSAppleScript(source: myAppleScript)!;
var errorDict : NSDictionary?
print(script.executeAndReturnError(&errorDict).stringValue as Any)
print(app.localizedName!)
}
}
let runme = activeApp()
RunLoop.main.run()}
Run Code Online (Sandbox Code Playgroud)
我知道此代码仅在活动应用程序更改时打印窗口标题和活动应用程序,而不是在同一应用程序中标题更改时打印。但是,我想在处理控制台上显示的错误后处理该问题。 …
macos ×2
applescript ×1
dylib ×1
frameworks ×1
objective-c ×1
optimization ×1
swift ×1
xcode ×1