Skip to content

Commit

Permalink
fix(apns): fix apns base url and add required header
Browse files Browse the repository at this point in the history
fixes #215
  • Loading branch information
dcai committed Apr 26, 2020
1 parent 68090af commit ec24480
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 11 deletions.
2 changes: 1 addition & 1 deletion api/push.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ async def post(self):
alert = "".join(alert.splitlines())

# https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html#//apple_ref/doc/uid/TP40008194-CH17-SW1
apns_default = {"badge": None, "sound": None}
apns_default = {"badge": None, "sound": "default", "push_type": "alert"}
apnspayload = request_dict.get("apns", {})
conn = self.get_apns_conn()
if conn:
Expand Down
31 changes: 23 additions & 8 deletions pushservices/apns.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
import jwt
import time

BASE_URL = "api.development.push.apple.com:443"
# BASE_URL_DEV = "api.development.push.apple.com:443"
BASE_URL_PROD = "api.push.apple.com:443"
ALGORITHM = "ES256"


Expand All @@ -31,7 +32,8 @@ def __init__(self, **kwargs):
self.instanceid = kwargs["instanceid"]
self.last_token_refresh = 0
self.token = None
self.http2 = hyper.HTTPConnection(BASE_URL)
self.http2 = hyper.HTTPConnection(BASE_URL_PROD)
# self.http2dev = hyper.HTTPConnection(BASE_URL_DEV)

def create_token(self):
now = time.time()
Expand All @@ -48,13 +50,14 @@ def create_token(self):
self.token = token.decode("ascii")
return self.token

def build_headers(self):
def build_headers(self, push_type="alert"):

token = self.create_token()

return {
"apns-expiration": "0",
"apns-priority": "10",
"apns-push-type": push_type, # alert or background
"apns-topic": self.bundle_id,
"mutable-content": "1",
"authorization": "bearer {0}".format(token),
Expand All @@ -68,16 +71,28 @@ def process(self, **kwargs):
if alert is not None and not isinstance(alert, dict):
alert = {"body": alert, "title": alert}

filtered_apns = {
k: v
for (k, v) in apns.items()
if k
in [
"thread-id",
"category",
"content-available",
"sound",
"badge",
"alert",
]
}
# data structure:
# https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html#//apple_ref/doc/uid/TP40008194-CH17-SW1
payload_data = {"aps": {"alert": alert, **apns}}
payload = json_encode(payload_data)
self.payload = payload
payload_data = {"aps": {"alert": alert, **filtered_apns}}
self.payload = json_encode(payload_data)

PATH = "/3/device/{0}".format(token)
self.headers = self.build_headers()
self.headers = self.build_headers(push_type=apns["push_type"])

self.http2.request("POST", PATH, payload, headers=self.headers)
self.http2.request("POST", PATH, self.payload, headers=self.headers)
resp = self.http2.get_response()

if resp.status >= 400:
Expand Down
22 changes: 20 additions & 2 deletions tests/test_apns.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,22 +47,40 @@ def test_apns(self, jwt, req):
"instanceid": "",
}
apns = ApnsClient(**kwargs)
apns_default = {"badge": None, "sound": "default", "push_type": "alert"}
apns.process(
token="aaa", alert="alert", apns={"badge": 12},
token="aaa", alert="alert", apns={**apns_default, **{"badge": 12}},
)
self.assertDictEqual(
apns.headers,
{
"apns-expiration": "0",
"apns-priority": "10",
"apns-push-type": "alert",
"apns-topic": "com.airnotifier",
"authorization": "bearer encode_jwt",
"mutable-content": "1",
},
)
self.assertEqual(
apns.payload,
'{"aps": {"alert": {"body": "alert", "title": "alert"}, "badge": 12}}',
'{"aps": {"alert": {"body": "alert", "title": "alert"}, "badge": 12, "sound": "default"}}',
)
apns.process(
token="aaa",
alert="alert",
apns={**apns_default, **{"badge": 12, "push_type": "background"}},
)
self.assertDictEqual(
apns.headers,
{
"apns-expiration": "0",
"apns-priority": "10",
"apns-push-type": "background",
"apns-topic": "com.airnotifier",
"authorization": "bearer encode_jwt",
"mutable-content": "1",
},
)


Expand Down

0 comments on commit ec24480

Please sign in to comment.