自定义iOS消息通知

​ 在iOS上,Chanify或者Bark是非常好用的自定义通知app。通过HTTP的形式,就可以给自己自定义发送通知,从而来实现服务器监控或者是消息转发。之前使用Chanify的官方服务器进行ddns的IP变更通知,现在使用SmsForwarder来进行短信的转发。不过默认使用官方服务器,也许有一定的安全隐患,幸好有空闲的服务器和域名,记录一下自建服务器的过程。

配置Chanify

​ 可以从官网clone源码编译安装,或者是使用docker拉取镜像。我这里选择使用docker的方法,因为足够简单。

​ 首先获取镜像,大陆dockerhub连不上自行解决或者参考上一篇文章Docker拉取镜像方法

1
docker pull wizjin/chanify:1.4.3

​ 然后配置docker-compose.yml文件,替换/custom/your/path/为自己的目录,映射端口也可以按需修改。

1
2
3
4
5
6
7
8
9
10
version: "3"
services:
chanify:
image: wizjin/chanify:1.4.3
restart: always
ports:
- 28080:80
volumes:
- /custom/your/path/data:/data
- /custom/your/path/chanify.yml:/root/.chanify.yml

​ 配置同目录下的chanify.yml配置文件,替换endpoint为你自己的访问地址,例如你要是用IP进行访问,那么就改成自己的公网IP地址形式的URL,如果不使用https改成http,但是这样会不太安全,不建议使用,endpoint应该是给app等客户端来使用的,这里配置错误理论来说没有影响,在客户端使用的时候要检查地址、协议对不对。name就是节点名称,随意即可。datapath与上面一致。register这里是配置是否开放注册,如果不开放,设置仅白名单用户ID才能访问。如果你要提供公益服务,让大家都可以访问,那么enabletrue就行。docker镜像默认使用sqlite保存用户ID信息,一般来说是够用了,有使用mysql需求可以根据官网文档增加一个dburl字段配置数据库连接方式,不过得先自己手动新建数据库才行,表会自动创建。

1
2
3
4
5
6
7
8
9
10
server:
endpoint: https://yourdomain.com
host: 0.0.0.0
port: 80
name: HostedChanify
datapath: /data
register:
enable: false
whitelist:
- User ID

​ 最后配置Nginx服务,主要是为了开启https服务。我的nginx配置文件放在/etc/nginx/site-enabled/目录下,一个文件一个服务,因此配置文件会比官网的简单,官网的是使用了nginx的docker容器来进行代理,我由于服务器已经安装nginx了,所以方法稍有不同。修改下面的域名以及代理地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
server_name yourdomain.top;
client_max_body_size 100M;
keepalive_timeout 30;
charset UTF-8;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:28080/;
}
}

​ 我使用certbot来自动化配置ssl、申请免费证书,这里一条命令sudo certbot --nginx选择需要配置的域名、转发所有的http流量,就完成了所有配置。

检测

docker compose up -d就可以直接启动服务了,curl对应端口或者docker logs查看确认服务启动正常。如果没有正常启动请检查配置是否有误。新版的docker直接使用docker compose命令,不需要加短横线。

​ 如果一切顺利,现在访问URL就可以在浏览器中看到一个二维码,手机端APP扫码添加节点。然后创建或者打开一个已经存在的频道,复制自建节点的token,使用curl来测试服务是否正常,能看到hello就表示配置成功。

1
curl --form-string "text=hello" "http://<address>:<port>/v1/sender/<token>"

​ 这里顺便讲一下chanify的一些使用方法。主要是通过http的形式调用接口,可以通过GET和POST请求方式,GET请求比较简单,把参数都放在URL里面就完了。

1
2
3
http://<address>:<port>/v1/sender/<token>/<message>

http://<address>:<port>/v1/sender/<token>?sound=1&priority=10&title=hello&copy=123&autocopy=1

​ 主要是POST方式,一开始对http请求头设置的不对,所以不能正常访问。如果要通过json形式来配置的话,首先修改http头部的Content-Typeapplication/json; charset=utf-8。同样使用curl进行测试。

1
curl -H "Content-Type: application/json; charset=utf-8" -X POST -d '{"title": "test_title", "text":"test_text", "copy":"copy_test", "autocopy": 1}' "https://api.chanify.net/v1/sender/token"
1
2
3
4
5
6
7
8
{
"token": "",
"title": "",
"text": "",
"copy": "",
"autocopy": 1,
"sound": 1
}

​ 在iOS14.5以上的系统中,只能通过下拉通知信息来手动复制,旧版系统可以在设置autocopy后直接复制消息。

​ 这样的话,应该可以通过绝大多数的webhook方法调用自建的chanify节点了。Chanify我使用的比较多,Bark应该与之类似,都可以自建节点来保证安全性。

参考

https://github.com/chanify/chanify

https://github.com/pppscn/SmsForwarder

https://gotify.net/

https://github.com/Finb/Bark