PythonはAPNSアップルプッシュ通知サービスの関連モジュール利用ガイドを構築します。

4188 ワード

APNSは、アップルがIOSデバイスに提供するプッシュサービスで、フルネームはApple Push Notification serviceです。モバイルインターネット関連の開発があれば、よく知っているはずです。
次にPythonの下にあるAPNS関連のモジュールとその特徴を簡単に紹介します。
モジュール紹介:
PyAPNs
プロジェクトの住所: https://github.com/djacobs/PyAPNs
PyAPNsは私が最初に使用したAPNSモジュールです。これは紹介したいすべてのモジュールの中で一番簡単なものです。最新のソースは384行だけです。APNSの基本機能を実現しました。Frame群発プッシュ、feedbackインターフェースなどを送ります。
そのすべての検証はクライアントで行われます。たとえば、各Payloadは256バイトを超えません。
簡単に言えば、できるだけリンクを多重化して、頻繁に確立したり切ったりしないと、DoS攻撃として扱われます。だから私たちはそれを使って送りを送る時はこうするべきです。

... ...

#     gateway_server
apns.gateway_server.send_notification(token_hex, payload)

このgatewayを多重化しますserverつまり接続ですが、APNS Serverへのリンクは不安定です。ネットワークの原因、違法なtokenなどが切断される場合が多いです。したがって,再結合の機構も必要である。
しかし、PyAPNsモジュールはあなたのためにこれらを処理していませんので、それらのエラーを自分で処理する必要があります。これはこのモジュールを使うのに一番不便なところです。
だから私の提案は、APNSのProviderを書く必要がない限り、このモジュールを起点としてもいいです。さもないと、あなたのプロジェクトの中で快速にサービスを推し进めたいなら、他のモジュールを选ぶほうがいいです。
例:

import time
from apns import APNs, Frame, Payload
 
apns = APNs(use_sandbox=True, cert_file='cert.pem', key_file='key.pem')
 
# Send a notification
token_hex = 'b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b87'
payload = Payload(alert="Hello World!", sound="default", badge=1)
apns.gateway_server.send_notification(token_hex, payload)
 
# Send multiple notifications in a single transmission
frame = Frame()
identifier = 1
expiry = time.time()+3600
priority = 10
frame.add_item('b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b87', payload, identifier, expiry, priority)
apns.gateway_server.send_notification_multiple(frame)
 
# Get feedback messages
for (token_hex, fail_time) in apns.feedback_server.items():
# do stuff with token_hex and fail_time
      alerts,       ,    PayloadAlert 
alert = PayloadAlert("Hello world!", action_loc_key="Click me")
payload = Payload(alert=alert, sound="default")
pyapns(twisted)
プロジェクトの住所: https://github.com/samuraisam/pyapns
彼らが使っているのはこのプロジェクトを彼らのプッシュサービスのプロバイダーとして使っています。だから私はPyAPNsからこのプロジェクトに転送しました。使ってもいいです。このプロジェクトの主な特徴は:
これは実際には、twistedベースのserverです。すべての送信プッシュの要求は、アップルのサーバーと対話します。
DjangoとPylonsには原生のサポートがあります。
複数のAPPに対応しています。
アップルのプッシュサーバとはこのプロバイダーによって維持されている長い接続なので、あなたがプッシュするたびにこのプロバイダーを直接呼んでインタラクションするというメリットは毎回のインターフェース呼び出しが早くなります。本当にアップルサーバに送るプロセスはこのプロバイダーによって違います。
しかし、このモジュールは長い間メンテナンスされていませんでした。実はApple側の協議はこの期間に一部更新されました。しかし、このモジュールは追いつきませんでした。
私がこのモジュールを使うと最大の問題は群発プッシュの効果が保証されないことです。
このモジュールのデモには大量送信のサポートがありますが、このモジュールの群発プッシュの効果は悪く、アップルServerからエラーフィードバックを得るロジックが欠けています。
Twistedのコードのスタイルがあまり好きではないので、群発して問題があったら他の解決策を探し始めます。
apps-client
プロジェクトの住所: https://bitbucket.org/sardarnl/apns-client/
まとめてみます。
永続的なリンクを維持します。SSLプロトコルの握手は遅いです。各接続が確立された後は、最低数分で次のプッシュを待つべきです。
改善されたプロトコルフォーマットをサポートします。Appleのプログラマーたちは悪名高いプッシュプロトコルを設計しました。彼らはバージョンを更新しました。このバージョンは各群発プッシュの中でどの単独のメッセージが問題になっているのかを知ることができます。
鮮明なPython API
これをコードに書いていませんでした。直接にAPNSに戻るエラーメッセージです。
このモジュールを使って送りも簡単です。

from apnsclient import *

#     Session        
session = Session()
con = session.get_connection("push_sandbox", cert_file="sandbox.pem")

#          
messge = Message(["my", "device", "tokens"], alert="My message", badge=10)

# Send the message.
srv = APNs(con)
res = srv.send(message)

# Check failures. Check codes in APNs reference docs.
for token, reason in res.failed.items():
  code, errmsg = reason
  print "Device faled: {0}, reason: {1}".format(token, errmsg)

# Check failures not related to devices.
for code, errmsg in res.errors:
  print "Error: ", errmsg

私にとってこのモジュールの最大の利点は、接続が異常に切断される可能性があるということです。コードはpyapnsのように難しくなく、より直感的で、読み取り可能性が高いです。だからもしあなたがその基礎の上で何かを修正するなら、何の問題もありません。
私の使用経験によって、apans-clientを使って百万級のプッシュを処理しても大丈夫です。到着率もいいです。
ですから、特別な需要がないなら、apps-clientは一番いい選択です。