1. 程式人生 > >iOS推送小結(證書的生成、客戶端的開發、服務端的開發)

iOS推送小結(證書的生成、客戶端的開發、服務端的開發)

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

相關推薦

iOS小結證書生成客戶開發服務開發

1.推送過程簡介      (1)App啟動過程中,使用UIApplication::registerForRemoteNotificationTypes函式與蘋果的APNS伺服器通訊,發出註冊遠端推送的申請。若註冊成功,回撥函式application:(UIApplication *)applicatio

iOS證書從申請到使用

打包 desc apns div overflow cbe b2c 點擊 打開終端 關於這個話題,已經有非常多寫的非常好的文章了。可是,在自己做的過程中,即使別人寫的已經非常好了,還是會遇到這樣那樣的問題。自己還是再寫一遍吧。 本文記錄了從無到有申請證書,到最後可

IOS之PHP代碼

推送消息 獲取 option code bsp 包含 connect 手機 pan 準備工作 1.獲取手機註冊應用的deviceToken(iphone手機註冊應用時返回唯一值deviceToken) 2.獲取ck.pem文件(做手機端的給) 3.獲取pass phrase

一步一步教你做ios pem證書製作 php

 最近在研究ios的推送問題,遇到了一些問題,最終整理了一下。放在這裡和大家分享 APNS的推送機制 首先我們看一下蘋果官方給出的對ios推送機制的解釋。如下圖 Provider就是我們自己程式的後臺伺服器,APNS是Apple Push Notification Service的縮寫,也就是

IOS (本地遠端三方[極光])

Provider是給你手機應用發出推送訊息的伺服器,而APNS(Apple Push Notification Service)則是蘋果訊息推送伺服器。你本地的伺服器當需要給應用推送一條訊息的時候,先要將訊息發出到蘋果推送伺服器,然後再由蘋果推送伺服器將訊息發到安裝了該應用的手機。 接下來再看一張解釋圖

iOS 服務的簡易原理與配置

補充 com 思考 lib email p12 sig 導出 文件的 最近的項目需要用到iOS的push功能,在配置push功能的過程中遇到了一些不清楚的地方,經過查閱資料和思考,已有初步認識,下面進行一下梳理,我們的服務器端用的是Facebook的Parse。 完整的

C#簡單的JPush極光 API實現功能來自mojocube的博客

size 返回 log c# api live str -s 周期 APP推送功能大家應該都了解了,目前主要的有百度、極光等幾家公司提供推送服務,下面說一下極光推送API的簡單實現推送通知功能。 註冊完極光的賬號後,就可以創建應用,建好後會得到AppKey和Master

調用小米api時報證書簽名無效

signature ade remoting 證書 .net stream exception proc joinpoint Feb 20, 2017 4:10:07 PM com.xiaomi.xmpush.server.Sender sendMessageWARNING

iOS 原理

消息 產品 接收 mage div cati src 推送 ans 1. 什麽是遠程消息推送? APNs:Apple Push Notification server 蘋果推送通知服務 蘋果的APNs允許設備和蘋果的推送通知服務器保持連接,支持開發者推送消息給用戶設備對應

2. github創建 git倉庫,克隆,拉取和操作所有的git命令前提是一定在當前項目目錄下

push mit 什麽 one alt class 所有 -m 註冊 步驟:   1.點擊小貓,回到初始頁面   2.點擊start a project,首先會出現一個驗證email地址(我們註冊的時候,有一個email輸入,進去郵箱驗證一下) 3.重新點擊sta

[iOS]相關兩點

討論一下最近遇到的兩個問題: 1. 推送接收 2.點選推送開啟APP時資料的處理 理想情況是: app處於活躍狀態,有推送到來,在應用內部應當彈出我們自己生成的提示。 app處於非活躍狀態,有推送到來,彈出系統生成的提示,點選提示會進入app並且顯示相關內容

Android安卓狀態列訊息通知Notification

我從不猜測,猜測是一個很壞的習慣——會影響正常的邏輯推理能力。              ——阿瑟·柯南·道爾 《福爾摩斯探案集》 近日,在做安卓專案開發的時候涉及到狀態列通知的需求,查了資料,總結一個簡

IOShttp2使用netty服務啟動異常

IOS推送http2使用netty服務啟動異常 現象 使用netty開發×××送HTTP2,本機執行正常,部署至linux伺服器異常。 原因 是linux伺服器核心版本過低,所使用GLIBC類庫版本過低。netty要求GLIBC_2.10,我的伺服器最高才GLIBC_2.5。 linux檢視GLIB

ios (之遠端升級成ios8系統之後有些程式接收不到遠端

維護一個程式,當手機升級到ios8之後就不能接收到遠端推送,顯示註冊失敗,查了下資料,原來是沒有獲取使用者許可,加了個方法試了下,ok if ([[[UIDevice currentDevice]systemVersion ]integerValue] >= 8) {

IOS通知開發流程

最近開發IOS的推送通知,現把流程及遇到的問題整理一下: 一、證書的準備工作 1.在開發電腦MAC上申請證書 開啟鑰匙串訪問 選擇從證書頒發機構請求證書 這裡的郵箱賬號寫你自己的,常用名稱可以隨便寫 選擇儲存到磁碟 這裡最好新建一個資料夾 用來專門儲存這些檔案

Android Firebase接入-- Firebase通知Cloud Message

Firebase Cloud Message(FCM)可以幫助Android App實現訊息推送功能,並且可以在推送通知中攜帶引數,當用戶點選推送通知時,推送中攜帶的引數資訊將傳遞到主Activity的getIntent中。一、配置Android應用並下載google-ser

IOS10 Notification通知

多媒體的推送,對一些媒體大小有些限制,看下蘋果官方的截圖 本地附件推送通知,只需給content.attachments設定UNNotificationAttachment附件物件 1、實現本地音樂推送的效果先看下效果圖 //建立音樂本地推送 -

iOS 後臺語音播報

推送通知 注意:這裡說的推送通知跟NSNotification有所區別NSNotification是抽象的,不可見的推送通知是可見的(能用肉眼看到)iOS中提供了2種推送通知本地推送通知(Local Notification)遠端推送通知(Remote Notification) 推送通知的呈現效

Android 接入華為通知欄教程特此整理

前言:       受華為開發者聯盟工作人員的邀約,特此將本篇部落格重新整理一遍,希望讓更多人受益,大家也可以參加華為開發者聯盟推出活動,去提問自己的問題或者投稿。 掃二維碼就可以參與活動哦。 首先本教程是基於華為推送 2.5.2.300 版本的 一:注意事項

iOS訊息push,語音播報

iOS 10 開始支援1. xcode - >file -> new -> target 選擇iOS下面的,Notification Service Extension Service Extension 中收到推送之後,用AVSpeechSynthesi