2014-12-09 148 views
3

我已启用Apple Push Notification(APN)服务配置我的iOS应用程序。我能够将通知发送给使用PHP和Python 3脚本的设备。我在本地机器上测试了本地服务器。但现在我需要在Python2中编写脚本。iOS中的Apple推送通知(APN)服务服务器端Python 2脚本

下面是我写的脚本,当我运行这个我什么都没有。无论是通知我的设备还是错误的命令行。

import socket, ssl, json, struct 
import binascii 
import os 

deviceToken = 'my_device_tocken_without_spaces' 

thePayLoad = { 
    'aps': { 
      'alert':'My first push notification!', 
      'sound':'default' 
      } 
    } 

theCertfile = 'ck3_2.pem' 

theHost = ('gateway.sandbox.push.apple.com', 2195) 

data = json.dumps(thePayLoad) 

theFormat = '!BH32sH%ds' % len(data) 

theNotification = struct.pack(theFormat, 0, 32, deviceToken, 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() 

我错过了什么?我如何检查错误发生在哪里?

我使用XAMPP在本地主机上运行了PHP脚本,并且我在命令行中运行了Python脚本,因为我无法使用XAMPP设置Python,因为我已经发布了一个问题here

回答

0

我认为你的代码没有问题。您可以尝试后ssl_sock.connect(theHost)

print repr(ssl_sock.getpeername()) 
print ssl_sock.cipher() 
print pprint.pformat(ssl_sock.getpeercert()) 

,它将打印有关连接的SSL信息添加以下行。

或者,您可以创建示例服务器并更改客户端中的连接并对服务器进行测试。 http://carlo-hamalainen.net/blog/2013/1/24/python-ssl-socket-echo-test-with-self-signed-certificate

+0

是的,你是正确的。代码几乎是正确的,它运行在远程服务器内部,但不是本地机器。无论如何,当试图在本地机器上运行时出现的错误是“File”/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py“,第333行,在连接 self ._real_connect(addr,False) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py”,第314行,在_real_connect self.ca_certs,self.ciphers) ssl.SSLError:[Errno 336265218] _ssl.c:351:错误:140B0002:SSL例程:SSL_CTX_use_PrivateKey_file:系统库文件' – AnujAroshA 2014-12-17 07:10:10

+0

您的证书文件路径是否正确?或有访问权限?我发现类似的错误http://stackoverflow.com/a/6806097/625144 – Gihan 2014-12-19 17:40:20

2

可以考虑https://github.com/djacobs/PyAPNs该包裹许多有用的功能,包括:

  • 错误处理
  • 支持增强的消息格式和自动重发的消息,其错误响应
  • 非阻塞SSL之前被发送性能卓越的插座连接
0

您导入了binascii,但您忘记了使用它。 令牌和JSON数据转换为字节数组,例如:

deviceToken = binascii.a2b_hex('my_device_tocken_without_spaces') 

data = json.dumps(thePayLoad, separators=(',', ':'), ensure_ascii=False).encode('utf-8')