iOS上簡單推播通知(Push Notification)的實現
根據這篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12),結合自己的實踐,寫下一點筆記,僅供參考:)
由於篇幅較長,我列出簡單的目錄,如下
1) 理解Apple推播通知的機制
2) 建立App ID
3) 建立CSR檔案
4) 建立Provisioning Profile檔案
5) Xcode工程中取得Device Token
6) 建立.pem檔案
7) 編寫PHP伺服器代碼,發送通知 1、理解Apple推播通知的機制
從上面的流程圖中,可以看到一個能接收推播通知的App,需要3個東西:
App ID(唯一標識一個App程式) Provisioning Profile(App程式的發布需要它,所以推播通知只能在真機上測試) Device Token(裝置標識,這個是推播通知功能中特有的)
而能推播通知的伺服器端則要2個東西:
SSL Certificate Private Key
(由於我對資訊加密不清楚,所以這裡不解釋)
值得注意的是APNS(ApplePush Notification Service) Server,完成發送Device Token和通知內容的功能,而且這2個動作都是被動的,即第一個動作是由App發起的,第二個則是推播通知的伺服器發起的。
對我而言,理解就這麼多了。下面我按照參考文章進行實驗。
2、建立App ID
點擊“New App ID”按鈕後,如下
Description的內容可以任意,Bundle Identifier (App ID Suffix)必須和建立App工程時的Bundle Identifier,如下
點擊“Submit”後,點擊左側導航中的“App IDs”,找到剛才新建立的App ID,如下
點擊“Configure”後,如下
勾選“Enable for Apple Push Notification service”,然後點擊紅色的“Configure”按鈕,這裡暫時只針對Development取得認證。彈出一個對話方塊,如下
點擊“Continue”後,要我們上傳一個CSR檔案,如下
下面使用鑰匙串訪問(KeychainAccess)應用程式建立上面需要的CSR檔案(.certSigningRequest檔案)
3、建立CSR檔案
Keychain Access位於/Applications/Utilities目錄中,開啟它如下
然後快顯視窗如下。
UserEmail Address隨意寫就可以,Common Name也是一樣,注意勾選“Save to disks”,然後點擊“Continue”。很快就產生好了所需檔案,去找到它。
回到下面的網頁中,上傳剛才用KeychainAccess產生的HelloRemoteNotification.certSigningRequest檔案。
很快需要的認證就OK了,如下
點擊“Continue”,然後點擊“Done”。
發現上面的Status是Enabled,而且多了“Download”按鈕,點擊它,下載了一個名為“aps_development.cer”的檔案。雙擊開啟它,
找到上圖中“Keys”欄中名為“HelloRemoteNotification”的private key(注意是private key,而不是public key),右擊它,選擇“Export “HelloRemoteNotification”…”,這樣會匯出一個.p12檔案(需要輸入密碼),如下(目前共有3個檔案)
下面開始用剛才產生的.p12檔案,建立Profile provision檔案
4、建立ProvisioningProfile檔案
在上圖中,點擊“New Profile”按鈕後,如下
填寫“Profile Name”;勾選“Certificate”;“App ID”選擇正確的、之前我們建立的ID,即PushNotification;最後關聯需要測試真機裝置。點擊“Submit”,如下
可以看到多了一個Provisioning Profile檔案,點擊“Download”按鈕下載它,這時我們一共產生4個檔案,如下
雙擊“PushNotification.mobileprovision”檔案,或把它拖入到Xcode中。
在Xcode中,找到Code Signing項,如上圖,將Debug一項配置成剛才拖入Provisioning Profile對應的iPhone Developer。
5、Xcode工程中取得Device Token
在application:didFinishLaunchingWithOptions:方法裡,註冊使用遠程通知。
添加2個方法,application: didRegisterForRemoteNotificationsWithDeviceToken:和application:didFailToRegisterForRemoteNotificationsWithError:,用於取得Device Token和列印錯誤。運行我們建的HelloRemoteNotification工程,如果以上步驟都正確,應該列印出Device Token,如下
也可能出錯如下
6、建立.pem檔案
將已有的.cer檔案轉成.pem檔案 將已有的.p12檔案轉成.pem檔案(需要輸入密碼) 最後將上面2個.pem檔案合并成1個.pem檔案(需要輸入新密碼)
aps_development.cer->HelloRemoteNotification.pem(下面改名為HelloRemoteNotificationCert.pem)
HelloRemoteNotification.p12-> HelloRemoteNotificationKey.pem
HelloRemoteNotification.pem +HelloRemoteNotificationKey.pem合并成ck2.pem
7、編寫PHP伺服器代碼,發送通知
<?php// Put your device token here (without spaces):$deviceToken = '<Xcode控制台輸出的Device Token>';// Put your private key's passphrase here:$passphrase = '<最後輸入的密碼>';// Put your alert message here:$message = 'My first push notification!';////////////////////////////////////////////////////////////////////////////////$ctx = stream_context_create();stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck2.pem');stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);// Open a connection to the APNS server$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);if (!$fp)exit("Failed to connect: $err $errstr" . PHP_EOL);echo 'Connected to APNS' . PHP_EOL;// Create the payload body$body['aps'] = array('alert' => $message,'sound' => 'default');// Encode the payload as JSON$payload = json_encode($body);// Build the binary notification$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;// Send it to the server$result = fwrite($fp, $msg, strlen($msg));if (!$result)echo 'Message not delivered' . PHP_EOL;elseecho 'Message successfully delivered' . PHP_EOL;// Close the connection to the serverfclose($fp);
注意:修改下面兩行代碼
$deviceToken = '<Xcode控制台輸出的Device Token>';// Put your private key's passphrase here:$passphrase = '<最後輸入的密碼>';............stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck2.pem');
運行上面的php指令碼,如下
可以看到iPad上面收到的推播通知,如下,表示實踐成功。
參考資料:
1、http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12