1

私は突然本番環境で通知を送信しなくて約2週間この問題が発生しました。私はdjango-push-notificationsライブラリを使用していますが、django管理者はテストメッセージを送信できますが、システムからメッセージを送信しません。APNS_CERTIFICATE - プッシュ通知が本番環境で送信されない

ローカルコンピュータでは、すべてが問題なく動作します。タイムアウト::7200(秒)を確認し、戻り コード:20(現地発行者証明書を取得できません)拡張マスター 秘密私はリターンを持っていた、この1で

openssl s_client -connect gateway.push.apple.com:2195 -cert apns-cert.pem 

:私は、証明書をテストするためのコマンドを発見しました:はい

だから多くの研究で、私は、「CA」のパスを置くために必要なことを発見:

openssl s_client -CApath /etc/ssl/certs/ -connect gateway.push.apple.com:2195 -cert apns-cert.pem 
に私を取っていた

:リターン・コードを確認します。0(OK)

しかし、図書館での使用のために、私は.pemのファイルのフルパスを配置する必要がありました。私は完全に働いているように見えるものに達するまで、

ls /etc/ssl/certs/Entrust* 

私はそこにあったすべての.pemファイルをテストした:その後、私は、このコマンドを見つけた

openssl s_client -CAfile /etc/ssl/certs/Entrust.net_Premium_2048_Secure_Server_CA.pem -connect gateway.push.apple.com:2195 -cert apns-cert.pem 

をすぐに、私は私のPUSH_NOTIFICATIONS_SETTINGSでフォーマット:

PUSH_NOTIFICATIONS_SETTINGS = { 
    "GCM_API_KEY": "xxxx", 
    "APNS_CERTIFICATE": os.path.join(BASE_DIR, "apns-cert.pem"), 
    "APNS_CA_CERTIFICATES": "/etc/ssl/certs/Entrust.net_Premium_2048_Secure_Server_CA.pem", 
    "APNS_ERROR_TIMEOUT": 3, 
} 


IOS_VERIFY_RECEIPT_API = 'https://buy.itunes.apple.com/verifyReceipt' 
ANDROID_VERIFY_RECEIPT_API = 'https://www.googleapis.com/androidpublisher/v2/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}' 

残念ながら、私は電子メールで送信するエラーをポップするように設定しているため、PUSHは送信せず、エラーもありません。

PS:これはdjangoの管理者からテストテキストを送信することで覚えています:OK。サンドボックス経由での送信(デバッグ):OK。

+0

私は一人ではありません!私は同じ問題を抱えています、それは実稼働環境でのみ起こっています!だから、問題はアップル側やdjango-push-notificationsでの減価償却の可能性があります。 – Fian

+0

なぜそれが動作を停止したかを発見しました。メッセージを送信するデバイスを選択する私のquerysetは、ベースの古いデバイスに対して、 "token invalid"というエラーを破裂させてしまいます。これにより、機能がキャンセルされました。私は、ループ内でデバイスごとにデバイスを送信することで、ループしてエラーを無視することで解決しました。 –

+0

共有いただきありがとうございます。私のプロジェクトをチェックします。 – Fian

答えて

0

実際にはSSLの問題ではなく、ライブラリによる一括アップロードエラーでした。

システムに登録されているトークンの有効期限が切れており、ライブラリはそのライブラリの操作方法を知らず、アクションをキャンセルして他のトークンを試行しません。私は、メールにテストを送信して個々のエラーをループし無視することで問題を解決しました:

def send_push(self): 
    errors = [] 

    # IOS 
    queryset_ios = APNSDevice.objects.filter(user=self.authentication) 
    for device in queryset_ios: 
     try: 
      device.send_message(self.subject, badge=1, sound=self.kind.sound) 
     except APNSServerError as e: 
      errors.append(APNS_ERROR_MESSAGES[e.status]) 
     except Exception: 
      pass 

    # ANDROID 
    queryset_android = GCMDevice.objects.filter(user=self.authentication) 
    extra = {'notification': self.pk, 'kind': self.kind.kind, 'sound': self.kind.sound} 

    for device in queryset_android: 
     try: 
      queryset_android.send_message(self.subject, badge=1, extra=extra) 
     except GCMError as e: 
      errors.append(str(e)) 
     except Exception: 
      pass 

    if errors: 
     send_mail("Push Error", 
        "Push: %s \n User: %s \n\n Errors: %s" % (self.subject, self.authentication.full_name, errors), 
        settings.DEFAULT_FROM_EMAIL, ["[email protected]"]) 
関連する問題