2017-10-23 7 views
0

Ich kann kein Skript finden, das hervorhebt, wie man eine .p12/.pem-Datei erstellt und lokal Push-Benachrichtigungen testet.Richtiger Weg, um .p12/.pem zu machen und APNS lokal zu testen

Ich finde mehrere Möglichkeiten, um die .pem-Datei (mit/ohne Passwort, .key und .cer kombiniert usw.) und .p12-Datei, sondern am Ende mit einem SSL-Fehler oder ungültigen Geräte-Token.

welches Skript funktioniert und wie erstelle ich das Zertifikat, das es benötigt.

Antwort

0

Wenn Sie bestehen auf .pem und Zertifikate verwenden, dann wird der folgende Code funktioniert ..

# setup: 
# sudo apt-get install python35 
# python select --set python python35 
# sudo apt-get install py35-pip 
# python select --set pip pip35 
# sudo pip35 install Hyper 


import ssl 
import json 
from hyper import HTTP20Connection 
from hyper import tls 

APNS_SANDBOX_HOST = 'api.development.push.apple.com' 
APNS_PRODUCTION_HOST = 'api.push.apple.com' 

class APNS(object): 
    def __init__(self, sandbox=True): 
     self.sandbox = sandbox 
     self.port = 443 
     self.host = APNS_SANDBOX_HOST if sandbox else APNS_PRODUCTION_HOST 

     certificate_file = "./apns_dev.pem" if sandbox else "./apns_prod.pem" 

     ctx = ssl.create_default_context() 
     ctx.check_hostname = False 
     ctx.verify_mode = ssl.CERT_NONE 
     ctx.load_cert_chain(keyfile=certificate_file, certfile=certificate_file) 

     self.connection = HTTP20Connection(self.host, port=self.port, ssl_context=ctx, force_proto=tls.H2C_PROTOCOL) 

    def push(self, uuid, topic, payload): 
     headers = { 
      "apns-topic": topic, 
      "apns-priority": str(10), 
      "apns-expiration": str(0) 
     } 

     self.connection.request("POST", "/3/device/{0}".format(uuid), payload, headers=headers) 
     return self.connection.get_response() 


if __name__ == "__main__": 
    payload = { 
     "aps": { 
      "alert": { 
       "title": "Hey", 
       "body": "Test" 
      }, 
      "sound": "default" 
     } 
    } 

    apns = APNS() 
    print(apns.push(uuid="device_uuid", topic="bundle_id", payload=json.dumps(payload)).read()) 

P. S. Ich empfehle dringend, jwt-Token anstelle von Zertifikaten zu verwenden. Es ist so viel einfacher und läuft nicht ab und Sie müssen sich nicht um Zertifikate und Schlüssel oder irgendetwas sorgen.

Verwandte Themen