iOS上簡單推播通知(Push Notification)的實現

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.