主要是在使用 mac os 的时候,我一直对 mac 的窗口管理很不爽。现在使用 ubar ,大概满足了需求,但也有一些地方用着不太舒服。
过年了,有段闲暇时间,想学习一下 mac os 开发。我桌面应用开发的经验为 0 ,想问下需要怎么样的学习曲线?
mac os 的资源,感觉好少。还是说我没有找对
求带带路
研究了一个晚上,写了个大概。
1
xtinput 2023-01-12 12:42:33 +08:00
我搞 iOS 的都感觉学不动 macOS 开发
|
2
HHHans 2023-01-12 13:20:14 +08:00
资料特别少而且主要集中在英文互联网
可以试着先从 SwiftUI 入手搭一搭 UI |
3
jay435990054 2023-01-12 13:21:13 +08:00
我做了两年 mac os 开发 你想开发什么东西呢
|
4
MakHoCheung 2023-01-12 13:29:21 +08:00
我是用 SwiftUI 来开发 macOS 应用的,但是你这个需求很高级,感觉要会 Appkit 和 系统调用才能做出来
|
5
cxtrinityy 2023-01-12 13:35:25 +08:00 via Android
虽然但是,单纯窗口管理不妨写写 hammerspoon 脚本看能不能解决
|
6
murmur 2023-01-12 13:53:34 +08:00
窗口管理不爽你得换 windows ,这么底层的东西你做 app 是搞不定的
|
7
covvee OP @jay435990054 类似 ubar
|
8
halowang1991 2023-01-12 16:09:50 +08:00 1
我最近也在学, 就疯狂的用 google 搜索 “swift macOS 你自己想要的功能”, 还真学到了一些东西.
对于初学者来说, 我感觉 macOS dev 和 iOS dev 的一个核心区别就是多个 Window 或一个 Window |
9
halowang1991 2023-01-12 16:12:20 +08:00
iOS 中我们往往在一个 UIWindow 中精耕细作, 但是 macOS 就需要面对多个 NSWindow 了. 而其他功能, 对于我来说, 更多地是基于自己之前的 iOS 开发经验, 顺藤摸瓜实现
|
10
halowang1991 2023-01-12 16:16:46 +08:00 1
不过 OP 做的东西我感觉还要和大量的系统级 API 进行交互...我感觉还是蛮难的, 很多东西只能从 apple 自己的开发者文档中摸索
|
11
objectxiang 2023-01-12 17:51:25 +08:00
macOS 老开发来说一句,多看文档学点 Cocoa 。毕竟以后都是 SwiftUI ,很多实现不了的还是要 Cocoa 。
|
12
justin2018 2023-01-12 17:56:54 +08:00
比 iOS 难度大
macOS 有的 API 连个 Demo 都没有 完全没法下手 很佩服做 Mac 开发的老铁 高手 |
13
paopaosa 2023-01-12 19:29:24 +08:00
官网查查 AppKit 的文档,github 上搜索下相关的开源项目,应该能搞定吧。
|
14
LINAICAI 2023-01-12 20:09:48 +08:00
macOS 不值得你学,太难了,我 iOS 快 10 年了依然学不会,其次你学来赚不到钱。
|
15
fengleiyidao 2023-01-12 20:13:48 +08:00
你说这个 app ,更主要的是摸索系统 api
|
16
pocarisweat 2023-01-12 20:58:22 +08:00 1
分两个部分:一个是界面,一个是系统延伸功能。
写界面可以用很多框架包括 Web ,但这里假定讨论的是原生。macOS 原生的 GUI API 就是 Cocoa ,AppKit 指 Cocoa 里面真正涉及 GUI 的那部分,通常这两个词都交替使用不作区分。放在二十年前那个年代,Cocoa 包括 Objective-C 都相当先进,但到今天程序员都习惯了 MVVM 和 Web 那一套更方便的技术,再回到 MVC 就有些难受了。而且 AppKit 因为历史较早,其 API 很多地方比 iOS 的 UIKit 难受很多,所以能 SwiftUI 就 SwiftUI 吧。 系统功能这块,其实 macOS 系统的 API 能实现的可能不少,但想实现某个需求时很难知道自己可以用哪个 API ,这点其实连 Windows 也差不多。比如我在用一个小开源软件,它能让鼠标和触控板使用相反的滚动方向。因为系统不支持这个设置,所以我以为没法实现,看了它的源码才发现:哦,原来系统有一个可以拦截外设事件的接口。这个 API 文档里有,但没看到过就是想不起来。这个就只能靠多看开源项目和翻文档列表了。 |
17
LINAICAI 2023-01-12 23:25:20 +08:00
Appkit 真一言难尽啊,也就那样摆烂了。
|
18
covvee OP 楼上朋友们快成功把我劝退了,哈哈哈
|
19
covvee OP |
20
em70 2023-01-13 00:19:14 +08:00
delphi 11 是开发 mac 桌面程序,最简单的方案,拖拽式开发,资料也够,但需要 win 系统
|
21
halowang1991 2023-01-13 00:55:11 +08:00
虽然 OP 说不是 window management, 不过, 如果真的是窗口管理这种高大上的活儿,
Quartz Window Services https://developer.apple.com/documentation/coregraphics/quartz_window_services 可以一看 |
22
netabare 2023-01-13 01:37:46 +08:00 via Android 1
可以试试看有没有类似的,功能不相同但原理差不多的项目,fork 一下慢慢研究。
不过如果要实现的功能需要用私有 api 的话感觉就够呛… |
23
jay435990054 2023-01-13 08:26:07 +08:00
@objectxiang 能加个微吗 我也是做 mac 开发
|
24
objectxiang 2023-01-13 09:53:22 +08:00
@jay435990054 ODUzNjg2NTcwMTg=
|
25
covvee OP @objectxiang 老哥,能否请教一个问题。
``` let options = CGWindowListOption(arrayLiteral: .excludeDesktopElements, .optionOnScreenOnly) let windowsListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0)) let infoList = windowsListInfo as! [[String:Any]] let visibleWindows = infoList.filter{ $0["kCGWindowLayer"] as! Int == 0 } ``` 我观察到,他们用的是同一个 Pid,但是有不同的 kCGWindowNumber 现在我查到能用上面这样子去得到所有打开的 window 窗口,但是有什么的方法,可以指定打开某个 window 吗? 比如说我 vscode 打开了两个窗口,一个 window 写前端,一个写后端。swift 现在有没有哪个 api 可以指定打开某个 window? 查了一个早上,也看到很多人有相同的问题,都没有得到答案。 |
26
covvee OP |
27
songquan 2023-01-15 09:02:40 +08:00
@covvee 看到这一条,我激动得很啊,因为 ubar 这个软件我确实很喜欢,不得不说 window 的任务栏确实是生产力神器,mac 的 dock 虽然优雅,但是无法通过肌肉记忆完成操作,并且窗口识别和切换逻辑混乱。可惜 ubar 已经接近停更了,期待你的作品!
|
29
objectxiang 2023-01-16 22:35:14 +08:00
@covvee 据我所知,正常很难实现这个,没有现成 API
|
30
covvee OP @objectxiang 这个我现在勉强搞定了。
还有一个问题,比如说微信,当我点了最小化或者关闭按钮之后,我用 NSWorkspace.shared.runningApplications 就拿不到了。 我想请问一个问题,怎么判断一个应用,是可以收缩在右上角 status bar 的?或者这么说,我可以怎么样去拿到 status bar 上面的应用列表? |
31
objectxiang 2023-01-17 13:13:07 +08:00 1
@covvee CGWindowListCopyWindowInfo 列表的 window level = 25 就是了,正在运行的程序的话,需要更低级别的 API 才能准确获取
|
32
covvee OP @objectxiang 非常感谢。我能不能再问最后一个问题,如何监听到有新的通知?比如说微信等应用,我希望能监听到它们来了新消息,可以显示小红点。
|
33
squallsdjl 282 天前
哈哈哈,搜 macos 搜到这里,兄弟现在开发能力如何,我最近想求 macos 开发组队,但是找不到人
|