gpt4 book ai didi

python - PyAPNs 和在发送之间休眠的需要

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:50 24 4
gpt4 key购买 nike

我正在使用 PyAPNs 向 iOS 设备发送通知。我经常一次发送多组通知。如果任何 token 因任何原因损坏,该过程将停止。因此,我使用了增强设置和以下方法:

apns.gateway_server.register_response_listener

我用它来跟踪哪个 token 有问题,然后我从那里接收并发送其余 token 。问题是发送时捕获这些错误的唯一方法是在 token 发送之间使用 sleep 定时器。例如:

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

如果我不使用 sleep 计时器,则不会捕获任何错误,因此我的整个 APN 列表不会被发送到,因为当出现错误 token 时进程会停止。然而,这个 sleep 定时器有些随意。有时 0.5 秒就足够了,而其他时候我不得不将其设置为 1。在任何情况下,如果不添加一些 sleep 延迟,它就无法工作。这样做会减慢网络调用速度,并且进入随机 sleep 时间感觉不那么可靠。

对于如何在 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)

下面是我对 sleep 计时器的位置所做的细微更改,似乎已经解决了这个问题。然而,我仍然担心所给予的时间是否在所有情况下都是正确的。

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)

解决方案:

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

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

最佳答案

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

所以你不必自己重试,你可以只记录哪些通知有坏 token 。

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

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

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

关于python - PyAPNs 和在发送之间休眠的需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com