用NodeJS實現APNS

用NodeJS實現APNS

Posted 2013-05-14 by Perchoulinode

APNS(Apple Push Notification service)能夠給ios設備推送通知,直觀表述就是當某個app在後臺運行時,能彈出提示消息。相比Android來,只有這一套方案因此少了不少調研成本。標題寫NodeJS,只是由於咱們的生產環境是NodeJS,我也用其餘語言調過,測試的庫是這三個:node-apns(NodeJS) / PyAPNs(Python) / apns(Ruby)。本文的重點不是針對代碼(由於確實沒什麼代碼量),而是描述如何在Apple開發者中心請求證書、生成PEM文件、讀取PEM文件和證書對APNs的沙盒發送請求,設備接收到Notification後進行處理這一系列流程的入門文章。ios

Tips & Preparations

APNs整套系統的原理文檔中寫得很詳細,此處不贅述。只引用下圖做爲說明。
APNSgit

NodeJS要實現的是Provider(如下稱服務)部分。github

  • 1. 須要申請Apple開發者賬號,準備一臺真實設備。模擬器沒有Device Token,不能測試APNS;web

  • 2. 收到提醒時,若是程序在前臺打開會看不到提醒;app

  • 3. 若是連續推送內容相同的提醒會失敗。ide

Generate Certificate 

Apple開發者中心建立App ID,建立時勾選App Services - Push Notifications。App ID Suffix選擇通用App ID(Wildcard App ID)仍是固定App ID(Explicit App ID)均可以,若是要開發多個App能夠選擇通用App ID,本文只作範例因此建立固定App ID,Name爲dmyz,ID爲org.dmyz.app。建立成功後在Identifiers - App IDs能夠查看,點擊以前建立的App ID,在展開的菜單中點擊[Settings]按鈕進入配置界面。函數

在配置界面中找到Push Notifications,點擊[Create Certificate…]按鈕建立SSL證書。Development SSL Certificate 和 Production SSL Certificate對應開發環境和生產環境,選擇Development SSL Certificate
工具

也能夠點擊左側導航菜單的Certificates,來添加一個APNs證書。選擇Apple Push Notification service SSL (Sandbox),以後的步驟相同。測試

第一步要先生成CSR(證書請求)文件,在Mac系統(本文是10.8)中打開實用工具 - 鑰匙串 - 鑰匙串訪問 - 證書助理 - 從證書頒佈機構請求證書,填入郵箱和名稱(dmyz),選擇[存儲到磁盤],獲得一個名爲CertificateSigningRequest.certSigningRequest的證書請求文件,同時會在登錄 - 密鑰裏新增兩條紀錄,一個公用密鑰和一個專用密鑰:

回到Apple開發者中心的網頁,點擊[Continue]繼續,上傳生成的CertificateSigningRequest.certSigningRequest文件。完成這一步就能夠獲得.cert文件了。

Provisioning Profiles

在ios設備上運行程序須要Development Provisioning profile,這一步和APNs沒有直接聯繫,已經在真實設備上配置成功的能夠跳過。

App開發過程當中要在真實設備上調試,須要Development Provisioning profileDevelopment Certificate

左側導航菜單 - Devices,添加一個ios設備。UUID能夠在iTunes裏查到。而後增長一個iOS App Development的Certificate和Provisioning Profile:

最後獲得一個證書文件,和一個.mobileprovision後綴的文件,就是Provisioning Profile文件了。安裝證書文件,將.mobileprovision文件經過Xcode導入設備中。通常鏈接iso設備時Xcode會自動彈出,也能夠在Xocde菜單的 Help - Xcode Help - Devices修改Provisioning Profile文件。下圖是在Apple開發者中心建立的Provisioning Profile:

要保證App ID和程序的Target Properies - Bundle identifier的值相同,不然會報錯Code Sign error: A valid provisioning profile matching the application’s Identifier ‘org.dmyz.app’ could not be found

Generate PEM

切換到左側導航菜單的Certificates,找到以前生成的APNs Development iOS證書,點擊[Download]按鈕下載,獲得aps_development.cer。安裝後,在鑰匙串訪問中找到對應的證書。接下來要分別導出證書專用密鑰。選中Apple Development IOS Push Services: org.dmyz.app上點擊右鍵,選擇[導出Apple Development IOS Push Services: org.dmyz.app],文件格式切換成.cer,導出爲cert.cer。點擊左側▶展開它,能夠看到名爲dmyz,類別爲[專用密鑰]的這個子項,選中導出爲key.p12

導出這兩個文件後,用openssl進行處理:

$ openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
$ openssl pkcs12 -in key.p12 -out key.pem -nodes

會要求輸入Import Password,若是導出時沒有設置則爲空。我在SO還找到另外一種方法:

$ openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
$ openssl pkcs12 -nocerts -out key.pem -in key.p12
$ cat cert.pem key.pem > key.pem

主要差異是key沒有加nodes參數,最後把兩個文件合併了。測試過能夠經過。執行第二條命令時須要輸入PEM pass phrase,至少4個字符。

如今獲得key.pemcert.pem文件了,不管服務是NodeJS, Python仍是Ruby,這隻須要這兩個文件。

Coding

通知計數、點擊通知執行的函數等細節設置和Location notification相同,區別是要指定Device。Xcode中打開項目的AppDelegate.m文件中增長一個函數,來獲取設備Token:

1

2

3

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSLog(@"deviceToken: %@", deviceToken);

}

最後,安裝apn,把key.pemcert.pem拷貝到項目目錄。執行如下代碼能夠推送通知到指定設備,截圖是當程序在後臺運行且屏幕鎖定時收到通知的效果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

var apn = require('apn');

 

var token = 'a788a70f...79ecc6145'; //長度爲64的設備Token

 

var options = { "gateway": "gateway.sandbox.push.apple.com" },

    apnConnection = new apn.Connection(options),

    device = new apn.Device(token),

    note = new apn.Notification();

 

note.expiry = Math.floor(Date.now() / 1000) + 60;

note.badge = 3;

note.alert = "動漫驛站 \n點擊查看更新的1篇文章";

note.payload = {'messageFrom': 'Caroline'};

 

apnConnection.pushNotification(note, device);

相關文章
相關標籤/搜索