V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
covvee
V2EX  ›  macOS

闲暇时间想学习下 mac os 开发,请问一下学习曲线是怎么样的

  •  
  •   covvee · 2023-01-12 12:40:57 +08:00 · 3844 次点击
    这是一个创建于 714 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主要是在使用 mac os 的时候,我一直对 mac 的窗口管理很不爽。现在使用 ubar ,大概满足了需求,但也有一些地方用着不太舒服。

    过年了,有段闲暇时间,想学习一下 mac os 开发。我桌面应用开发的经验为 0 ,想问下需要怎么样的学习曲线?

    mac os 的资源,感觉好少。还是说我没有找对

    求带带路

    第 1 条附言  ·  2023-01-12 17:02:55 +08:00
    我可能说错了,我想做的不是窗口管理这么高大上,高难度的 app

    我只是想实现一个 dock 栏
    第 2 条附言  ·  2023-01-13 00:09:39 +08:00
    我找到一个项目可以用来学习学习了

    https://github.com/WilsonGramer/wwdc21-dock
    第 3 条附言  ·  2023-01-13 10:10:33 +08:00

    研究了一个晚上,写了个大概。

    dock

    第 4 条附言  ·  2023-01-13 10:11:25 +08:00
    ![dock]( )
    33 条回复    2024-02-15 23:30:37 +08:00
    xtinput
        1
    xtinput  
       2023-01-12 12:42:33 +08:00
    我搞 iOS 的都感觉学不动 macOS 开发
    HHHans
        2
    HHHans  
       2023-01-12 13:20:14 +08:00
    资料特别少而且主要集中在英文互联网
    可以试着先从 SwiftUI 入手搭一搭 UI
    jay435990054
        3
    jay435990054  
       2023-01-12 13:21:13 +08:00
    我做了两年 mac os 开发 你想开发什么东西呢
    MakHoCheung
        4
    MakHoCheung  
       2023-01-12 13:29:21 +08:00
    我是用 SwiftUI 来开发 macOS 应用的,但是你这个需求很高级,感觉要会 Appkit 和 系统调用才能做出来
    cxtrinityy
        5
    cxtrinityy  
       2023-01-12 13:35:25 +08:00 via Android
    虽然但是,单纯窗口管理不妨写写 hammerspoon 脚本看能不能解决
    murmur
        6
    murmur  
       2023-01-12 13:53:34 +08:00
    窗口管理不爽你得换 windows ,这么底层的东西你做 app 是搞不定的
    covvee
        7
    covvee  
    OP
       2023-01-12 14:43:56 +08:00
    @jay435990054 类似 ubar
    halowang1991
        8
    halowang1991  
       2023-01-12 16:09:50 +08:00   ❤️ 1
    我最近也在学, 就疯狂的用 google 搜索 “swift macOS 你自己想要的功能”, 还真学到了一些东西.

    对于初学者来说, 我感觉 macOS dev 和 iOS dev 的一个核心区别就是多个 Window 或一个 Window
    halowang1991
        9
    halowang1991  
       2023-01-12 16:12:20 +08:00
    iOS 中我们往往在一个 UIWindow 中精耕细作, 但是 macOS 就需要面对多个 NSWindow 了. 而其他功能, 对于我来说, 更多地是基于自己之前的 iOS 开发经验, 顺藤摸瓜实现
    halowang1991
        10
    halowang1991  
       2023-01-12 16:16:46 +08:00   ❤️ 1
    不过 OP 做的东西我感觉还要和大量的系统级 API 进行交互...我感觉还是蛮难的, 很多东西只能从 apple 自己的开发者文档中摸索
    objectxiang
        11
    objectxiang  
       2023-01-12 17:51:25 +08:00
    macOS 老开发来说一句,多看文档学点 Cocoa 。毕竟以后都是 SwiftUI ,很多实现不了的还是要 Cocoa 。
    justin2018
        12
    justin2018  
       2023-01-12 17:56:54 +08:00
    比 iOS 难度大

    macOS 有的 API 连个 Demo 都没有 完全没法下手

    很佩服做 Mac 开发的老铁 高手
    paopaosa
        13
    paopaosa  
       2023-01-12 19:29:24 +08:00
    官网查查 AppKit 的文档,github 上搜索下相关的开源项目,应该能搞定吧。
    LINAICAI
        14
    LINAICAI  
       2023-01-12 20:09:48 +08:00
    macOS 不值得你学,太难了,我 iOS 快 10 年了依然学不会,其次你学来赚不到钱。
    fengleiyidao
        15
    fengleiyidao  
       2023-01-12 20:13:48 +08:00
    你说这个 app ,更主要的是摸索系统 api
    pocarisweat
        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 文档里有,但没看到过就是想不起来。这个就只能靠多看开源项目和翻文档列表了。
    LINAICAI
        17
    LINAICAI  
       2023-01-12 23:25:20 +08:00
    Appkit 真一言难尽啊,也就那样摆烂了。
    covvee
        18
    covvee  
    OP
       2023-01-12 23:40:45 +08:00
    楼上朋友们快成功把我劝退了,哈哈哈
    covvee
        19
    covvee  
    OP
       2023-01-13 00:09:27 +08:00
    我找到一个项目可以用来学习学习了

    https://github.com/WilsonGramer/wwdc21-dock
    em70
        20
    em70  
       2023-01-13 00:19:14 +08:00
    delphi 11 是开发 mac 桌面程序,最简单的方案,拖拽式开发,资料也够,但需要 win 系统
    halowang1991
        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

    可以一看
    netabare
        22
    netabare  
       2023-01-13 01:37:46 +08:00 via Android   ❤️ 1
    可以试试看有没有类似的,功能不相同但原理差不多的项目,fork 一下慢慢研究。

    不过如果要实现的功能需要用私有 api 的话感觉就够呛…
    jay435990054
        23
    jay435990054  
       2023-01-13 08:26:07 +08:00
    @objectxiang 能加个微吗 我也是做 mac 开发
    objectxiang
        24
    objectxiang  
       2023-01-13 09:53:22 +08:00
    @jay435990054 ODUzNjg2NTcwMTg=
    covvee
        25
    covvee  
    OP
       2023-01-13 13:47:55 +08:00
    @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?

    查了一个早上,也看到很多人有相同的问题,都没有得到答案。
    covvee
        26
    covvee  
    OP
       2023-01-13 13:56:34 +08:00
    songquan
        27
    songquan  
       2023-01-15 09:02:40 +08:00
    @covvee 看到这一条,我激动得很啊,因为 ubar 这个软件我确实很喜欢,不得不说 window 的任务栏确实是生产力神器,mac 的 dock 虽然优雅,但是无法通过肌肉记忆完成操作,并且窗口识别和切换逻辑混乱。可惜 ubar 已经接近停更了,期待你的作品!
    covvee
        28
    covvee  
    OP
       2023-01-15 17:44:22 +08:00
    @songquan 还在尝试,有很多难题在研究。比想像的麻烦太多
    objectxiang
        29
    objectxiang  
       2023-01-16 22:35:14 +08:00
    @covvee 据我所知,正常很难实现这个,没有现成 API
    covvee
        30
    covvee  
    OP
       2023-01-17 11:04:42 +08:00
    @objectxiang 这个我现在勉强搞定了。

    还有一个问题,比如说微信,当我点了最小化或者关闭按钮之后,我用 NSWorkspace.shared.runningApplications 就拿不到了。

    我想请问一个问题,怎么判断一个应用,是可以收缩在右上角 status bar 的?或者这么说,我可以怎么样去拿到 status bar 上面的应用列表?
    objectxiang
        31
    objectxiang  
       2023-01-17 13:13:07 +08:00   ❤️ 1
    @covvee CGWindowListCopyWindowInfo 列表的 window level = 25 就是了,正在运行的程序的话,需要更低级别的 API 才能准确获取
    covvee
        32
    covvee  
    OP
       2023-01-17 14:37:21 +08:00
    @objectxiang 非常感谢。我能不能再问最后一个问题,如何监听到有新的通知?比如说微信等应用,我希望能监听到它们来了新消息,可以显示小红点。
    squallsdjl
        33
    squallsdjl  
       315 天前
    哈哈哈,搜 macos 搜到这里,兄弟现在开发能力如何,我最近想求 macos 开发组队,但是找不到人
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1098 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:59 · PVG 06:59 · LAX 14:59 · JFK 17:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.