Package: pushjack-http2
Push notifications for APNS (iOS) and GCM (Android). It provides HTTP/2 network protocol based APNS client.QuickstartInstall using pip:pip install pushjack-http2Whether usingAPNSorGCM, pushjack provides clients for each. It also provides
a HTTP/2 based APNS client.APNS (using certificates)Send notifications using theAPNSClientclass:frompushjack_http2importAPNSClientclient=APNSClient(certificate='<path/to/certificate.pem>',default_error_timeout=10,default_expiration_offset=2592000,default_batch_size=100,default_retries=5)token='<device token>'alert='Hello world.'# Send to single device.# NOTE: Keyword arguments are optional.res=client.send(token,alert,badge='badge count',sound='sound to play',category='category',content_available=True,title='Title',title_loc_key='t_loc_key',title_loc_args='t_loc_args',action_loc_key='a_loc_key',loc_key='loc_key',launch_image='path/to/image.jpg',extra={'custom':'data'})# Send to multiple devices by passing a list of tokens.client.send([token],alert,**options)Access response data.# List of all tokens sent.res.tokens# List of errors as APNSServerError objectsres.errors# Dict mapping errors as token => APNSServerError object.res.token_errorsOverride defaults for error_timeout, expiration_offset, and batch_size.client.send(token,alert,expiration=int(time.time()+604800),error_timeout=5,batch_size=200)Send a low priority message.# The default is low_priority == Falseclient.send(token,alert,low_priority=True)Get expired tokens.expired_tokens=client.get_expired_tokens()Close APNS connection.client.close()For the APNS sandbox, useAPNSSandboxClientinstead:frompushjack_http2importAPNSSandboxClientAPNS (using Auth tokens)Send notifications using theAPNSHTTP2Clientclass:frompushjack_http2importAPNSHTTP2Clientkey="my_key"token=apns.APNSAuthToken(token=key,team_id="my_team_id",key_id="my_key_id",)client=apns.APNSHTTP2Client(token=token,bundle_id='my_bundle_id',)response=client.send_message(device_id="my_device_id",message="message",content_available=True,title="title")Close APNS connection.client.conn.close()For the APNS sandbox, useAPNSHTTP2SandboxClientinstead:frompushjack_http2importAPNSHTTP2SandboxClientGCMSend notifications using theGCMClientclass:frompushjack_http2importGCMClientclient=GCMClient(api_key='<api-key>')registration_id='<registration id>'alert='Hello world.'notification={'title':'Title','body':'Body','icon':'icon'}# Send to single device.# NOTE: Keyword arguments are optional.res=client.send(registration_id,alert,notification=notification,collapse_key='collapse_key',delay_while_idle=True,time_to_live=604800)# Send to multiple devices by passing a list of ids.client.send([registration_id],alert,**options)Alert can also be be a dictionary with data fields.alert={'message':'Hello world','custom_field':'Custom Data'}Alert can also contain the notification payload.alert={'message':'Hello world','notification':notification}Send a low priority message.# The default is low_priority == Falseclient.send(registration_id,alert,low_priority=True)Access response data.# List of requests.Response objects from GCM Server.res.responses# List of messages sent.res.messages# List of registration ids sent.res.registration_ids# List of server response data from GCM.res.data# List of successful registration ids.res.successes# List of failed registration ids.res.failures# List of exceptions.res.errors# List of canonical ids (registration ids that have changed).res.canonical_idsChangelogv2.1.0 (28-02-2020)ImportAPNSAuthTokento__init__.py.v1.5.0 (2018-07-29)gcm: Use FCM URL instead of deprecated GCM URL. ThanksLukas Anzinger!v1.4.1 (2018-06-18)apns: Remove restriction on token length due to incorrect assumption about tokens always being 64 characters long.v1.4.0 (2017-11-09)apns: Add exceptionsAPNSProtocolErrorandAPNSTimeoutError.  ThanksJakub Kleň!apns: Add retry mechanism toAPNSClient.send. ThanksJakub Kleň!Adddefault_retriesargument toAPNSClientinitialization. Defaults to5.Addretriesargument toAPNSClient.send. By default will useAPNSClient.default_retriesunless explicitly passed in.If unable to send afterretries, anAPNSTimeoutErrorwill be raised.apns: Fix bug in bulkAPNSClient.sendthat resulted in an off-by-one error for message identifier in returned errors. ThanksJakub Kleň!apns: Add max payload truncation option toAPNSClient.send.  ThanksJakub Kleň!Adddefault_max_payload_lengthargument toAPNSClientinitialization. Defaults to0which disabled max payload length check.Addmax_payload_lengthargument toAPNSClient.send. By default will useAPNSClient.default_max_payload_lengthunless explicitly passed in.Whenmax_payload_lengthset, messages will be truncated to fit within the length restriction by trimming the “message” text and appending it with “…”.v1.3.0 (2017-03-11)apns: Optimize reading from APNS Feedback so that the number of bytes read are based on header and token lengths.apns: Explicitly close connection to APNS Feedback service after reading data.apns: Add support formutable-contentfield (Apple Notification Service Extension) viamutable_contentargument toAPNSClient.send(). ThanksAhmed Khedr!apns: Add support forthread-idfield (group identifier in Notification Center) viathread_idargument toAPNSClient.send(). ThanksAhmed Khedr!v1.2.1 (2015-12-14)apns: Fix implementation of empty APNS notifications and allow notifications with{"aps": {}}to be sent. ThanksJulius Seporaitis!v1.2.0 (2015-12-04)gcm: Add support forpriorityfield to GCM messages vialow_prioritykeyword argument. Default behavior is for all messages to be"high"priority. This is the opposite of GCM messages but mirrors the behavior in the APNS module where the default priority is"high".v1.1.0 (2015-10-22)gcm: Add support fornotificationfield to GCM messages.gcm: Replaceregistration_idsfield withtofield when sending to a single recipient sinceregistration_idsfield has been deprecated for single recipients.v1.0.1 (2015-05-07)gcm: Fix incorrect authorization header in GCM client. ThanksBrad Montgomery!v1.0.0 (2015-04-28)apns: AddAPNSSandboxClientfor sending notifications to APNS sandbox server.apns: Addmessageattribute toAPNSResponse.pushjack: Add internal logging.apns: Fix APNS error checking to properly handle reading when no data returned.apns: Make APNS sending stop during iteration if a fatal error is received from APNS server (e.g. invalid topic, invalid payload size, etc).apns/gcm: Make APNS and GCM clients maintain an active connection to server.apns: Make APNS always returnAPNSResponseobject instead of only raisingAPNSSendErrorwhen errors encountered. (breaking change)apns/gcm: Remove APNS/GCM module send functions and only support client interfaces. (breaking change)apns: Removeconfigargument fromAPNSClientand use individual method parameters as mapped below instead: (breaking change)APNS_ERROR_TIMEOUT=>default_error_timeoutAPNS_DEFAULT_EXPIRATION_OFFSET=>default_expiration_offsetAPNS_DEFAULT_BATCH_SIZE=>default_batch_sizegcm: Removeconfigargument fromGCMClientand use individual method parameters as mapped below instead: (breaking change)GCM_API_KEY=>api_keypushjack: Removepushjack.clientsmodule. (breaking change)pushjack: Removepushjack.configmodule. (breaking change)gcm: RenameGCMResponse.payloadstoGCMResponse.messages. (breaking change)v0.5.0 (2015-04-22)apns: Add new APNS configuration valueAPNS_DEFAULT_BATCH_SIZEand set to100.apns: Addbatch_sizeparameter to APNSsendthat can be used to overrideAPNS_DEFAULT_BATCH_SIZE.apns: Make APNSsendbatch multiple notifications into a single payload. Previously, individual socket writes were performed for each token. Now, socket writes are batched based on either theAPNS_DEFAULT_BATCH_SIZEconfiguration value or thebatch_sizefunction argument value.apns: Make APNSsendresume sending from after the failed token when an error response is received.apns: Make APNSsendraise anAPNSSendErrorwhen one or more error responses received.APNSSendErrorcontains an aggregation of errors, all tokens attempted, failed tokens, and successful tokens. (breaking change)apns: Replacepriorityargument to APNSsendwithlow_priority=False. (breaking change)v0.4.0 (2015-04-15)apns: Improve error handling in APNS so that errors aren’t missed.apns: Improve handling of APNS socket connection during bulk sending so that connection is re-established when lost.apns: Make APNS socket read/writes non-blocking.apns: Make APNS socket frame packing easier to grok.apns/gmc: Remove APNS and GCMsend_bulkfunction. Modifysendto support bulk notifications. (breaking change)apns: RemoveAPNS_MAX_NOTIFICATION_SIZEas config option.gcm: RemoveGCM_MAX_RECIPIENTSas config option.gcm: Removerequestargument from GCM send function. (breaking change)apns: Removesockargument from APNS send function. (breaking change)gcm: Return namedtuple for GCM canonical ids.apns: Return namedtuple class for APNS expired tokens.v0.3.0 (2015-04-01)gcm: Addrestricted_package_nameanddry_runfields to GCM sending.gcm: Add exceptions for all GCM server error responses.apns: Makeapns.get_expired_tokensandAPNSClient.get_expired_tokensaccept an optionalsockargument to provide a custom socket connection.apns: RaiseAPNSAuthErrorinstead ofAPNSErrorif certificate file cannot be read.apns: RaiseAPNSInvalidPayloadSizeErrorinstead ofAPNSDataOverflow. (breaking change)apns: RaiseAPNSInvalidTokenErrorinstead ofAPNSError.gcm: RaiseGCMAuthErrorifGCM_API_KEYis not set.pushjack: Rename several function parameters:  (breaking change)gcm:alerttodatagcm:token/tokenstoregistration_id/registration_idsgcm:Dispatcher/dispatchertoGCMRequest/requestClients:registration_idtodevice_idgcm: ReturnGCMResponseobject forGCMClient.send/send_bulk. (breaking change)gcm: Returnrequests.Responseobject(s) forgcm.send/send_bulk. (breaking change)v0.2.2 (2015-03-30)apns: Fix payload key assigments fortitle-loc,title-loc-args, andlaunch-image. Previously,'_'was used in place of'-'.v0.2.1 (2015-03-28)apns: Fix incorrect variable reference inapns.receive_feedback.v0.2.0 (2015-03-28)pushjack: Fix handling ofconfigin clients whenconfigis a class object and subclass ofConfig.apns: Makeapns.send/send_bulkaccept additionalalertfields:title,title-loc,title-loc-args, andlaunch-image.gcm: Makegcm.send/send_bulkraise aGCMErrorexception ifGCM_API_KEYis not set.gcm: Make gcm payload creation castdatato dict if isn’t not passed in as one. Original value ofdatais then set to{'message': data}. (breaking change)gcm: Make gcm payload creation not set defaults for optional keyword arguments. (breaking change)v0.1.0 (2015-03-26)pushjack: Renamepushjack.settingsmodule topushjack.config. (breaking change)apns/gcm: Allow config settings overrides to be passed intocreate_gcm_config,create_apns_config, andcreate_apns_sandbox_config.pushjack: OverrideConfig’supdate()method with custom method that functions similarly tofrom_object()except that it accepts adictinstead.v0.0.1 (2015-03-25)First release.LicenseThe MIT License (MIT)Copyright (c) 2015 Derrick GillandPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.