我正在使用PyAPNs向iOS设备发送通知。我经常一次发送多组通知。如果任何令牌由于任何原因损坏,进程将停止。因此,我使用了增强的设置和以下方法:
apns.gateway_server.register_response_listener
我用这个来跟踪哪个令牌出了问题,然后从那里取下剩下的。问题是,在发送时,捕获这些错误的唯一方法是在令牌发送之间使用睡眠计时器。例如:
^{pr2}$如果我不使用睡眠计时器,则不会捕捉到错误,因此当出现错误标记时,整个APN列表都不会发送到。然而,这个睡眠计时器有点武断。有时0.5秒就足够了,而其他时候我不得不把它设为1。在任何情况下,如果不加上一些睡眠延迟,它都不会起作用。这样做会减慢网络通话的速度,而且输入随机睡眠时间感觉不到防弹性能。在
对于如何在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)
下面是调用类(缩写为reduce non-related items):
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
因此,您不必自己重试,只需记录哪些通知具有错误标记。在
代码的行为可能是由保存在本地范围内(在
if len(self.retryAPNList)>0:
内)的APNS对象引起的我建议您将APNS对象拉到类或模块级别,这样它就可以完成错误处理过程并重用TCP连接。在
请告诉我:)谢谢
相关问题 更多 >
编程相关推荐