2011-08-10 38 views
1

如何調試從提供者到Apple推送通知服務器的連接?從python推送通知到iPhone,如何調試?

我使用了一個名爲PyAPNs(github repo)庫,並有下面的代碼:

from apns import APNs, Payload 

print "start" 

apns = APNs(use_sandbox=True, cert_file='apns-prod.pem', key_file='apns-prod.pem') 

# Send a notification 
token_hex = '*******' 
payload = Payload(alert="Hello World!", sound="default", badge=1) 
apns.gateway_server.send_notification(token_hex, payload) 

# Get feedback messages 
for (token_hex, fail_time) in apns.feedback_server.items(): 
    print token_hex 
    print fail_time 


print "end" 

應用程序被註冊爲接收RemoteNotification的一切看起來好下的iPhone通知設置。但沒有通知顯示。

我的問題在這裏,我該如何調試。在運行腳本時,我不會收到任何錯誤,並且apns.feedback_server.items爲空。我試圖從反饋服務打印緩衝區,但沒有。

有沒有辦法看到SSL套接字發生了什麼?或者從蘋果服務器得到一些迴應?

..fredrik

編輯

我解決了這個問題。問題出在token_hex上。我使用xcode組織器中的標識號,而不是註冊應用程序時生成的標記。

+0

沒有與您的代碼示例問題:''token_hex = '*****' **'''是不是有效的語法。 – MatthewWilkes

+0

謝謝,但是當我在帖子中刪除真正的token_hex時,它是一個type-o。 – fredrik

+0

當你生成的設備密鑰你的應用程序部署在iPhone使用哪個證書?! Dev還是Dist? –

回答

1

使用此代碼:

#!/usr/bin/python2.7 

import socket 
import ssl 
import json 
import struct 
import argparse 



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


class Payload: 
    PAYLOAD = '{"aps":{${MESSAGE}${BADGE}${SOUND}}}' 
    def __init__(self): 
     pass 

    def set_message(self, msg): 
     if msg is None: 
      self.PAYLOAD = self.PAYLOAD.replace('${MESSAGE}', '') 
     else: 
      self.PAYLOAD = self.PAYLOAD.replace('${MESSAGE}', '"alert":"%s",' % msg) 

    def set_badge(self, num): 
     if num is None: 
      self.PAYLOAD = self.PAYLOAD.replace('${BADGE}', '') 
     else: 
      self.PAYLOAD = self.PAYLOAD.replace('${BADGE}', '"badge":%s,' % num) 

    def set_sound(self, sound): 
     if sound is None: 
      self.PAYLOAD = self.PAYLOAD.replace('${SOUND}', '') 
     else: 
      self.PAYLOAD = self.PAYLOAD.replace('${SOUND}', '"sound":"%s",' % sound) 

    def toString(self): 
     return (self.PAYLOAD.replace('${MESSAGE}','').replace('${BADGE}','').replace('${SOUND}','')) 

def connectAPNS(host, cert): 
    ssl_sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM), certfile = cert) 
    ssl_sock.connect(APNS_HOST) 
    return ssl_sock 

def sendNotification(sslSock, device, message, badge, sound): 
    payload = Payload() 
    payload.set_message(message) 
    payload.set_badge(badge) 
    payload.set_sound(sound) 
    payloadAsStr = payload.toString() 

    format = '!BH32sH%ds' % len(payloadAsStr) 
    binaryDeviceToken = device.replace(' ','').decode('hex') 
    binaryNotification = struct.pack(format, 0, 32, binaryDeviceToken, len(payloadAsStr), payloadAsStr) 

    print ("sending payload: ["+payloadAsStr+"] as binary to device: ["+device+"]") 
    sslSock.write(binaryNotification) 

def printUsageAndExit(): 
    print("msg2ios - Version 0.1\nmsg2IOS.py -d <device> -m <message> -s[plays sound] -b <badgeint> -c <certBundlePath>") 
    exit(1) 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-d', '--device') 
    parser.add_argument('-m', '--message') 
    parser.add_argument('-s', '--sound') 
    parser.add_argument('-b', '--badge') 
    parser.add_argument('-c', '--cert') 
    args = parser.parse_args() 

    if (args.device is None) or ((args.message is None) and (args.sound is None) and (args.badge is None)) or (args.cert is None): 
     printUsageAndExit() 

    sslSock = connectAPNS(APNS_HOST, args.cert) 
    sendNotification(sslSock, args.device, args.message, args.badge, args.sound) 
    sslSock.close() 
+5

這裏的一些解釋會有幫助。 – casperOne