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)
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)
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)
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)
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
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()
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))
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)
#!/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
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)