Sending Push Notifications Using Command-Line Tools

Panther·2021년 8월 17일
0
post-custom-banner

https://developer.apple.com/documentation/usernotifications/sending_push_notifications_using_command-line_tools

"Use basic macOS command-line tools to send push notifications to Apple Push Notification service (APNs)."

애플 푸시 노티피케이션 서비스(APNs)에 푸시 노티피케이션을 전송하기 위해 기본적인 macOS 커맨드 라인 툴을 사용합니다.

Overview

테스트 앱을 작성해서 APNs 연결 및 설정을 테스트하는 것은 많은 노력을 기울여야 하고 시간을 소모할 수 있습니다. 아래에 설명하고 있는 커맨드 라인 툴은 nonproduction-quality 테스트 suite 혹은 앱에서 APNs에 대한 설정을 테스트할 수 있는 빠른 방법을 제공합니다.

시작하기 전에 아래 내용을 확인해야 합니다.

  • 타깃 기기가 잠금해제되어 있어야 하고 인터넷에 연결되어 있어야 합니다.
  • 앱이 열려있고 포어그라운드에 있어야 합니다.

Send a Push Notification Using a Certificate

필요한 것은 아래와 같습니다.

  • APNs 샌드박스에 연결을 위한 WWDR로부터의 DER-encoded 인증서입니다. APNs에 대해 인증서 기반 신뢰를 설정하는 자세한 방법은 Establishing a Certificate-Based Connection to APNs를 보시기 바랍니다.
  • 위 인증서를 생성하기 위해 사용되는 암호 없는 PEM-encoded private 키입니다. 키체인 앱은 인증서 서명 요청(CSR)을 생성할 때 private 키를 생성합니다. 이에 대한 내용을 더 알고 싶으시다면 Create a certificate signing request를 보시기 바랍니다.
  • 앱 ID입니다. 앱 ID에 대한 더 많은 정보는 Register an App ID를 보시기 바랍니다.
  • hexadecimal-encoded 아스키 스트링인 앱으로부터의 기기 토큰입니다. 기기 토큰에 대한 더 많은 내용은 Registering Your App with APNs를 보시기 바랍니다.

Establishing a Certificate-Based Connection to APNs
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns
https://velog.io/@panther222128/Establishing-a-Certificate-Based-Connection-to-APNs

Create a certificate signing request
https://help.apple.com/developer-account/#/devbfa00fef7

Register an App ID
https://help.apple.com/developer-account/#/dev1b35d6f83

Registering Your App with APNs
https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns
https://velog.io/@panther222128/Registering-Your-App-with-APNs

최신 macOS 버전에서 터미널 앱을 launch하는 것부터 시작합니다. 다음으로 shell 변수를 설정합니다.

CERTIFICATE_FILE_NAME=path to the certificate file
CERTIFICATE_KEY_FILE_NAME=path to the private key file
TOPIC=App ID
DEVICE_TOKEN=device token for your app
APNS_HOST_NAME=api.sandbox.push.apple.com

아래 명령을 사용해서 APNs에 인증서가 연결할 수 있는지 테스트합니다.

% openssl s_client -connect "${APNS_HOST_NAME}":443 -cert "${CERTIFICATE_FILE_NAME}" -certform DER -key "${CERTIFICATE_KEY_FILE_NAME}" -keyformat PEM

다음으로 아래 명령을 사용해 푸시 노티피케이션을 보냅니다.

% 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 '{"aps":{"alert":"test"}}' --http2  https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}

결과는 200의 HTTP 상태(요청 성공)입니다. "test" 텍스트를 갖는 노티피케이션이 목적 기기에 나타납니다.

Send a Push Notification Using a Token

필요한 것은 아래와 같습니다.

  • 팀 ID입니다. 더 많은 정보는 Locate your Team ID를 보시기 바랍니다.
  • APNs에 대한 키 아이덴티파이어입니다. 더 많은 정보는 Get a key identifier를 보시기 바랍니다.
  • 위의 키 아이덴티파이어와 관련이 있는, 암호 없는 PEM-encoded private 키입니다. 키 다운로드에 대한 정보는 Revoke, edit, and download keys를 보시기 바랍니다.
  • 앱 ID입니다. 앱 ID에 대한 정보는 Register an App ID를 보시기 바랍니다.
  • hexadecimal-encoded 아스키 스트링인 앱으로부터의 기기 토큰입니다. 기기 토큰에 대한 정보는 Registering Your App with APNs를 보시기 바랍니다.

Locate your Team ID
https://help.apple.com/developer-account/#/dev55c3c710c

Get a key identifier
https://help.apple.com/developer-account/#/dev646934554

Revoke, edit, and download keys
https://help.apple.com/developer-account/#/dev3a82eef1c

Register an App ID
https://help.apple.com/developer-account/#/dev1b35d6f83

Registering Your App with APNs
https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns
https://velog.io/@panther222128/Registering-Your-App-with-APNs

최신 macOS 버전에서 터미널 앱을 launch하는 것부터 시작합니다. 이후 shell 변수를 설정합니다.

TEAM_ID=Team ID
TOKEN_KEY_FILE_NAME=path to the private key file
AUTH_KEY_ID=your key identifier
TOPIC=App ID
DEVICE_TOKEN=device token for your app
APNS_HOST_NAME=api.sandbox.push.apple.com

아래 명령을 사용해서 APNs에 연결할 수 있는지 테스트합니다.

% openssl s_client -connect "${APNS_HOST_NAME}":443

푸시 노티피케이션 전송 전에 추가적인 shell 변수를 설정합니다.

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: alert" --header "authorization: bearer $AUTHENTICATION_TOKEN" --data '{"aps":{"alert":"test"}}' --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}

결과는 HTTP 상태 200(요청 성공)입니다. "test" 텍스트를 갖는 노티피케이션이 목적 기기에서 나타납니다.

See Also


Remote Notifications

Setting Up a Remote Notification Server

노티피케이션을 생성하고 사용자 기기로 푸시합니다.

https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server
https://velog.io/@panther222128/Setting-Up-a-Remote-Notification-Server

Registering Your App with APNs

애플 푸시 노티피케이션 서비스(APNs)와 커뮤니케이션하고, 앱을 식별하는 고유한 기기 토큰을 받습니다.

https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns
https://velog.io/@panther222128/Registering-Your-App-with-APNs


post-custom-banner

0개의 댓글