2014-12-09 152 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')