easychen / pushdeer

开放源码的无App推送服务,iOS14+扫码即用。亦支持快应用/iOS和Mac客户端、Android客户端、自制设备
Other
4.62k stars 469 forks source link

尝试直接通过 gorush 命令直接发送 ios 消息,失败,异常信息: #103

Closed zhanghuid closed 2 years ago

zhanghuid commented 2 years ago

使用的是自架服务端,ios 商店下载的自架版

命令行推送异常截图

image

手机或电脑的的详细信息

easychen commented 2 years ago

图片中的提示信息是,deviceToken错误。这里的信息是apple直接返回的,说明在苹果那里这个deviceToken是不存在的。

zhanghuid commented 2 years ago

意思是说,在 由 pushdeer-自架版,上报的device_id

image

是错误的?

导致,在通过 gorush 发送时,传入的 deviceToken 不对?

zhanghuid commented 2 years ago

麻烦告诉一下,如何获取 正确的 deviceToken 呢?

easychen commented 2 years ago

意思是说,在 由 pushdeer-自架版,上报的device_id image 是错误的?

导致,在通过 gorush 发送时,传入的 deviceToken 不对?

deviceToken 可以通过 api 获取 https://github.com/easychen/pushdeer#%E8%AE%BE%E5%A4%87%E5%88%97%E8%A1%A8 ,你通过数据库查看也可以。

但 deviceToken 在应用重装以后会变。 另外也可能是证书(有两个,一个app一个clip)和deviceToken不匹配。

zhanghuid commented 2 years ago

deviceToken 我全试了一遍,都不得行

证书:c.p12,不是直接用 ios 目录下的么,也是不得行,命令如下:

image
easychen commented 2 years ago

deviceToken 我全试了一遍,都不得行

证书:c.p12,不是直接用 ios 目录下的么,也是不得行,命令如下: image

你这证书明明用的是 cc.p12 啊 🤣

zhanghuid commented 2 years ago

不好意思,刚刚穷举了所有的情况,下面是 c.p12的

image
easychen commented 2 years ago

不好意思,刚刚穷举了所有的情况,下面是 c.p12的 image

image

你用的topic 是pushdeer官方版的,要换成自架版 https://github.com/easychen/pushdeer/blob/a9ec7adfb09d6b4daa0022f728af70af45699c10/doc/%E8%B0%83%E8%AF%95%E6%96%87%E6%A1%A3.md#end-point-%E8%BF%9E%E9%80%9A%E6%80%A7%E6%B5%8B%E8%AF%95

zhanghuid commented 2 years ago

topic: com.pushdeer.self.ios 嗯,都试过了,都是一样的错:

image
easychen commented 2 years ago

topic: com.pushdeer.self.ios 嗯,都试过了,都是一样的错: image

我刚才自己架设了一个测试,自架版api接口推送是能用的。如果你确认所有参数和证书都正确,那么可能需要查看 gorush ( https://github.com/appleboy/gorush ) 文档,或者给他们提交issue 了。

xkrfer commented 2 years ago

我在黑苹果上拉gorush源码构建镜像,使用pm2 进行进程管理,启动clip+ios,很神奇的发现clip能发,ios不能发,查看日志发现发送到ios后,ios的gorush转发到clip了,导致clip找不到对应的deviceToken,后面在Linux / M1上构建才正常😂😂

zhanghuid commented 2 years ago

如下验证跟猜想,并非为了推广 bark ,只是做对比分析

进一步测试:

怀疑是 appstore 上的 自架版获取的 deviceToken 的问题?

验证:

  1. 使用同款类型的推送工具bark

  2. 启动 gorush -c ios.yml

    ios.yml 的配置如下

    image

    启动命令如下:

    image
  3. 发送情况:

    image
  4. 是成功

结论:

如上验证过程好像没啥毛病,测试的最终结果也是OK的

猜想2

起因

在测试 bark时, 编排 ios.yml 的时候,看到一个配置项是 false 的,如下,也发送不了,改为 true,就能发送了

ios:
  production:false

猜想,会不会是,如论 bark 还是 pushdeer ,都是采用生产环境的的发送模式呢?

验证

  1. 更改 ios.yml 编排
    ios:
    enabled: true
    key_path: "c.p12"
    key_base64: "" # load iOS key from base64 input
    key_type: "p12" # could be pem, p12 or p8 type
    password: "64wtMhU4mULj" # certificate password, default as empty string.
    production: true
    max_concurrent_pushes: 100 # just for push ios notification
    max_retry: 0 # resend fail notification, default value zero is disabled
    key_id: "66M7BD2GCV" # KeyID from developer account (Certificates, Identifiers & Profiles -> Keys)
    team_id: "HUJ6HAE4VU" # TeamID from developer account (View Account -> Membership)
  2. 启动 & 测试
    • 发送命令
      
      curl -X POST -H 'Content-Type: application/json' -d '{"notifications":[{"tokens":["A9C7BA4CD03C319579A071A3BFB**********CCD2633ACBD2C8E9C274D3A"],"platform":1,"message":"111","topic":"com.pushdeer.self.ios","sound":{"volume":2}}]}' http://127.0.0.1:8888/api/push

4. 效果截图
- 截图1
<img width="1311" alt="image" src="https://user-images.githubusercontent.com/12711819/163300745-7968072b-3335-4853-9ee9-67e71922a104.png">

- 截图2
![image](https://user-images.githubusercontent.com/12711819/163300954-b4375e51-cb3c-4b67-aaac-f33b2bd6b637.png)

## 总结:
1. 为啥会有第一个猜想呢?是因为,我看了 [apns2](https://github.com/sideshow/apns2) 里发送的都是小写的 `deviceToken`
2. 不清楚 ios 的推送流程(包含 apns的推送模式,deviceToken 的获取方案,这里建议,pushdeer 也支持一下,能在设置里,显示 deviceToken,并支持复制)
easychen commented 2 years ago

所以就是因为 gorush 命令行调试时没有添加 --production 参数吧。我本地的环境用的就是dev证书,所以没有遇到这个问题。我会改改调试文档里边的默认参数。

gorush 是一个第三方项目,如果想进一步了解,这里有详细的文档说明

image

关于最后一点建议,我觉得绝大部分用户都不会直接操作deviceToken,所以没必要做到界面上。现在通过api是可以查询的。