PyAPNs和发送之间需要hibernate

我正在使用PyAPNs向iOS设备发送通知。 我经常发送一组通知。 如果任何令牌因任何原因而变坏,则该过程将停止。 因此,我使用增强的设置和以下方法:

apns.gateway_server.register_response_listener 

我使用它来跟踪哪个令牌是问题,然后我从那里接收发送其余的。 问题是,当发送陷阱这些错误的唯一方法是在令牌发送之间使用睡眠定时器。 例如:

 for x in self.retryAPNList: apns.gateway_server.send_notification(x, payload, identifier = token) time.sleep(0.5) 

如果我不使用睡眠定时器,则不会捕获任何错误,因此当存在错误令牌时,我的整个APN列表不会被发送到进程。 但是,这个睡眠定时器有点武断。 有时0.5秒是足够的,而有时我必须将它设置为1.在任何情况下,如果没有添加一些睡眠延迟,它都无法工作。 这样做会减慢网络电话的速度,并且进入随机hibernate时间的感觉不足以防范。

有关如何在APN呼叫之间没有延迟的情况下工作的任何建议,或者是否需要延迟的最佳做法?

由于下面的请求,添加更多代码。 以下是我用来控制它的类中的3个方法:

 class PushAdmin(webapp2.RequestHandler): retryAPNList=[] channelID="" channelName = "" userName="" apns = APNs(use_sandbox=True,cert_file="mycert.pem", key_file="mykey.pem", enhanced=True) def devChannelPush(self,channel,name,sendAlerts): ucs = UsedChannelStore() pus = PushUpdateStore() channelName = "" refreshApnList = pus.getAPN(channel) if sendAlerts: alertApnList,channelName = ucs.getAPN(channel) if not alertApnList: alertApnList=[] if not refreshApnList: refreshApnList=[] pushApnList = list(set(alertApnList+refreshApnList)) elif refreshApnList: pushApnList = refreshApnList else: pushApnList = [] self.retryAPNList = pushApnList self.channelID = channel self.channelName = channelName self.userName = name self.retryAPNPush() def retryAPNPush(self): token = -1 payload = Payload(alert="A message from " +self.userName+ " posted to "+self.channelName, sound="default", badge=1, custom={"channel":self.channelID}) if len(self.retryAPNList)>0: token +=1 for x in self.retryAPNList: self.apns.gateway_server.send_notification(x, payload, identifier = token) time.sleep(0.5) 

下面是调用类(缩写为减少非相关项):

 class ChannelStore(ndb.Model): def writeMessage(self,ID,name,message,imageKey,fileKey): notify = PushAdmin() notify.devChannelPush(ID,name,True) 

下面是我对睡眠计时器的位置所做的微小改动,似乎已经解决了这个问题。 但是,我仍然担心在所有情况下给出的时间是否合适。

 def retryAPNPush(self): identifier = 1 token = -1 payload = Payload(alert="A message from " +self.userName+ " posted to "+self.channelName, sound="default", badge=1, custom={"channel":self.channelID}) if len(self.retryAPNList)>0: token +=1 for x in self.retryAPNList: self.apns.gateway_server.send_notification(x, payload, identifier = token) time.sleep(0.5) 

解析度:

如底部注释中所述,解决此问题的方法是将以下语句移至类外的模块级别。 通过这样做,不需要任何睡眠陈述。

 apns = APNs(use_sandbox=True,cert_file="mycert.pem", key_file="mykey.pem", enhanced=True) 

事实上,PyAPNS会自动为您重新发送已删除的通知,请参阅PyAPNS

因此,您不必自己重试,您只需记录哪些通知有不良令牌。

您的代码的行为可能是由保存在本地范围内的APNS对象产生的( if len(self.retryAPNList)>0:if len(self.retryAPNList)>0:

我建议你将APNS对象拉出到类或模块级别,以便它可以完成其error handling过程并重用TCP连接。

如果有帮助,请告诉我,谢谢:)