iOS推送小結(認證的產生、用戶端的開發、服務端的開發)

來源:互聯網
上載者:User

1.推送過程簡介      (1)App啟動過程中,使用UIApplication::registerForRemoteNotificationTypes函數與蘋果的APNS伺服器通訊,發出註冊遠程推送的申請。若註冊成功,回呼函數application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 會被觸發,App可以得到deviceToken,該token就是一個與裝置相關的字串.     (2)App擷取到DeviceToken後,將DeviceToken發送給自己的服務端。     (3)服務端拿到DeviceToken以後,使用認證檔案,向蘋果的APNS伺服器發起一個SSL串連。串連成功之後,發送一段JSON串,該JSON串包含推送訊息的類型及內容。    (4)蘋果的APNS伺服器得到JSON串以後,向App發送通知訊息,使得App的回呼函數application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被調用,App從userInfo中即可得到推送訊息的內容。   2. 用到的認證檔案及產生過程    (1)certSigningRequest檔案,該檔案在MAC系統中產生,用於在Apple網站上申請推送認證檔案。         產生過程:         開啟應用程式中的“鑰匙串訪問”軟體,從菜單中選擇 “鑰匙串訪問”-》“認證助理”-》“從憑證授權單位請求認證”,郵箱和名稱隨便填寫,然後選擇儲存到磁碟,就可以在本地產生一個CertificateSigningRequest.certSigningRequest檔案。    (2)註冊一個支援push的app id,後面會用到。        產生過程:       進入developer.apple.com,選擇member center - Certificates, Identifiers & Profiles  -  Identifiers- App Ids,然後選擇註冊app id,設定appid名稱,同時,app id suffix一欄必須選擇explicit app id,然後設定bundle id,最後勾選 App Services中的 Push Notifications,這樣就可以註冊一個支援push的aphid。       (3) 推送認證cer檔案,該檔案在developer.apple.com中產生,用於產生服務端需要的檔案。        產生過程:        進入developer.apple.com,選擇member center - Certificates, Identifiers & Profiles  -  Certificates,然後選擇建立certificate,類型分為Development和Product。這裡以Development為例,選擇Apple Push Notification service SSL (Sandbox) ,然後下一步,選擇之前產生的支援push的AppId,然後下一步,提交之前建立的CSR檔案,再下一步就可以產生cer檔案,然後儲存到本地。   (4)產生服務端使用的認證檔案。如果是使用網上的mac 版PushMeBaby工具,在mac機器上進行推送訊息的發送,那麼有上面的cer檔案就夠了。如果是使用PHP、java/c#開發自己的服務端,那麼還需要將上面的cer檔案做一個轉換,產生pem檔案或者p12檔案。        產生php用的pem檔案過程為:        首先雙擊前面儲存的cer檔案,此時會開啟“鑰匙串訪問”軟體,裡面會出現一個Apple Development  IOS push services認證,一個公用密鑰和一個專用秘鑰,秘鑰的名稱與認證助理中填寫的名稱一致。      選中認證,匯出為 apns-dev-cert.p12 檔案      選中專有秘鑰,匯出為apns-dev-key.p12檔案      通過終端命令將這些檔案轉換為PEM格式:      openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12      openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12      最後, 需要將兩個pem檔案合并成一個apns-dev.pem檔案,此檔案在串連到APNS時需要使用:      cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem        產生java/c#用的p12檔案過程為:        openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12       openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12       openssl pkcs12 -export -in apns-dev-cert.pem -inkey apns-dev-key.pem -certfile CertificateSigningRequest.certSigningRequest -name "push" -out push.p12               (5)產生XCODE使用的provisioning檔案,該檔案用於真機調試。         產生過程:         進入developer.apple.com,選擇member center - Certificates, Identifiers & Profiles  -  Provisioning Profiles,然後選擇建立Provisioning  file,接著選擇iOS App Development ,下一步選擇AppId,選中之前建立的支援push的appid,接著下一步選擇支援push的certificate,下一步勾選需要支援的device id,最後一步設定provisioning檔案的檔案名稱,這樣provisioning檔案就產生了。      3. 服務端的開發     (1)如果只是希望在mac電腦上測試一下訊息的推送,可以使用PushMeBaby工具,使用起來比較簡單。該工具是開源的,可以從https://github.com/stefanhafeneger/PushMeBaby 下載,代碼的執行過程實際上就是設定一下SSL認證,然後串連APNS,接著發送JSON資料。由於要處理SSL邏輯,因此代碼稍微多點。在使用工具時,將工程資源中的cer檔案替換成自己的cer檔案,然後將代碼中的deviceToken替換成自己裝置的deviceToken即可。       (2)使用php開發服務端       由於php已經內建了ssl模組,因此使用php串連APNS伺服器來發送json的過程實際上是很簡單的,代碼如下: 該檔案可以放到伺服器中通過瀏覽器來訪問,也可以通過命令列的方式來解釋執行,代碼為:$ php -f Pusher.php       複製代碼<?php$deviceToken= ‘自己的deviceToken'; //沒有空格$body = array("aps" => array("alert" => 'message',"badge" => 2,"sound"=>'default'));  //推送方式,包含內容和聲音$$ctx = stream_context_create(); //如果在Windows的伺服器上,尋找pem路徑會有問題,路徑修改成這樣的方法://$pem = dirname(__FILE__) . '/' . 'apns-dev.pem';//linux 的伺服器直接寫pem的路徑即可stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");$pass = "xxxxxx";stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);////此處有兩個伺服器需要選擇,如果是開發測試用,選擇第二名sandbox的伺服器並使用Dev的pem認證,如果是正式發布,使用Product的pem並選用正式的伺服器$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);$fp = stream_socket_client("ssl://gateway.sandbox.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);if (!$fp)     {echo "Failed to connect $err $errstrn";return;}print "Connection OK\n";  $payload = json_encode($body);$msg = chr(0) . pack("n",32) . pack("H*", str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;  echo "sending message :" . $payload ."\n";fwrite($fp, $msg); fclose($fp);?>複製代碼    4. 用戶端的開發     (1)下載前面建立的cer檔案和provisioning檔案,雙擊,匯入到xcode中,在build setting中code signing一欄裡選擇這兩個檔案的名稱,這樣就可以將支援push的app部署到真機中。           (2)處理推送訊息           用戶端對推送訊息的處理分兩種情況:          一. 在App沒有啟動並執行情況下,系統收到推送訊息,使用者點擊推送訊息,啟動App。此時,不會執行前面提到的          didReceiveRemoteNotification函數,而是在App的applicationDidFinishLaunching函數中處理推送,通過以下代碼可以擷取推送訊息中的資料: NSDictionary *userInfo =[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];            二 . 當APP處於前台時,系統收到推送訊息,此時系統不會彈出訊息提示,會直接觸發application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函數,推送資料在userInfo字典中。            當App處於後台時,如果系統收到推送訊息,當使用者點擊推送訊息時,會執行application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函數,          此時AppDelegate中函數執行的順序為:          applicationWillEnterForeground           application:didReceiveRemoteNotification          applicationDidBecomeActive

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.