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

2020-02-04 17:08:43 +08:00
 jmyz0455

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

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

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

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

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

2101 次点击
所在节点    macOS
8 条回复
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
2020-02-04 20:40:34 +08:00
jmyz0455
2020-02-05 09:27:41 +08:00
@nyanyh 感谢,我先去看文档了。
MartinWu
2020-02-05 14:51:00 +08:00
PS 部分,用 crontab 不就可以了?
MartinWu
2020-02-05 14:51:39 +08:00
主题部分,你看看 bitbar 合适你用不。
jmyz0455
2020-04-16 17:00:51 +08:00
@MartinWu 请问 PS,是指 IOPSCopyPowerSourcesInfo 和 IOPSCopyPowerSourcesList 吗?之前在家里没电脑,现在复工了才开始写🤣
jmyz0455
2020-04-16 21:38:12 +08:00
@nyanyh @MartinWu 找了半天,没查到怎么监听电量,只能拿到运行 app 后的那次,想请教一下:
是不断隔段时间循环获得 kIOPSCurrentCapacityKey 判断比较好,
还是 macOS 有获取,电量百分比改变后触发的方法?
jmyz0455
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 请问应该如何解决呢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642109

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX