1

我有這個問題約2周,當時我突然停止發送生產通知。我正在使用django-push-notifications庫和django admin,我可以發送測試消息,但不會通過系統發送消息。APNS_CERTIFICATE - 推送通知不會在生產中發送

在我的本地計算機上,一切都完美無瑕。我發現了一個命令來測試證書:

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

有了這一個我不得不返回:超時:7200(秒)檢查返回 碼:20(無法獲取本地頒發者證書)擴展主 祕密:是的

了大量的研究

所以,我發現我需要把「CA」的路徑:

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

是誰帶我去:驗證返回碼:0(OK)

然而,在庫中使用,我需要把一個。質子交換膜的文件的完整路徑。然後我發現這個命令:

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管理員:好的。通過沙盒發送(調試):確定。

+0

我並不孤單!我遇到了同樣的問題,這隻發生在生產環境中!所以問題可能出在蘋果身上,或者在django-push-notifications中出現任何可能的折舊。 – Fian

+0

我發現它停止工作的原因。我的查詢集選擇設備發送消息,最終爆發「令牌無效」錯誤,針對基礎的較舊設備。這導致功能被取消。我通過循環和忽略錯誤來解決問題,通過循環內的設備發送設備。 –

+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]"])