如何写一个 macOS 监听充电百分比,到达设定值后弹出通知的应用? - V2EX
jmyz0455
V2EX    macOS

如何写一个 macOS 监听充电百分比,到达设定值后弹出通知的应用?

  •  
  •   jmyz0455 Feb 4, 2020 2592 views
    This topic created in 2308 days ago, the information mentioned may be changed or developed.

    这个需求比较无聊,请勿喷,我不是直接来求代码的,是问一下方案细节。

    我想自己写一个 .app 应用,可以长驻在顶部菜单栏,在 mbp 充电的时候,监听 macOS 的电池电量百分比,到达某个设定值比如 90% 的时候会以某种方向通知我。

    因为我就只想要这么一个小功能,也不想格外装什么软件,无聊想试着写一下,不知道会踩到什么坑:

    1. 我想应用是长驻顶部菜单栏的,而不是控制台脚本。我没有苹果开发者账号,应该不会有权限问题吧?
    2. 既然不想是有个控制台一直在前台跑,我用 Python 还是 Swift 好?我对两者都不太熟的。
    3. 我没有苹果开发者账号写 .app 随便打包都可以的吧?我没有写过 macOS 应用不太了解会不会有什么限制。

    PS:以前我自己为某个局域网 bbs 写过一个通知器,就是打开 Terminal,跑一个 python 脚本,这个脚本会每隔一分钟请求我本人账号的 bbs 未读通知数,如果这个通知数有变化,就通过 AppleScript 弹出一个通知提醒我。但是这个有个不好的地方就是要一直开着 Terminal。

    Supplement 1    Apr 17, 2020
    感谢 nyanyh 的获取电量的链接,网上复制粘贴了 GCD 定时器和通知中心触发器的代码,磕磕碰碰跑起来了,花了大概半天,接下来一边学 Swift 一边优化一下,有很多语法和表达式我都没见过。不过我还有两个问题想问:

    - 我的通知经常不响的,经常不响,单纯是有文本弹出,这里是不是有什么系统的限制?我的期望是跟微信一样发出有声音的通知,甚至能连发好几个。

    - macOS 能获取蓝牙设备的电量吗?我没找着这个 api 。
    8 replies    2020-04-17 00:08:49 +08:00
    nyanyh
        1
    nyanyh  
       Feb 4, 2020
    不需要开发者证书,Swift 写就够了
    https://stackoverflow.com/questions/34571222/get-battery-percentage-on-mac-in-swift
    https://www.raywenderlich.com/450-menus-and-popovers-in-menu-bar-apps-for-macos
    这两个链接都看一下,半小时之内应该能写好了
    nyanyh
        2
    nyanyh  
       Feb 4, 2020
    jmyz0455
        3
    jmyz0455  
    OP
       Feb 5, 2020
    @nyanyh 感谢,我先去看文档了。
    MartinWu
        4
    MartinWu  
       Feb 5, 2020
    PS 部分,用 crontab 不就可以了?
    MartinWu
        5
    MartinWu  
       Feb 5, 2020
    主题部分,你看看 bitbar 合适你用不。
    jmyz0455
        6
    jmyz0455  
    OP
       Apr 16, 2020
    @MartinWu 请问 PS,是指 IOPSCopyPowerSourcesInfo 和 IOPSCopyPowerSourcesList 吗?之前在家里没电脑,现在复工了才开始写
    jmyz0455
        7
    jmyz0455  
    OP
       Apr 16, 2020
    @nyanyh @MartinWu 找了半天,没查到怎么监听电量,只能拿到运行 app 后的那次,想请教一下:
    是不断隔段时间循环获得 kIOPSCurrentCapacityKey 判断比较好,
    还是 macOS 有获取,电量百分比改变后触发的方法?
    jmyz0455
        8
    jmyz0455  
    OP
       Apr 17, 2020
    @nyanyh 您的链接里,有一句:
    NSUserNotificationCenter.default.delegate = self
    会报错:
    Cannot assign value of type 'MyController' to type 'NSUserNotificationCenterDelegate?'
    不知道怎么解决?
    我在网上 copy 了一段:
    ```
    @IBAction func notificationAction(_ sender: Any) {
    let cOntent= UNMutableNotificationContent()
    content.title = "新的方式"
    content.body = "我是一个新的方式"

    content.userInfo = ["method": "new"]

    content.sound = UNNotificationSound.default
    content.categoryIdentifier = "NOTIFICATION_DEMO"

    let acceptAction = UNNotificationAction(identifier: "SHOW_ACTION", title: "显示", options: .init(rawValue: 0))
    let declineAction = UNNotificationAction(identifier: "CLOSE_ACTION", title: "关闭", options: .init(rawValue: 0))
    let testCategory = UNNotificationCategory(identifier: "NOTIFICATION_DEMO",
    actions: [acceptAction, declineAction],
    intentIdentifiers: [],
    hiddenPreviewsBodyPlaceholder: "",
    options: .customDismissAction)

    let request = UNNotificationRequest(identifier: "NOTIFICATION_DEMO_REQUEST",
    content: content,
    trigger: nil)

    // Schedule the request with the system.
    let notificatiOnCenter= UNUserNotificationCenter.current()
    notificationCenter.delegate = self
    notificationCenter.setNotificationCategories([testCategory])
    notificationCenter.add(request) { (error) in
    if error != nil {
    // Handle any errors.
    }
    }
    }
    ```
    里面的 notificationCenter.delegate = self 也报了同样的错,这个 self 请问应该如何解决呢。
    About     Help     Advertise     Blog     API     FAQ     Solana     5560 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 07:39 PVG 15:39 LAX 00:39 JFK 03:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86