def test_payload_with_payload_alert(self): payload = Payload( alert=self.payload_alert, badge=2, sound='chime', content_available=1, mutable_content=1, category='my_category', url_args='args', custom={'extra': 'something'}, thread_id=42) self.assertEqual(payload.dict(), { 'aps': { 'alert': { 'title': 'title', 'title-loc-key': 'loc_k', 'title-loc-args': 'loc_a', 'body': 'body', 'loc-key': 'body_loc_k', 'loc-args': 'body_loc_a', 'action-loc-key': 'ac_loc_k', 'action': 'send', 'launch-image': 'img' }, 'badge': 2, 'sound': 'chime', 'content-available': 1, 'mutable-content': 1, 'thread-id': 42, 'category': 'my_category', 'url-args': 'args', }, 'extra': 'something' })
def test_payload_with_payload_alert(payload_alert): payload = Payload(alert=payload_alert, badge=2, sound='chime', content_available=True, mutable_content=True, category='my_category', url_args='args', custom={'extra': 'something'}, thread_id='42') assert payload.dict() == { 'aps': { 'alert': { 'title': 'title', 'title-loc-key': 'loc_k', 'title-loc-args': ['loc_a'], 'body': 'body', 'loc-key': 'body_loc_k', 'loc-args': ['body_loc_a'], 'action-loc-key': 'ac_loc_k', 'action': 'send', 'launch-image': 'img' }, 'badge': 2, 'sound': 'chime', 'content-available': 1, 'mutable-content': 1, 'thread-id': '42', 'category': 'my_category', 'url-args': 'args', }, 'extra': 'something' } assert payload.push_type == 'alert'
def test_payload(self): payload = Payload( alert='my_alert', badge=2, sound='chime', content_available=1, mutable_content=3, category='my_category', url_args='args', custom={'extra': 'something'}, thread_id=42) self.assertEqual(payload.dict(), { 'aps': { 'alert': 'my_alert', 'badge': 2, 'sound': 'chime', 'content-available': 1, 'mutable-content': 1, 'thread-id': 42, 'category': 'my_category', 'url-args': 'args' }, 'extra': 'something' })
def test_payload_with_background_push_type(): payload = Payload(content_available=True, mutable_content=True, category='my_category', url_args='args', custom={'extra': 'something'}, thread_id='42') assert payload.dict() == { 'aps': { 'content-available': 1, 'mutable-content': 1, 'thread-id': '42', 'category': 'my_category', 'url-args': 'args', }, 'extra': 'something' } assert payload.push_type == 'background'
def test_payload(): payload = Payload( alert='my_alert', badge=2, sound='chime', content_available=True, mutable_content=True, category='my_category', url_args='args', custom={'extra': 'something'}, thread_id='42') assert payload.dict() == { 'aps': { 'alert': 'my_alert', 'badge': 2, 'sound': 'chime', 'content-available': 1, 'mutable-content': 1, 'thread-id': '42', 'category': 'my_category', 'url-args': 'args' }, 'extra': 'something' }
class APNSPushConnection: """ Create and push APNS notification to iOS devices """ def __init__(self, sandbox=True, yaml_tokens=False): self.sandbox = sandbox self.yaml = yaml_tokens self.payload = None self.tokens = [] with open("app.yaml") as app_file: try: app_data = yaml.safe_load(app_file) except yaml.YAMLError: sys.exit(yaml.YAMLError) else: self.config = { "auth-key": app_data["auth-key"], "auth-key-filename": app_data["auth-key-filename"], "bundle-id": app_data["bundle-id"], "cert-filename": app_data["cert-filename"], "team-id": app_data["team-id"], "api-url": app_data["api-url"] + "/tokens/" + app_data["bundle-id"] } self.credentials = TokenCredentials(auth_key_path=self.config["auth-key-filename"], auth_key_id=self.config["auth-key"], team_id=self.config["team-id"]) self.client = APNsClient(credentials=self.credentials, use_sandbox=self.sandbox) self.load_tokens() def load_tokens(self): """ Loads tokens from remote notification server or YAML file """ if self.yaml: with open("tokens.yaml") as token_file: try: tokens = [token for token in list(yaml.safe_load_all(token_file)) if token is not None] except yaml.YAMLError: sys.exit(yaml.YAMLError) else: self.tokens = [target["device-token"] for target in tokens if target["bundle-id"] == self.config["bundle-id"]] if len(self.tokens) == 0: sys.exit("Invalid data: no device tokens defined with matching BundleID") else: try: self.tokens = list(loads(requests.get(self.config["api-url"]).text)) except: # pylint: disable=W0702 sys.exit("Invalid data: no device tokens in JSON response, check remote notification server.") def create_payload(self, background=None, title="Title", body="Body", silent=True, badge=0): # pylint: disable=R0913 """ Constructs APNS payload """ if silent: sound = None else: sound = "Default" if background is not None: data = {"Data": background} self.payload = Payload(content_available=True, custom=data) else: alert = PayloadAlert(title=title, body=body) self.payload = Payload(alert=alert, sound=sound, badge=badge) def push(self): """ Sends APNS notification to given device IDs """ if not None in self.__dict__.values() and len(self.tokens) > 0: for target in self.tokens: print("Sending APNS payload", self.payload.dict(), "to", target) self.client.send_notification(token_hex=target, notification=self.payload, topic=self.config["bundle-id"]) else: sys.exit("Invalid data: failed to send notification, check configuration data.")