【发布时间】:2015-03-21 02:56:40
【问题描述】:
我正在使用 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。在没有添加一些睡眠延迟的情况下,它无论如何都无法工作。这样做会减慢网络通话速度,并且进入随机睡眠时间感觉不那么安全。
关于如何在 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)
分辨率:
正如底部的 cmets 所述,解决此问题的方法是将以下语句移至类外的模块级别。这样就不需要任何睡眠语句。
apns = APNs(use_sandbox=True,cert_file="mycert.pem", key_file="mykey.pem", enhanced=True)
【问题讨论】:
-
这是贡献者之一,我可以看到更多完整的代码sn-p吗?包括apns是怎么构造的,retryAPNList是怎么处理的,为了排查问题,谢谢:)
-
感谢您的回复。我在上面的 OP 中添加了更多代码。
标签: python ios apple-push-notifications pyapns