此為 Apple 官方針對遠距推播給出的命令列指令,文件網址如下。
將以下 shell srcript 程式存檔,執行時在終端機使用 source 指令執行。
使用 JWT 方式發送
TEAM_ID=開發者編號
TOKEN_KEY_FILE_NAME=AuthKey_JWT編號.p8
AUTH_KEY_ID=JWT編號
TOPIC=App_Bundle_ID
DEVICE_TOKEN=App跟APNs註冊後取得的Token
# Development server
APNS_HOST_NAME=api.sandbox.push.apple.com
# Production server
# APNS_HOST_NAME=api.push.apple.com
### 以下勿改 ###
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}"
### 以上勿改 ###
### 以下可以改
PAYLOAD='
{
"aps": {
"alert": {
"title": "標題",
"subtitle": "副標題",
"body": "這裡是推播內容"
},
"badge": 1,
"sound": "default"
}
}
'
curl -v --header "apns-topic: $TOPIC" \
--header "apns-push-type: alert" \
--header "authorization: bearer $AUTHENTICATION_TOKEN" \
--data "$PAYLOAD" \
--http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}
使用憑證發送方式
CERTIFICATE_FILE_NAME=憑證.cer
CERTIFICATE_KEY_FILE_NAME=key.pem
TOPIC=App_Bundle_ID
DEVICE_TOKEN=App跟APNs註冊後取得的Token
# Development server
APNS_HOST_NAME=api.sandbox.push.apple.com
# Production server
# APNS_HOST_NAME=api.push.apple.com
PAYLOAD='
{
"aps": {
"alert": {
"title": "標題",
"subtitle": "副標題",
"body": "這裡是推播內容"
},
"badge": 1,
"sound": "default"
}
}
'
curl -v --header "apns-topic: ${TOPIC}" \
--header "apns-push-type: alert" \
--cert "${CERTIFICATE_FILE_NAME}" \
--cert-type DER \
--key "${CERTIFICATE_KEY_FILE_NAME}" \
--key-type PEM \
--data "${PAYLOAD}" \
--http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}
JSON payload 格式請參考 Apple 官方網站。
https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification