Supplementary note, the following shell is executed to send the message
DEVICE_TOKEN=xxxxx
APNS_HOST_NAME=api.sandbox.push.apple.com
TEAM_ID=team_id
TOKEN_KEY_FILE_NAME=file_name.p9
AUTH_KEY_ID=id
TOPIC=widget_topic
JWT_ISSUE_TIME=$(date +%s)
JWT_HEADER=$(printf '{ "alg": "ES256", "kid": "%s" }' "${AUTH_KEY_ID}" | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
JWT_CLAIMS=$(printf '{ "iss": "%s", "iat": %d }' "${TEAM_ID}" "${JWT_ISSUE_TIME}" | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
JWT_HEADER_CLAIMS="${JWT_HEADER}.${JWT_CLAIMS}"
JWT_SIGNED_HEADER_CLAIMS=$(printf "${JWT_HEADER_CLAIMS}" | openssl dgst -binary -sha256 -sign "${TOKEN_KEY_FILE_NAME}" | openssl base64 -e -A | tr -- '+/' '-_' | tr -d =)
AUTHENTICATION_TOKEN="${JWT_HEADER}.${JWT_CLAIMS}.${JWT_SIGNED_HEADER_CLAIMS}"
curl -v \
--header "apns-topic: $TOPIC" \
--header "apns-push-type: widgets" \
--header "authorization: bearer $AUTHENTICATION_TOKEN" \
--data '{"aps":{"content-changed": true}}' \
--http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}