Show HN:Nissan LEAF 原生 App 没有桌面小部件?我用我的方式免费实现一个
Nissan 的 LEAF® App 没有 Home Screen Widget,所以我自己做了一个免费的
目录
目录
Nissan 的 App #
Nissan 官方的 NissanConnect® EV & Services iPhone app:
让你管理 LEAF 的独特功能,例如电池充电、调节气候控制和检查电池状态,所有这些都可以在你的移动设备上完成。
这是我的车的 App 截图:
这个 App ... 还行。这是 Apple App Store 上的一个典型评价:
我对这个 App 的主要问题是它缺少一个 home screen widget,我可以用它来快速检查我的汽车的电池状态,不像其他电动汽车品牌如 Rivian, Ford, 和 Lucid 的 App。
第三方 App #
同时,其他人也开发了自己的 Nissan LEAF App,具有自定义的用户界面和附加功能(有些带有 home screen widget!):
不幸的是,据我所知,这些 App 在我居住的北美地区都已无法使用。😞
“My Leaf” 的开发者 在他的博客文章中分享了他的沮丧,解释了 Nissan 对其北美 API 的刻意更改如何迫使他停止对该地区用户的支持:
我只是不想再支持它了,因为 Nissan of North America 一直在阻止第三方客户端。在过去的 12 个月中,我一直在尝试支持该 API。和 Nissan 玩猫捉老鼠的游戏。我根本没有时间和精力继续下去,因为我知道 Nissan 一直在故意破坏第三方客户端。这确实是一个可悲而愚蠢的现实。
项目目标 #
尽管如此,我还是决定接受开发一个 iPhone home screen widget 的挑战,它可以显示我的 Nissan LEAF 汽车的电池充电状态。
我为该项目增加了一个限制:不花钱。我认为 Nissan 的 App 应该已经提供了一个 home screen widget,因此为此项目花费任何资金似乎都不公平。但是,使用我已经可以访问的工具/设备是公平的。
值得注意的是,这排除了使用像 Sidecar 这样的东西,它似乎提供了一个 home screen widget。我认为它看起来非常漂亮,但它需要购买一个无线 On-board Diagnostics (OBD) 扫描仪,外加每月 6.99 美元的订阅费。😓
这也排除了使用流行的 LeafSpyPro app,它同样需要购买一个无线 OBD 扫描仪,并且花费 19.99 美元。据我所知,它本身并不提供 home screen widget,但我认为你可能会使用其数据同步功能开发一个。
结果 #
我很高兴地报告我成功了,而且没花一分钱!这是该 widget 的截图:
如果你点击该 widget,它会打开 NissanConnect App。你会在下面的视频中注意到有一些额外的非理想屏幕转换(更多内容见下文),但是,嘿,一分钱一分货!
你的浏览器不支持嵌入视频,但不用担心,你可以 下载它 并使用你喜欢的视频播放器观看!
工作原理 #
为了降低任何 API 破坏性更改的风险,我只是使用了官方的 NissanConnect App,没有任何修改:
- 我创建了一个包含一个 GitHub Action 的 GitHub repo,该 Action:
- 使用
apkeep
下载 NissanConnect App - 使用 Appium 来:
- 在通过 Android Debugger (ADB) 连接到主机的 Android 设备上安装和启动该 App
- 自动点击 App 的屏幕,使用提供的帐户凭据登录 App
- 在刷新后抓取并输出车辆状态的文本 kevincon/nissan-connect-scraperGitHub Action,用于抓取 NissanConnect® Android App 中关于 Nissan LEAF 车辆的信息。Python00
- 使用
- 我创建了一个单独的 GitHub repo,其中包含一个 GitHub Actions 工作流程,该工作流程计划在一天中多次运行一个作业,该作业:
- 使用 Tailscale 将作业的 GitHub runner 主机临时连接到 tailnet,在该 tailnet 上已经连接了一个带有 2 GB RAM 的 Raspberry Pi 4B(放在我家的桌子上),它运行着带有 ADB 开启的 Android 15
- 通过 ADB 连接到 Raspberry Pi
- 使用存储在 GitHub Actions secrets 中的我的 Nissan 帐户凭据运行来自 (1) 的 GitHub Action
- 格式化抓取的车辆数据,并通过电子邮件将其发送到 IFTTT kevincon/nissan-leaf-widget-updaterGitHub Actions 工作流程,该工作流程按计划运行以使用关于我的 Nissan LEAF 的信息更新我手机上的 widget。null00
- 我在我的 iPhone 上创建了一个名为
OpenNissanConnect
的 Apple Shortcut,该 Shortcut 打开 NissanConnect App:https://www.icloud.com/shortcuts/fd139fa01719483a89fcbde391435ff7 - 我创建了一个免费的 IFTTT applet,该 applet 在由 (2) 中的工作流程发送的电子邮件上触发,并在我的 iPhone 的 home screen widget 上显示电子邮件的正文 “Notification Widget”
Link URL
字段包含一个 TinyURL,它重定向到 shortcuts://run-shortcut?name=OpenNissanConnect
,后者使用 Shortcuts URL scheme 来运行来自 (3) 的 Apple Shortcut。我这样做是因为 IFTTT 似乎检查你提供的 Link URL
实际上是否解析为有效的 Web URL;否则,当你点击 widget 时,IFTTT 网站只会打开并显示错误。
NissanConnect App 的开发者肯定可以进行更改,从而破坏此 widget 的工作方式,但是这些更改从定义上来说也可能会对常规人类用户产生负面影响,我希望他们能避免这种情况。
未来工作 #
我最初的计划是 在云端的 GitHub Actions runner 上运行一个 Android 模拟器,这样我就不需要维护自己的 Android 设备,而且这 几乎 有效(实际上,它确实在使用 arm
Android 模拟器的我的 M3 Apple Silicon macOS 笔记本电脑上有效),但是 NissanConnect App(或者它连接的服务器)似乎可以检测到何时使用 x86_64
Android,然后拒绝登录。或者至少,当我在云端和我拥有的旧 x86_64
笔记本电脑上尝试时,我总是看到以下错误:
不幸的是,在撰写本文时,据我所知:
- 云 VM 环境必须支持嵌套虚拟化才能运行具有硬件加速的 Android 模拟器
- GitHub 提供的唯一 macOS
arm
runner 是 M1 和 M2 机器,但是 嵌套虚拟化仅在 M3 及更高版本上可用 - GitHub 支持的唯一其他
arm
runner 是 Linuxarm64
runner,其 硬件不支持嵌套虚拟化
幸运的是,NissanConnect App 有一个“演示模式”,不需要登录帐户即可使用,所以我能够在云中运行一个 Android 模拟器,作为 GitHub Action 的自动持续集成测试的一部分。
也许 如果 GitHub Actions 在将来添加对 M3 Apple Silicon runner 的支持,那么我就可以切换到在云中免费运行所有这些东西…… 🤞
……或者我可能会换掉我的 Nissan LEAF,并购买另一款具有更好 App 体验的电动汽车,然后再发生这种情况。😅