簡體   English   中英

制作.p12 / .pem並在本地測試APNS的正確方法

[英]Correct way to make .p12/.pem and test APNS locally

我找不到任何腳本來突出顯示如何創建.p12 / .pem文件並在本地測試推送通知。

我發現制作.pem文件(帶/不帶密碼,.key和.cer組合等)和.p12文件的多種方法,但最終出現ssl錯誤或無效的設備令牌。

哪個腳本有效,以及如何創建所需的證書。

如果您堅持使用.pem和證書,則以下代碼將起作用。

# 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())

PS我強烈建議使用jwt令牌而不是證書。 它非常容易,而且不會過期,您不必擔心證書,密鑰或其他任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM