菜鸟教程小白 发表于 2022-12-13 06:04:22

python - PyAPNs 和发送之间 sleep 的需要


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

<pre><code>apns.gateway_server.register_response_listener
</code></pre>

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

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

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

<p>对于如何在 APN 调用之间没有延迟的情况下工作有什么建议,或者是否有针对所需延迟的最佳实践?</p>

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

<pre><code>class PushAdmin(webapp2.RequestHandler):

    retryAPNList=[]
    channelID=&#34;&#34;
    channelName = &#34;&#34;
    userName=&#34;&#34;

    apns = APNs(use_sandbox=True,cert_file=&#34;mycert.pem&#34;, key_file=&#34;mykey.pem&#34;, enhanced=True)

    def devChannelPush(self,channel,name,sendAlerts):
      ucs = UsedChannelStore()
      pus = PushUpdateStore()
      channelName = &#34;&#34;
      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=&#34;A message from &#34; +self.userName+ &#34; posted to &#34;+self.channelName, sound=&#34;default&#34;, badge=1, custom={&#34;channel&#34;:self.channelID})

      if len(self.retryAPNList)&gt;0:
            token +=1
            for x in self.retryAPNList:
                  self.apns.gateway_server.send_notification(x, payload, identifier = token)
                  time.sleep(0.5)
</code></pre>

<p>下面是调用类(缩写以减少无关项):</p>

<pre><code>class ChannelStore(ndb.Model):
   def writeMessage(self,ID,name,message,imageKey,fileKey):
      notify = PushAdmin()

      notify.devChannelPush(ID,name,True)
</code></pre>

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

<pre><code>def retryAPNPush(self):
      identifier = 1
      token = -1
      payload = Payload(alert=&#34;A message from &#34; +self.userName+ &#34; posted to &#34;+self.channelName, sound=&#34;default&#34;, badge=1, custom={&#34;channel&#34;:self.channelID})

      if len(self.retryAPNList)&gt;0:
            token +=1
            for x in self.retryAPNList:
                self.apns.gateway_server.send_notification(x, payload, identifier = token)
            time.sleep(0.5)
</code></pre>

<p>分辨率:</p>

<p>正如底部注释中所述,解决此问题的方法是将以下语句移至类外的模块级别。这样就不需要任何 sleep 语句。</p>

<pre><code>apns = APNs(use_sandbox=True,cert_file=&#34;mycert.pem&#34;, key_file=&#34;mykey.pem&#34;, enhanced=True)
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>实际上,PyAPNS 会自动为您重新发送丢弃的通知,请参阅 <a href="https://github.com/djacobs/PyAPNs#enhanced-message-with-immediate-error-response" rel="noreferrer noopener nofollow">PyAPNS</a> </p>

<p>所以你不必自己重试,你只需记录哪些通知有坏 token 。</p>

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

<p>我建议你把APNS对象拉到类或模块级别,这样它就可以完成它的错误处理过程并重用TCP连接。</p>

<p>如果有帮助请告诉我,谢谢:)</p></p>
                                   
                                                <p style="font-size: 20px;">关于python - PyAPNs 和发送之间 sleep 的需要,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/29178740/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/29178740/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: python - PyAPNs 和发送之间 sleep 的需要