与Django的APNS问题

时间:2014-10-07 17:21:31

标签: django apple-push-notifications

我正在使用以下项目在我的项目中启用APNS:

https://github.com/stephenmuss/django-ios-notifications

我可以在我的生产应用程序上发送和接收推送通知,但是沙盒apns有一些我无法解决的奇怪问题。它始终没有连接到推送服务。当我在_connect()APNService类上手动执行FeedbackService时,出现以下错误:

  File "/Users/MyUser/git/prod/django/ios_notifications/models.py", line 56, in _connect
    self.connection.do_handshake()
Error: [('SSL routines', 'SSL3_READ_BYTES', 'sslv3 alert handshake failure')]

我尝试多次重新创建APN证书并不断得到同样的错误。还有什么我想念的吗?

我正在使用端点 gateway.push.apple.com gateway.sandbox.push.apple.com 来连接服务。还有什么我应该考虑的吗?我已阅读以下内容:

Apns php error "Failed to connect to APNS: 110 Connection timed out."

Converting PKCS#12 certificate into PEM using OpenSSL

Error Using PHP for iPhone APNS

2 个答案:

答案 0 :(得分:5)

在开发过程中,Apple将ssl上下文从SSL3更改为TLSv1。他们最终会在生产中做到这一点(不确定何时)。以下链接显示了我在上述项目中接受的拉取请求:

https://github.com/stephenmuss/django-ios-notifications/commit/879d589c032b935ab2921b099fd3286440bc174e

基本上,如果你在其他语言中使用python或类似的东西,请使用OpenSSL.SSL.TLSv1_METHOD

虽然OpenSSL.SSL.SSLv3_METHOD适用于制作,但在不久的将来可能无效。 OpenSSL.SSL.TLSv1_METHOD从事生产和开发工作。

<强>更新

由于贵宾犬的缺陷,Apple将于2014年10月29日停止生产SSL 3.0支持。

https://developer.apple.com/news/?id=10222014a

答案 1 :(得分:-1)

我使用python-django参与过APN,为此您需要Apple提供的三个 URL,PORT 证书进行身份验证。

<强> views.py

import socket, ssl, json, struct

theCertfile = '/tmp/abc.cert'      ## absolute path where certificate file is placed.
ios_url = 'gateway.push.apple.com'
ios_port = 2195
deviceToken = '3234t54tgwg34g'    ## ios device token to which you want to send notification

def ios_push(msg, theCertfile, ios_url, ios_port, deviceToken):

    thePayLoad = {
               'aps': {
                    'alert':msg,
                    'sound':'default',
                    'badge':0,
                    },
             }

    theHost = ( ios_url, ios_port )
    data = json.dumps( thePayLoad )

    deviceToken = deviceToken.replace(' ','')
    byteToken = deviceToken.decode('hex') # Python 2

    theFormat = '!BH32sH%ds' % len(data)
    theNotification = struct.pack( theFormat, 0, 32, byteToken, len(data), data )

    # Create our connection using the certfile saved locally
    ssl_sock = ssl.wrap_socket( socket.socket( socket.AF_INET, socket.SOCK_STREAM ), certfile = theCertfile )
    ssl_sock.connect( theHost )

    # Write out our data
    ssl_sock.write( theNotification )

    # Close the connection -- apple would prefer that we keep
    # a connection open and push data as needed.
    ssl_sock.close()

希望这对你有用。