Пример #1
0
def push(token, message, badge_num, name, item_type):
    con = Session.new_connection(
        ("gateway.push.apple.com",
         2195),
        cert_file="cert.pem",
        passphrase="this is the queue push key")

    message_packet = Message(
        token,
        alert=message,
        badge=badge_num,
        user=name,
        sound="default",
        itemType=item_type)

    srv = APNs(con)
    res = srv.send(message_packet)

    # Check failures. Check codes in APNs reference docs.
    for token, reason in res.failed.items():
        code, errmsg = reason

    if res.needs_retry():
        retry_message = res.retry()
        res = srv.send(retry_message)
Пример #2
0
    def test_send(self):
        # success, retry + include-failed, don't-retry + include-failed
        backend = DummyBackend(push=(None, 1, 3))
        session = Session(pool=backend)

        msg = Message(["0123456789ABCDEF", "FEDCBA9876543210"], alert="my alert", badge=10, content_available=1, my_extra=15)
        push_con = session.get_connection("push_production", cert_string="certificate")
        srv = APNs(push_con)
        res = srv.send(msg)
        self.assertEqual(len(res.failed), 0)
        self.assertEqual(len(res.errors), 0)
        self.assertFalse(res.needs_retry())

        push_con2 = session.get_connection("push_production", cert_string="certificate")
        srv = APNs(push_con2)
        self.assertEqual(session.pool.push_result_pos, 0)
        session.pool.push_result_pos += 1
        res = srv.send(msg)
        self.assertEqual(len(res.failed), 0)
        self.assertEqual(len(res.errors), 1)
        self.assertTrue(res.needs_retry())

        # indeed, we have used the cache
        self.assertEqual(session.pool.new_connections, 1)

        push_con = session.new_connection("push_production", cert_string="certificate")
        srv = APNs(push_con)
        res = srv.send(msg)
        self.assertEqual(len(res.failed), 0)
        self.assertEqual(len(res.errors), 1)
        self.assertFalse(res.needs_retry())

        # indeed, new connection, we haven't used the cache
        self.assertEqual(session.pool.new_connections, 2)
Пример #3
0
    def test_send(self):
        # success, retry + include-failed, don't-retry + include-failed
        backend = DummyBackend(push=(None, 1, 3))
        session = Session(pool=backend)

        msg = Message(["0123456789ABCDEF", "FEDCBA9876543210"], alert="my alert", badge=10, content_available=1, my_extra=15)
        push_con = session.get_connection("push_production", cert_string="certificate")
        srv = APNs(push_con)
        res = srv.send(msg)
        self.assertEqual(len(res.failed), 0)
        self.assertEqual(len(res.errors), 0)
        self.assertFalse(res.needs_retry())

        push_con2 = session.get_connection("push_production", cert_string="certificate")
        srv = APNs(push_con2)
        self.assertEqual(session.pool.push_result_pos, 0)
        session.pool.push_result_pos += 1
        res = srv.send(msg)
        self.assertEqual(len(res.failed), 0)
        self.assertEqual(len(res.errors), 1)
        self.assertTrue(res.needs_retry())

        # indeed, we have used the cache
        self.assertEqual(session.pool.new_connections, 1)

        push_con = session.new_connection("push_production", cert_string="certificate")
        srv = APNs(push_con)
        res = srv.send(msg)
        self.assertEqual(len(res.failed), 0)
        self.assertEqual(len(res.errors), 1)
        self.assertFalse(res.needs_retry())

        # indeed, new connection, we haven't used the cache
        self.assertEqual(session.pool.new_connections, 2)
Пример #4
0
def push_to_ios_devices_raw(devices=None, **kwargs):
    conn = Session.new_connection(settings.IOS_PUSH_SERVER,
                                  cert_file=settings.IOS_CERT)
    srv = APNs(conn)
    if devices is None:
        devices = APNSDevice.objects.filter(active=True).values_list(
            "registration_id", flat=True)
    message = Message(devices, **kwargs)
    res = srv.send(message)
    if res.needs_retry():
        push_to_ios_devices_raw.delay(devices=res.retry().tokens, **kwargs)
Пример #5
0
def get_ios_device_feedback():
    conn = Session.new_connection(settings.IOS_FEEDBACK_SERVER,
                                  cert_file=settings.IOS_CERT)
    srv = APNs(conn, tail_timeout=10)
    for token, since in srv.feedback():
        print token
        try:
            obj = APNSDevice.objects.get(registration_id=token)
            obj.active = False
            obj.save()
        except APNSDevice.DoesNotExist:
            pass
Пример #6
0
def remove_tokens():
# feedback needs no persistent connections.
    con = Session.new_connection(("gateway.push.apple.com", 2196), cert_file=os.path.join(os.getcwd(), 'cert.pem'), passphrase="this is the queue push key")

# feedback server might be slow, so allow it to time out in 10 seconds
    srv = APNs(con, tail_timeout=10)

# automatically closes connection for you
    for token, since in srv.feedback():
        user = db.session.query(User).filter(User.device_token == token).one()
        user.device_token = None
        db.session.add(user)

    db.session.commit()
Пример #7
0
    def _init_apns(self):
        """Obtain new connection to APNs. This method will not re-use existing
        connection from the pool. The connection will be closed after use.

        Unlike: `get_connection` this method does not cache the connection.
        Use it to fetch feedback from APNs and then close when you are done.
        """
        run_path = os.getcwd()
        cert_file = "%s/%s/%s" %(
            run_path,
            CONF.IOS.cert_child_path,
            CONF.IOS.cert_file_name
        )

        try:
            session = Session()
            self.apns_conn = session.new_connection(
                address=CONF.IOS.feedback_address,
                cert_file=cert_file,
                passphrase=CONF.IOS.cert_passphrase
            )
        except Exception as _ex:
            LOG.error("init feedback non-cached connection exception: %s"
                      % str(_ex))
Пример #8
0
 def test_feedback(self):
     backend = DummyBackend(feedback=5)
     session = Session(pool=backend)
     feed_con = session.new_connection("feedback_production", cert_string="certificate")
     srv = APNs(feed_con)
     self.assertEqual(len(list(srv.feedback())), 5)
Пример #9
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Author: jinlong.yang
#

from apnsclient import (
    Session,
    APNs
)
from pprint import pprint

session = Session()
conn =session.new_connection("feedback_sandbox", cert_file="apns.pem", passphrase="1234")

service = APNs(conn)
pprint(vars(service))

try:
    # on any IO failure after successfull connection this generator
    # will simply stop iterating. you will pick the rest of the tokens
    # during next feedback session.
    # feedback的接口取到的是上次推送的过程中出现的已卸载应用的设备token,而且获取一次之后就会清空
    for token, when in service.feedback():
        # every time a devices sends you a token, you should store
        # {token: given_token, last_update: datetime.datetime.now()})
        print token
        print when

        # the token wasn't updated after the failure has
        # been reported, so the token is invalid and you should
Пример #10
0
 def test_feedback(self):
     backend = DummyBackend(feedback=5)
     session = Session(pool=backend)
     feed_con = session.new_connection("feedback_production", cert_string="certificate")
     srv = APNs(feed_con)
     self.assertEqual(len(list(srv.feedback())), 5)