APNS_CERTIFICATE - 推送通知不会在生产中发送

时间:2016-12-30 00:47:45

标签: ios django python-3.x apple-push-notifications django-push-notifications

当我突然停止在制作中发送通知时,我已经有这个问题大约2周了。我正在使用django-push-notifications库,而django admin我可以发送测试消息,但它不会通过系统发送消息。

在我的本地计算机上,一切都完美无瑕。我发现了一个测试证书的命令:

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(确定)

但是,要在库中使用,我需要放置.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 admin发送测试文本:好的。通过沙箱发送(调试):确定。

1 个答案:

答案 0 :(得分: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, ["my@mail.com"])