Go的本机Mac API

2021-02-06 20:01:44

MacDriver是用于在Go中使用Apple / Mac API和框架的工具包。目前有3个" layers&#34 ;:

objc包包装了Objective-C运行时以与Objective-C对象和类动态交互:

可可,webkit和核心程序包使用部分Apple / Mac API的包装器类型包装objc。将根据需要手动添加它们,直到我们可以使用架构数据自动执行此过程。这些软件包可让您有效地使用Apple API,就像它们是本地Go库一样,从而使您可以将Mac应用程序(可能还包括iOS,watchOS等)编写为Go应用程序:

func main(){app:=可可粉。 NSApp_WithDidLaunch(func(通知objc.Object){config:= webkit。WKWebViewConfiguration_New()wv:= webkit。WKWebView_Init(core。Rect(0,0,1440,900),config)url:= core。URL(&#34 ; http://progrium.com")req:= core。NSURLRequest_Init(url)wv。LoadRequest(req)w:= cocoa。NSWindow_Init(core。Rect(0,0,1440,900),cocoa。NSClosableWindowMask |可可NSTitledWindowMask,可可NSBackingStoreBuffered,false)w。SetContentView(wv)w。MakeKeyAndOrderFront(w)w。Center()})应用程序。 SetActivationPolicy(可可NSApplicationActivationPolicyRegular)应用程序。 ActivateIgnoringOtherApps(true)应用。跑()}

examples / topframe-非交互式,始终位于顶部的webview,具有120行透明背景,因此您可以使用HTML / JS在屏幕上绘制:

最后,此工具包的常见情况不仅是构建完整的本机应用程序,还包括将Go应用程序与Mac系统(例如Windows,本机菜单,状态图标(系统托盘)等)集成在一起。限制您可以做的事情,它们也是无法组合的。他们都想拥有主线程!

由于这个原因和其他原因,我们通常在与Go应用程序分开的单独流程中运行上述代码。这似乎是倒退了一步,但从某种程度上讲它更安全,更可靠。

桥接程序包利用这种情况来创建更高级的抽象,使其与潜在的跨平台工具包更加一致。您可以以类似于配置管理的方式声明性地描述和修改可复制到桥接过程并应用于Objective-C对象的结构:

包main import(" os"" github.com/progrium/macdriver/bridge")func main(){//启动网桥子进程主机:= bridge。 NewHost(os。Stderr)成为主机。 Run()//创建一个窗口window:= bridge。窗口{标题:"我的标题&#34 ;,大小:桥。大小{W:480,H:240},位置:网桥。点{X:200,Y:200},可关闭:true,最小化:false,可调整大小:false,无边界:false,AlwaysOnTop:true,背景:&bridge。颜色{R:1,G:1,B:1,A:0.5},}主机。 Sync(& window)//更改其标题窗口。标题="我的新标题"主办。 Sync(& window)//销毁窗口主机。释放(& window)}

这是该项目中WIP最多的部分,但是一旦进一步开发,我们就可以使用此API并使用具有相同资源的Windows和Linux构建桥接系统,从而创建跨平台的OS驱动程序。我们将会看到。

据我们所知,由于Go模块的局限性,我们经常需要在开发过程中向go.mod中添加replace指令,以对某些依赖项(例如qtalk)进行本地检出。但是,这些版本不应进行版本控制,因此,现在我们建议您在结帐时使用git update-index --skip-worktree go.mod,如果需要添加替换指令。当需要检查更新时,可以使用git update-index --no-skip-worktree go.mod在本地存储库上将其撤消以提交更改,然后重新启用。

最终,我们可以使用bridgesupport和/或doc模式生成大多数包装器API。但是,APIsis的数量非常可笑,所以有很多我不知道如何自动化的极端情况。我们可以继续根据需要手动创建它们,直到我们有足够的覆盖范围/信心来知道我们如何生成包装器。

原始objc和可变参数程序包是由Mikkel Krautz编写的。可变参数包是使一切变为可能的某种汇编魔术,因为libobjc严重依赖可变参数函数调用,而Cgo中的可变参数调用是不可能的。