예제 #1
0
 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'
     })
예제 #2
0
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'
예제 #3
0
 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'
     })
예제 #4
0
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'
예제 #5
0
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'
    }
예제 #6
0
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.")