def METHOD_NAME(self, router_token, payload, apns_id,
         priority=True, topic=None, exp=None):
    """Send the dict of values to the remote bridge
    This sends the raw data to the remote bridge application using the
    APNS2 HTTP2 API.
    :param router_token: APNs provided hex token identifying recipient
    :type router_token: str
    :param payload: Data to send to recipient
    :type payload: dict
    :param priority: True is high priority, false is low priority
    :type priority: bool
    :param topic: BundleID for the recipient application (overides default)
    :type topic: str
    :param exp: Message expiration timestamp
    :type exp: timestamp
    """
    body = json.dumps(payload, cls=ComplexEncoder)
    priority = APNS_PRIORITY_IMMEDIATE if priority else APNS_PRIORITY_LOW
    # NOTE: Hyper requires that all header values be strings. 'Priority'
    # is a integer string, which may be "simplified" and cause an error.
    # The added str() function safeguards against that.
    headers = {
        'apns-id': apns_id,
        'apns-priority': str(priority),
        'apns-topic': topic or self.topic,
    }
    if exp:
        headers['apns-expiration'] = str(exp)
    url = '/3/device/' + router_token
    attempt = 0
    while True:
        try:
            connection = self._get_connection()
            # request auto-opens closed connections, so if a connection
            # has timed out or failed for other reasons, it's automatically
            # re-established.
            stream_id = connection.request(
                'POST', url=url, body=body, headers=headers)
            # get_response() may return an AttributeError. Not really sure
            # how it happens, but the connected socket may get set to None.
            # We'll treat that as a premature socket closure.
            response = connection.get_response(stream_id)
            if response.status != 200:
                reason = json.loads(
                        response.read().decode('utf-8'))['reason']
                raise RouterException(
                    "APNS Transmit Error {}:{}".format(response.status,
                                                       reason),
                    status_code=response.status,
                    response_body="APNS could not process "
                                  "your message {}".format(reason),
                    log_exception=True,
                    reason=reason
                )
            break
        except (HTTP20Error, IOError):
            connection.close()
            attempt += 1
            if attempt < self._max_retry:
                continue
            raise
        finally:
            # Returning a closed connection to the pool is ok.
            # hyper will reconnect on .request()
            self._return_connection(connection)