制作 .p12/.pem 并在本地测试 APNS 的正确方法

Posted

技术标签:

【中文标题】制作 .p12/.pem 并在本地测试 APNS 的正确方法【英文标题】:Correct way to make .p12/.pem and test APNS locally 【发布时间】:2017-10-23 15:55:37 【问题描述】:

我找不到任何强调如何在本地创建 .p12/.pem 文件和测试推送通知的脚本。

我找到了多种制作 .pem 文件(带/不带密码、.key 和 .cer 组合等)和 .p12 文件的方法,但最终会出现 ssl 错误或无效的设备令牌。

哪个脚本有效,我如何创建它需要的证书。

【问题讨论】:

【参考方案1】:

如果你坚持使用 .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())

附:我强烈建议使用 jwt 令牌而不是证书。它更容易并且不会过期,您不必担心证书和密钥或任何东西。

【讨论】:

以上是关于制作 .p12/.pem 并在本地测试 APNS 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

苹果开发证书集锦(cer、p12、pem等生成使用)

APNS:不适用于 Windows 服务器

iOS apns推送

注册 APNS 错误,NSCocoaErrorDomain Code=3000

制作P版openstack本地源

Phonegap 使用 GCM 向 ios 推送通知