『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

PythonでAPNs Provider APIでのプッシュ通知を実装した

はじめに

今までは、ソケット通信を使って通信するものでプッシュ通知のペイロードの大きさが2MBまででとか、証明書がアプリごとに違ってとか1年毎にサーバに証明書を置き換えないといけないとかすごい手間が多かった手法に慣れていたので使っていました。
しかし、そろそろ面倒になってきたので、 APNs Provider API という HTTP/2 ベースでプッシュ通知を送れて、証明書はアプリに依存せずに使い回せて、証明書の置き換え等の操作をしなくてもよくなるということで実装してみました。

developer.apple.com

開発環境

  • iOS11〜
  • Xcode9.4.1
  • macOS High Sierra
  • Python3.6.4, 3.7.0

準備

p8 ファイルの作り方とかは色んなサイトで紹介されていると思うので省略します

qiita.com

$ pip install git+https://github.com/nnsnodnb/python-apns.git@payload#egg=gobiko.apns

ちょっと、本家さんのソースコードがバグってたのでやや修正中&Payloadの簡単な指定実装のForkを指定してます。

本家

github.com

ソースコード

from gobiko.apns.client import APNsClient
from gobiko.apns.payload import PayloadAlert, Payload

import jwt
import time

AUTH_KEY = '/path/to/AUTH_KEY.p8'

client = APNsClient(team_id='YOUT_TEAM_ID', bundle_id='com.example.sample.notification', auth_key_id='YOUR_AUTH_KEY',
                    auth_key_filepath=AUTH_KEY, use_sandbox=True)

custom = {'image_url': 'https://example.com/1.jpg'}
payload_alert = PayloadAlert(title='ここがタイトル', body='ここが本文')
# alert is str or PayloadAlert
payload = Payload(alert=payload_alert, sound='default', badge=1, mutable_content=True,
                  custom=custom)

client.send_message(
    'REGISTRATION_ID (as DEVICE_TOKEN)',
    alert=payload_alert,
)

team_idMembership で見られるTeam IDです。 f:id:nanashinodonbee:20180728171314p:plain

bundle_id はアプリのバンドルIDです。

auth_key_id は、 p8 ファイル生成した時に生成されるものです。 f:id:nanashinodonbee:20180728171352p:plain

最後に

これで、Sandbox用とProduction用の証明書を分ける必要もなくなって、アプリごとに証明書を作りまくることから開放されました!
p8 ファイルは安全に盗難されることない場所に保管しましょう!

PKCS 8 - Wikipedia

参考

gobiko.com