当使用以下代码时,我在APNs中遇到一个问题。我找到了许多实现此服务的源代码。
import socket, ssl, json, struct import binascii
deviceToken = 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX'
thePayLoad = {
'aps': {
'alert':'Hello world',
'sound':'default',
'badge':42,
},
'test_data': { 'foo': 'bar' },
}
theCertfile = 'iphone_ck.pem'
theHost = ( 'gateway.sandbox.push.apple.com', 2195 )
data = json.dumps( thePayLoad )
deviceToken = deviceToken.replace(' ','')
byteToken = binascii.unhexlify(deviceToken)
theFormat = '!BH32sH%ds' % len(data) theNotification = struct.pack( theFormat, 0, 32,
byteToken, len(data), data )
ssl_sock = ssl.wrap_socket( socket.socket( socket.AF_INET, socket.SOCK_STREAM ), certfile = theCertfile )
ssl_sock.connect( theHost )
ssl_sock.write( theNotification )
ssl_sock.close()
执行代码后,我收到以下错误。在GitHub上的PyAPNs或Google上的APNWrapper中尝试使用时,我最后都会遇到这个错误。所以我决定自己实现。
Traceback (most recent call last):
File "testAPN.py", line 38, in <module>
ssl_sock.connect( theHost )
File "/usr/lib/python2.6/ssl.py", line 309, in connect
self.do_handshake()
File "/usr/lib/python2.6/ssl.py", line 293, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [Errno 1] _ssl.c:480: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3
alert handshake failure
有没有人可以帮我解决这个错误,或者给我一些完成此功能的可能方向?
2、解决方案
- 检查证书文件:确保您使用的证书文件是有效的,并且包含正确的私钥。
openssl x509 -noout -text -in iphone_ck.pem
- 确保证书文件具有正确的权限:证书文件应具有600或更严格的权限。
chmod 600 iphone_ck.pem
- 检查设备令牌:确保您使用的设备令牌是有效的。您可以使用以下命令检查设备令牌:
openssl x509 -noout -text -certopt no_pubkey -in DeviceToken.pem
- 确认服务器地址和端口正确:确认您正在使用正确的服务器地址和端口。对于沙盒环境,服务器地址是gateway.sandbox.push.apple.com,端口是2195。对于生产环境,服务器地址是gateway.push.apple.com,端口也是2195。
theHost = ( 'gateway.sandbox.push.apple.com', 2195 )
-
确保防火墙没有阻止连接: 确认您正在使用的防火墙没有阻止到APNs服务器的连接。
-
尝试使用不同的设备令牌:尝试使用不同的设备令牌来发送推送通知。这样可以帮助您确定问题是否与特定设备令牌相关。
-
使用不同的证书文件: 尝试使用不同的证书文件发送推送通知。这样可以帮助您确定问题是否与特定证书文件相关。
-
更新APN版本: 您使用的APN版本可能已过时。请务必使用最新版本的APN。
pip install --upgrade apns
- 使用代理服务器: 如果您位于防火墙后面,您可能需要使用代理服务器才能连接到APNs服务器。
proxy_host = 'proxy.example.com'
proxy_port = 8080
ssl_sock = ssl.wrap_socket(
socket.socket( socket.AF_INET, socket.SOCK_STREAM ),
certfile = theCertfile,
proxy = (proxy_host, proxy_port)
)
- 联系Apple支持: 如果您已经尝试了上述所有方法,但仍然无法解决问题,您可能需要联系Apple支持以获得帮助。