Python中使用Apple Push Notification Service

当使用以下代码时,我在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支持以获得帮助。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值