title: Multiple iPhone APN messages, single connection
body: <p>I have a strange issue. I'm trying to get Apple Push Notifications working with Python. I can connect and send individual messages without a problem. The issues pop up when I start sending more than one message, but it's more bizarre than even that.</p>
  
  <p>I'm testing with multiple devices... some iPhones and some iPod Touches. I can send multiple messages to the iPhones without a hitch, but if I have an iPod Touch device id in the list, any message that goes after will fail. </p>
  
  <p>So if I send 4 messages in sequence like this:</p>
  
  <p>1 - iPhone<br/>
  2 - iPhone<br/>
  3 - ipod Touch<br/>
  4 - iPhone<br/></p>
  
  <p>1 and 2 will be delivered, 3 and 4 fail. </p>
  
  <p>Using the same device ID's, if I move any of the iPod Touch device ID's to be the first message, all messages will fail. Likewise, if I only send to iPhones, all messages will succeed. </p>
  
  <p>Here's the code I'm testing with, in it's current state, I would only get the first two messages, the last two will fail every time.</p>
  
  <pre><code>import struct, ssl, json, sys, time, socket, binascii
  from optparse import OptionParser
  
  class PushSender(object):
  
      def __init__(self, host, cert, key):
          self.apnhost = (host, 2195)
          self.sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM),
                                      keyfile = key,
                                      certfile = cert,
                                      do_handshake_on_connect=False)
          self.sock.connect(self.apnhost)
          while True:
              try:
                  self.sock.do_handshake()
                  break
              except ssl.SSLError, err:
                  if err.args[0] == ssl.SSL_ERROR_WANT_READ:
                      select.select([self.sock], [], [])
                  elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
                      select.select([], [self.sock], [])
                  else:
                      raise
  
      def send_message(self, token, message):
          payload = {'aps':{'alert':message}}
          token = binascii.unhexlify(token)
          payloadstr = json.dumps(payload, separators=(',',':'))
          payloadLen = len(payloadstr)
          fmt = "!BH32sH%ds" % payloadLen
          notification = struct.pack(fmt, 0, 32, token, payloadLen, payloadstr)
          self.sock.write(notification)
          self.sock.
  
  
      def close(self):
          self.sock.close()
  
  def main():
      parser = OptionParser()
      parser.add_option("-c", "--certificate", dest="cert",
                        metavar="FILE",
                        help="Certificate file", )
  
      parser.add_option("-p", "--privatekey", dest="key",
                        metavar="FILE",
                        help="Key file", )
      parser.add_option("--host", help="apn host", dest='host')
      (options, args) = parser.parse_args()
  
      sender = PushSender(options.host, options.cert, options.key)
  
      iphone1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      print 'Sending iPhone #1 a message.'
      print sender.send_message(iphone1,'Hey iPhone #1.')
  
      iphone2 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      print 'Sending iPhone #2 a message.'
      print sender.send_message(iphone2,'Hey iPhone #2.')
  
      ipod1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      print 'Sending iPod #1 a message.'
      print sender.send_message(ipod1,'Hey iPod #1.')
  
      iphone3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      print 'Sending iPhone #3 a message.'
      print sender.send_message(iphone3,'Hey iPhone #3.')
  
      sender.close()
  
  if __name__=="__main__":
      main()
  </code></pre>
  
  <p>Any help would be appreciated...</p>