1

У меня был этот вопрос около 2 недель, когда я внезапно прекратил отправлять уведомления на производство. Я использую библиотеку django-push-уведомлений, а django admin могу отправить тестовое сообщение, но оно не отправляет сообщения через систему.APNS_CERTIFICATE - Push Notification не отправляется в производство

На моем локальном компьютере все работает безупречно. Я обнаружил команду, чтобы проверить сертификат:

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

С этим у меня было возвращение: Тайм-аут: 7200 (сек) Verify обратный код: 20 (не удалось получить локальный сертификат выдавшей) Расширенный мастер секретном : да

Так с большим количеством исследований, я обнаружил, что мне нужно поставить путь «CA»:

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

Кто принимает меня: Проверка кода возврата: 0 (ОК)

Однако, для использования в библиотеке, мне нужно, чтобы поставить полный путь к файлу .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: ОК. Отправка через песочницу (отладка): ОК.

+0

Я не один! У меня такая же проблема, что происходит только в производственной среде! Таким образом, проблема может быть на стороне Apple или любой возможной амортизации в django-push-уведомлениях. – 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]"]) 
Смежные вопросы