Python APNS (Apple Push Notification Service)


1. สร้าง Cert สร้าง app กันก่อน
https://github.com/Redth/PushSharp/wiki/How-to-Configure-&-Send-Apple-Push-Notifications-using-PushSharp
2. build App แล้วลอง run ดู เก็บ device_token ไว้
3. Generate file .pem จากไฟล์ p12 ที่ได้มาในขั้นแรก

openssl pkcs12 -in DEV_Certificates.p12 -out DEV_Certificates.pem -nodes -clcerts

4. เอาไฟล์ pem ที่ได้มา set ใน source python

import socket, ssl, json, struct

ssl_sock = None
message = 'Hello Push.!!'
deviceToken = 'ae6299005b338d5d3a45de49d33e1867a0f3148142a08588bf7ef402cb56f7ef'
theCertfile = 'Dev_cert.pem'
# for production change to 'gateway.push.apple.com'
theHost = ('gateway.sandbox.push.apple.com', 2195)

"""
Command line argument
"""
import sys
if (len(sys.argv) > 1):
  deviceToken = sys.argv[1]
if (len(sys.argv) > 2):
  message = sys.argv[2]

def createPushSocket() :
  global ssl_sock
  # Create our connection using the certfile saved locally
  ssl_sock = ssl.wrap_socket( socket.socket( socket.AF_INET, socket.SOCK_STREAM ), certfile = theCertfile )
  ssl_sock.connect( theHost )
def closePushSocket():
  global ssl_sock
  ssl_sock.close()

def sendPush(deviceToken, message):
  global ssl_sock

  json_message = {
     'aps': {
          'alert':message,
          'sound':'defaults',
          }
     }
  #ensure_ascii for Thai character and also use encode utf-8
  data = json.dumps(json_message, separators=(',',':'), ensure_ascii=True).encode('utf-8')

  #pack data
  deviceToken = deviceToken.replace(' ','')
  byteToken = deviceToken.decode('hex')
  theFormat = '!BH32sH%ds' % len(data)
  theNotification = struct.pack( theFormat, 0, 32, byteToken, len(data), data )

  # Write out our data
  ssl_sock.write( theNotification )

if __name__ == "__main__":
  createPushSocket()
  sendPush(deviceToken, message)
  closePushSocket()

5. ลอง Run ดู

$ python test.py ae6299005b338d5d3a45de49d33e1867a0f3148142a08588bf7ef402cb56f7ef 'สวัสดีจ้าาา Push'

เอวัง 😀
ปล. ยากๆ เลยน่าจะเป็นข้อแรก

Advertisements

8 thoughts on “Python APNS (Apple Push Notification Service)

    • feedback เอาไว้ดูว่าเราส่งไปถึงหรือเปล่าครับ กรณีที่ไม่ถึงก็อย่างเช่น
      – user ลบ App ไปแล้ว
      อะไรทำนองนี้ครับ

      device token นี่พอ user register push ได้มันก็มาเลยครับ
      method ตอนได้รับ token ประมาณนี้ครับ
      – (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)_deviceToken

      ถ้าเราทำ server เราก็ส่ง token ของ user ไปเก็บไว้กับ server เพื่อใช้ push ได้เลยครับ
      แต่ถ้าตอน Dev ก็ไม่ต้องส่งไปหรอกครับ copy มา Test เลยจะง่ายกว่า

  1. อ่าครับ ผมส่งdevice tokenไปที่server แล้วครับ แล้วก็ติดต่อกับAPNS เรียบร้อยแต่จังหวะสุดท้ายนี่ ข้อความมันไม่มาถึงเครื่องอะครับ จะตรวจสอบยังไงหรือเป็นที่สาเหตุใดครับ

    • 1. อันนี้ต้องลองกลับไปดูว่าข้อแรกทำถูกป่าว 555
      2. ลองใช้ test script แบบนี้ก่อน
      3. ลองเช็คเรื่อง port ที่ server

  2. จากโค้ดนี้เราเอา development.p12 แปลงเป็น.pem ไปไว้ที่ server แล้ว production.p12 นี่เอาไว้ที่ไหนอะครับ ที่ผมทำคือgenคีย์ทั้งสองรวมกันเป็น.pem เลยอะครับ

    • Copy เป็น 2 ที่โลด แล้วก็แยกที่กัน config แยกกัน

      ไม่ก็ปรับ code ได้เลยครับ

      • ถ้าอย่างนั้น เราจะได้ development.pem และ production.pem แล้วเราต้องเอา production.pem ไว้ที่ไหนครับ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s