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

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

  •  
  •   jmyz0455 · 2020-02-04 17:08:43 +08:00 · 1999 次点击
    这是一个创建于 1536 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    - macOS 能获取蓝牙设备的电量吗?我没找着这个 api 。
    8 条回复    2020-04-17 00:08:49 +08:00
    nyanyh
        1
    nyanyh  
       2020-02-04 20:40:10 +08:00
    不需要开发者证书,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  
       2020-02-04 20:40:34 +08:00
    jmyz0455
        3
    jmyz0455  
    OP
       2020-02-05 09:27:41 +08:00
    @nyanyh 感谢,我先去看文档了。
    MartinWu
        4
    MartinWu  
       2020-02-05 14:51:00 +08:00
    PS 部分,用 crontab 不就可以了?
    MartinWu
        5
    MartinWu  
       2020-02-05 14:51:39 +08:00
    主题部分,你看看 bitbar 合适你用不。
    jmyz0455
        6
    jmyz0455  
    OP
       2020-04-16 17:00:51 +08:00
    @MartinWu 请问 PS,是指 IOPSCopyPowerSourcesInfo 和 IOPSCopyPowerSourcesList 吗?之前在家里没电脑,现在复工了才开始写🤣
    jmyz0455
        7
    jmyz0455  
    OP
       2020-04-16 21:38:12 +08:00
    @nyanyh @MartinWu 找了半天,没查到怎么监听电量,只能拿到运行 app 后的那次,想请教一下:
    是不断隔段时间循环获得 kIOPSCurrentCapacityKey 判断比较好,
    还是 macOS 有获取,电量百分比改变后触发的方法?
    jmyz0455
        8
    jmyz0455  
    OP
       2020-04-17 00:08:49 +08:00
    @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 请问应该如何解决呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2857 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:15 · PVG 14:15 · LAX 23:15 · JFK 02:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.