使用 Chanify 实现往手机上推送消息
一直想找一个可自己运营的通知消息推送方案,一来免费,二来安全。 它可以作为我的博客的通知服务推送到我的手机(比如有新的评论的时候,邮件不及时),也可以把树莓派的状态信息同步到手机上,等等。 早早地把 Telegram Bot 的 API 给看了,能满足需求,但是由于偷懒一直没有写。 几年前也萌生过写 App 的,甚至看完了《Objective-C ……》,没有继续搞下去…… 不然就完全可以自己写一个了。毕竟自己写的最适合了。
- 支持 iOS 系统(不支持安卓)
- 支持 自定义消息分组(频道)
- 支持 部署自己的节点服务器
- 支持 文本 / 图片 / 文件 等多种消息格式
- 简单(通过 HTTP 接口即可推送消息)
- 开源(还是我喜欢的 Go 语言)!
一下就来了兴趣,马上下载下来试用,试用体验非常满意!所以写下这篇文章,安利给有同样需求的朋友 😜 。
官方的 README 已经有非常详细的使用文档,每一步的操作我就不赘述了。 但是出于文章开头提到的安全方面的考虑,我按照官方教程自己跑了一个有状态的服务器。 有状态的服务器会直接把我的消息发送给苹果的服务器,而不会走作者们提供的 https://api.chanify.net 代理后发送给苹果的服务器(不是质疑他们的人品,而且个人习惯性只相信自己),这是和无状态服务器在调用链路上的一个主要区别。
鉴于我并不是很懂苹果的消息推送机制,是不是不走作者的代理服务器就安全了?我不知道。 于是我“审查”了一下服务器的代码(看作者代码整体风格有点像是来自微信团队的成员?我不是微信的,但是看过前微信同事写的代码),发现,只有在“作为无状态服务器”时,即由作者的服务器代理帮忙发送消息时,才会访问作者的 API 网站。这样可以确保是“自己运营的”。 另外有一点值得一提的是,我看到代码中使用了作者的私钥来连接苹果的推送服务器,我不知道私钥的所有者是否可以在苹果官网查看“已发送”消息(希望有苹果开发者可以告知一下)。
有状态服务器和无状态服务器的另一个主要区别是,有状态的服务器的“状态”会存储用户信息等到本地数据库(不包含已发送消息)。对我自己的数据持有所有权也是我历来推崇的,所以综合这些考量,我部署了自己的有状态服务器。
下面贴一份我的配置文件,供有需求的朋友参考一下。
-
docker-compose.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14
--- version: "2" services: chanify: image: wizjin/chanify:latest command: --config chanify.yaml serve working_dir: /workspace/ environment: - TZ=Asia/Shanghai volumes: - .:/workspace/ ports: - 1674:1674 restart: unless-stopped
-
chanify.yaml
1 2 3 4 5 6 7 8 9 10
server: host: 0.0.0.0 port: 1674 endpoint: # 你的 API 地址 name: main datapath: /workspace/ register: enable: false whitelist: - # 从你的手机上拷贝用户 ID