Appleプッシュ通知サービスを使用する機能

こんにちは、ハラジテリ。 ごく最近、私はapnsサービスの開発を終了し、それと連携するいくつかの機能を共有したいと思います。 この記事は段階的な説明ではありませんが、開発者が遭遇する可能性のある困難と落とし穴について説明しています。 Rubyのコードの例を挙げますが、書かれたものはすべて、他のプラットフォーム、特にPHPに関連しています。





apnを使用する一般的な原則について多くの記事が書かれており、公式のドキュメントは非常に明確で透明なので、要点を説明しましょう。



フィーチャー番号時間-JSON


この形式では、メッセージを変換してAppleサーバーに送信する必要がありますが、ここでは失望します。 最も簡単な方法は、次のように配列をjsonに変換するための組み込み関数を使用してメッセージを生成することです。

result = {} result['aps'] = {} result['aps']['alert'] = m.message result['aps']['badge'] = 0 result['aps']['sound'] = 'default' json = result.to_json
      
      





しかし、それほど単純ではありません。 メッセージテキストの最大長が40〜50文字であることが突然わかります。 なぜそう 実際のところ、Rubyのto_json関数は、すべての非ASCII文字を/ uXXXXシーケンスに変換します。これには、メッセージをパックするのに4が必要です。 バイト。 この制限を回避するには、メッセージをプレーンテキスト形式で作成する必要があります。 たとえば、次のように:

 json = '{"aps":{"alert":"'+message.gsub(/['"\\\x0]/,'\\\\\0')+'","badge":"'+badge+'","sound":"default"}}'
      
      





 .gsub(/['"\\\x0]/,'\\\\\0')
      
      



PHP関数のaddlashes()に類似しています。 適用されない場合、句読点と一部のサービス文字を含むメッセージはユーザーに到達せず、リンゴはエラーと見なされます。



機能2-ドロップアウトとフィードバック


次のメッセージの送信中にエラーが発生した場合、アップルはキュー内のすべてのメッセージの送信の終了を待たずに、単に切断します。 ただし、送信時にどのエラーが発生したかを正確に知る機会があります。 これを行うには、特別な方法でメッセージを作成し、それぞれに一意の番号を割り当てる必要があります。

 mes = [1, # ID #, #   #, 0, 32, token, 0, payload.bytesize, payload].pack("cNNcca*cca*")
      
      





各メッセージを送信した後、サーバーからの応答があるかどうかを確認する必要がありますが、成功した場合、サーバーは何も返さず、応答を待つだけの場合、送信がフリーズする可能性があることに注意することが重要です。 エラーコードは公式ドキュメントに記載されているため、ここでは説明しません。 最も一般的なエラーは、間違ったトークンの長さやメッセージの内容に関連していることに注意してください。



機能3-フィードバック


このサービスを使用して、Appleはアプリケーションが削除されたデバイスのトークンを返します。 多くの場合、送信されるたびにこの情報を要求しますが、これは必須ではありません。 1日1回サービスにアクセスし、データベースから非アクティブなデバイスを削除するだけで十分です。 このサービスを無視することも価値がありません。 非アクティブなトークンに頻繁にメッセージを送信すると、サービスがブロックされる場合があります。



機能4-大量メール送信


アップルサーバーへの接続は、特定のアプリケーションに発行された証明書を使用して確立されます。 Appleは、送信された通知がユーザーのデバイス上のどのアプリケーションに属しているかをAppleが判断する方法です。 したがって、複数のアプリケーション(つまり、私が開発したサービスが直面したタスク)にメッセージを送信するには、メッセージ配列ごとに個別の接続を作成する必要があります。 開発者が犯すよくある間違いは、接続を作成および切断するたびに、100〜200個の小さなバッチでメッセージを送信しようとすることです。 サーバーはこれを攻撃の試みとして認識し、サービスがブロックされます。 これを回避するには、数万のメッセージがある場合でも、1つの接続を介してすべてのメッセージを送信する必要があります。 そして、これから機能番号6が続きます。



特徴6-時は私たちの敵


多数のメッセージがある場合、送信スクリプトの実行時間は非常に長くなる可能性があり、ほとんどのサーバーでは、30秒のタイムアウトで実行が完了します。 解決策は、メッセージを作成および送信するためのロジックを分離することです。 デーモンを使用してこれを行いました( gemデーモンはRORでこれを担当します。メッセージテキストとフィルターはWebインターフェイスを介してデータベースに追加され、送信時にデータベースからトークンが選択されます。このような実装には、議論の余地のないもう1つの利点があります。メッセージの遅延送信を構成できます。



おわりに


留意すべきすべての落とし穴と微妙さにもかかわらず、アップルのプッシュメッセージサービスの実装は最高レベルで行われます。 このサービスは高速で便利であり、大量のメッセージを送信するために最小限のリソースが必要です。 たとえば、15,000件のメッセージを送信するには、約3.5〜4メガバイトのデータのみをサーバーに転送する必要があります。



All Articles