温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - How to send APNs push messages using APNs Auth Key and standard CLI tools?
apple-push-notifications

其他 - 如何使用APNs身份验证密钥和标准CLI工具发送APNs推送消息?

发布于 2020-03-27 10:34:25

Apple最近向APNS添加了一种新的身份验证方法(Apple推送通知身份验证密钥(沙盒和生产))。

在此处输入图片说明

下载的密钥是.p8带有私钥文件:

$ cat APNSAuthKey_3HHEB343FX.p8
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBH...Already.Revoked...lHEjCX1v51W
-----END PRIVATE KEY-----

我正在使用旧方法使用APNs消息-将它们添加到钥匙串中,请求证书并使用OpenSSL将消息发送到gateway.production.push.apple.com:2195

如何使用标准格式的标准CLI Linux工具(OpenSSL,Python等)发送推送通知?

查看更多

查看更多

提问者
Adam Matan
被浏览
62
Jess Thrysoee 2019-10-06 16:14

如果您的计算机上安装了带有HTTP / 2支持的curl和具有ECDSA支持的openssl,则可以使用以下脚本通过APNs Auth Key测试推送通知:

#!/bin/bash

deviceToken=b27371497b85611baf9052b4ccfb9641ab7fea1d01c91732149c99cc3ed9342f

authKey="./APNSAuthKey_ABC1234DEF.p8"
authKeyId=ABC1234DEF
teamId=TEAM123456
bundleId=com.example.myapp
endpoint=https://api.development.push.apple.com

read -r -d '' payload <<-'EOF'
{
   "aps": {
      "badge": 2,
      "category": "mycategory",
      "alert": {
         "title": "my title",
         "subtitle": "my subtitle",
         "body": "my body text message"
      }
   },
   "custom": {
      "mykey": "myvalue"
   }
}
EOF

# --------------------------------------------------------------------------

base64() {
   openssl base64 -e -A | tr -- '+/' '-_' | tr -d =
}

sign() {
   printf "$1" | openssl dgst -binary -sha256 -sign "$authKey" | base64
}

time=$(date +%s)
header=$(printf '{ "alg": "ES256", "kid": "%s" }' "$authKeyId" | base64)
claims=$(printf '{ "iss": "%s", "iat": %d }' "$teamId" "$time" | base64)
jwt="$header.$claims.$(sign $header.$claims)"

curl --verbose \
   --header "content-type: application/json" \
   --header "authorization: bearer $jwt" \
   --header "apns-topic: $bundleId" \
   --data "$payload" \
   $endpoint/3/device/$deviceToken

注意:我使用此脚本的一些细微变化来在带有自制版本的curl和openssl的macOS上进行测试http : //thrysoee.dk/apns/