はじめに
Firebase Cloud Messaging でPUSH通知の実装していましたが、なぜか、iosでPUSH通知されなくなっていました。何が原因なのかを切り分けるために、AppleのPUSH通知サービス(APNs)でPUSHが送信されるか試すことにしました。
APNsでの認証ですが、以前使われていた「APNs 証明書」と最近使われている「APNs 認証キー」の2つがあります。「APNs 認証キー」を使ったPUSH通知のスクリプトを記載します。このスクリプトは、macで動かしています。おそらく、curlとopensslがある環境であれば動くと思います。
パラメータは、Firebaseから取得するように書いていますが、APNsのパラメータを使えばPUSH通知できるので、Firebaseを使っていない場合もこのスクリプトでテストできます。
準備
以下のシェルスクリプトで記載するキーID
、チームID
、アプリのバンドルID
は、Firebase Consoleの以下で確認できます。設定
のクラウドメッセージング
からiosアプリ設定
の項目を確認します。図の赤で囲っている部分に、上記の3つのIDが記載されています。
APNs認証キーのファイル
は、Firebaseのここの設定をした時に保存していると思いますので、そのファイルを使います。
PUSH通知のシェルスクリプト
以下のシェルスクリプトの設定項目
以下の5行のパラメータを自分のアプリのパラメータに設定して、シェルスクリプトを動かすとiPhoneへのPUSH通知ができます。
デバイストークン
は、PUSH通知を送信したいiPhoneのデバイストークンを指定してください。
#!/bin/sh
# ------ 設定項目
deviceToken=1234567890abcdefghij # デバイストークン
authKey="./AuthKey_AZ8N4W9YYC.p8" # APNs 認証キーのファイルを指定
authKeyId=AB8C4D9EFG # キー ID
teamId=ABCD12EFGH # チーム ID
bundleId=com.example.appbundleId # アプリのバンドルID
# ------ 設定項目終了
endpoint=https://api.development.Push.Apple.com
read -r -d '' payload <<-'EOF'
{
"aps": {
"alert": {
"title": "notification title",
"subtitle": "notification subtitle",
"body": "notification body "
}
}
}
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