BLOGアプリ開発日誌2017.05.26Golangで「プロバイダー認証トークン」を生成して、APNsにプッシュを送ろうサーバー開発担当の木下です。2017が開催されましたね。Androidがkotlinを正式にサポートすることになったというニュースに、社内も若干の盛り上がりを見せています。kotlinの話を振っておいて何ですが、今回はiOSのプッシュ(APNs)とGolangの話です。APIが発表されました。これは、従来のAPNsがソケット通信でプッシュのリクエストを送っていたのに代わって、HTTP/2でリクエストできるようになるというものです。1端末=1リクエストになりますが、ソケット通信時よりも細かなレスポンスが得られるため、不着の場合の原因の切り分けや、使えなくなったトークンの処理などが容易になりました。2016で、「プロバイダー認証トークン」が使えるようになるという発表もありました。Developerで証明書を発行してサーバーでpemファイルを生成するという作業が必要でした。これに対して、プロバイダー認証トークンは、有効期限のない証明書で署名したトークンのため、毎年証明書を更新する必要がないというメリットがあります。Developerが、若干わかりにくいため、説明を加えたいと思います。Safeになるようbase64にエンコードしたものです。Encryption)と言います。APIに送るのはJWSです。上記ドキュメントの中に「トークンの暗号化には〜」という文言があるため、てっきりJWEかと思ってしまいますが、JWEを送るとエラーが返ってきます。ヘッダーペイロードに含める’alg’は’ES256’で固定、クレームペイロードに含める’iat’はトークンを生成した時刻をUnixtimeで入れます。残りの’kid’と’iss’は、後ほど説明します。SSL」で、ダウンロードすると「.p12」という拡張子の証明書が発行されました。これををもとに「.pem」ファイルを生成するという作業が必要でした。Key」というものです。ダウンロードすると「.p8」という拡張子のものが発行されます。このとき発行される証明書のファイル名は「APNsAuthKey_ABCDE12345.p8」という形になるはずです。このファイル名に含まれる「ABCDE12345」にあたる部分(10桁の英数字)が、前述した’kid’になります。トークンを生成する際に必要なので、メモしておきましょう。ID」がそのままissの値になります。トークンを生成するいよいよトークンを生成してみましょう。今回はGolangを使ってみることにしました。APIとの親和性が高いGolangを触ってみたかったなどなど。下準備として、ローカルにGoの環境がまだなければ、インストールしておきましょう。getするなどしてインポートしておいてください。プロジェクトを新規作成し、main.goとか適当な名前をつけて↓を書き込みましょう。{fmt.Println(signedToken)}}保存できたら、ビルドしましょう。main.goおおよそ3MBほどの実行ファイルが出力されると思います。main()内のos.Argsはスライスで、0番目にプログラムのパス、1番目移行にコマンドで渡した引数が入ります。実際に実行してみましょう。ABCDE12345標準出力に長い英数字が出てくるはずです。これが生成されたJWTになります。1時間有効なので、生成した時刻と一緒にKVSなどに保存しておきましょう。APIに送信する本当は送信もGolangで済ませてしまいたいところですが、メンテナンスのしやすさから今回はPHPにしました。curl_close($ch);push.phpとか適当に名前をつけて保存し、実行してみましょう。./push.php無事に送信できました!iOSへのプッシュが格段に便利になりましたこれまでのソケット通信によるリクエストに比べて、レスポンスの安定感や更新不要の証明書など、格段に便利になった感があります。PHPで書くと、FCM(Android)へのプッシュと同じようなソースになるため、メンテナンス・改修も楽になったと思います。yumなどのパッケージマネージャーでインストールできるcURL等がHTTP/2をサポートするようになれば、更に普及が進むのではないでしょうか。イーディーエーには、スマホアプリへのプッシュ通知に関する豊富なノウハウがあります。入社3ヶ月目の新人プログラマが思うこと2016.08.06アプリ開発日誌チャットAIで何が出来るのか2023.06.05お問合せイーディーエーに興味をお持ちいただいてありがとうございます!スマホアプリに関するご相談、お見積りや弊社へのご質問など、お気軽にお問い合わせください。担当者より折り返しご連絡させていただきます。選択してくださいアプリ開発・Webシステム開発・保守のご相談パートナーシップのご相談・ご提案その他のお問い合わせお問合わせ内容必須アンケートにご協力ください。当フォームで取得した個人情報は、お問い合わせに関する回答のために利用し、目的外利用はいたしません。4.弊社が取得した個人情報の第三者への委託、提供について弊社は、ご本人に関する情報をご本人の同意なしに第三者に委託または提供することはありません。弊社は、ご本人の個人情報を保護するための規程類を定め、従業者全員に周知・徹底と啓発・教育を図るとともに、その遵守状況の監査を定期的に実施いたします。ご本人の個人情報を保護するために必要な安全管理措置の維持・向上に努めてまいります。手続ご本人が、弊社が保有するご自身の個人情報の、利用目的の通知、開示、内容の訂正、追加又は削除、利用の停止、消去及び第三者への提供の停止を求める場合には、下記に連絡を頂くことで、対応致します。個人情報のご提供は任意ですが、同意を頂けない場合には、第3項にあります利用目的が達成できない事をご了承いただくこととなります。8.弊社Webサイトの運営について弊社サイトでは、ご本人が弊社Webサイトを再度訪問されたときなどに、より便利に閲覧して頂けるよう「クッキー(Cookie)」という技術を使用することがあります。これは、ご本人のコンピュータが弊社Webサイトのどのページに訪れたかを記録しますが、ご本人が弊社Webサイトにおいてご自身の個人情報を入力されない限りご本人ご自身を特定、識別することはできません。クッキーの使用を希望されない場合は、ご本人のブラウザの設定を変更することにより、クッキーの使用を拒否することができます。その場合、一部または全部のサービスがご利用できなくなることがあります。個人情報のお取扱いに関する同意事項に同意します。