iOS推送小結(jié)(證書的生成缝龄、客戶端的開發(fā)、服務(wù)端的開發(fā))

1.推送過程簡介

(1)App啟動過程中胶坠,使用UIApplication::registerForRemoteNotificationTypes函數(shù)與蘋果的APNS服務(wù)器通信君账,發(fā)出注冊遠程推送的申請。若注冊成功沈善,回調(diào)函數(shù)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 會被觸發(fā)乡数,App可以得到deviceToken椭蹄,該token就是一個與設(shè)備相關(guān)的字符串.

(2)App獲取到DeviceToken后,將DeviceToken發(fā)送給自己的服務(wù)端净赴。

(3)服務(wù)端拿到DeviceToken以后绳矩,使用證書文件,向蘋果的APNS服務(wù)器發(fā)起一個SSL連接玖翅。連接成功之后翼馆,發(fā)送一段JSON串,該JSON串包含推送消息的類型及內(nèi)容烧栋。

(4)蘋果的APNS服務(wù)器得到JSON串以后写妥,向App發(fā)送通知消息,使得App的回調(diào)函數(shù)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo被調(diào)用审姓,App從userInfo中即可得到推送消息的內(nèi)容。

2. 用到的證書文件及生成過程

(1)certSigningRequest文件祝峻,該文件在MAC系統(tǒng)中生成魔吐,用于在Apple網(wǎng)站上申請推送證書文件。

生成過程:

打開應用程序中的“鑰匙串訪問”軟件莱找,從菜單中選擇 “鑰匙串訪問”-》“證書助理”-》“從證書頒發(fā)機構(gòu)請求證書”酬姆,郵箱和名稱隨便填寫,然后選擇保存到磁盤奥溺,就可以在本地生成一個CertificateSigningRequest.certSigningRequest文件辞色。

(2)注冊一個支持push的app id,后面會用到浮定。

生成過程:

進入developer.apple.com相满,選擇member center - Certificates, Identifiers & Profiles? -? Identifiers- App Ids,然后選擇注冊app id桦卒,設(shè)置appid名稱立美,同時,app id suffix一欄必須選擇explicit app id方灾,然后設(shè)置bundle id建蹄,最后勾選 App Services中的 Push Notifications,這樣就可以注冊一個支持push的aphid紫岩。

(3) 推送證書cer文件宪赶,該文件在developer.apple.com中生成亦歉,用于生成服務(wù)端需要的文件。

生成過程:

進入developer.apple.com劲腿,選擇member center - Certificates, Identifiers & Profiles? -? Certificates,然后選擇創(chuàng)建certificate蔫巩,類型分為Development和Product谆棱。這里以Development為例快压,選擇Apple Push Notification service SSL (Sandbox) ,然后下一步垃瞧,選擇之前生成的支持push的AppId蔫劣,然后下一步,提交之前創(chuàng)建的CSR文件个从,再下一步就可以生成cer文件脉幢,然后保存到本地。

(4)生成服務(wù)端使用的證書文件嗦锐。如果是使用網(wǎng)上的mac 版PushMeBaby工具嫌松,在mac機器上進行推送消息的發(fā)送,那么有上面的cer文件就夠了奕污。如果是使用PHP萎羔、java/c#開發(fā)自己的服務(wù)端,那么還需要將上面的cer文件做一個轉(zhuǎn)換碳默,生成pem文件或者p12文件贾陷。

生成php用的pem文件過程為:

首先雙擊前面保存的cer文件,此時會打開“鑰匙串訪問”軟件嘱根,里面會出現(xiàn)一個Apple Development? IOS push services證書髓废,一個公用密鑰和一個專用秘鑰,秘鑰的名稱與證書助理中填寫的名稱一致该抒。

選中證書慌洪,導出為 apns-dev-cert.p12 文件

選中專有秘鑰,導出為apns-dev-key.p12文件

通過終端命令將這些文件轉(zhuǎn)換為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文件,該文件用于真機調(diào)試。

生成過程:

進入developer.apple.com愉适,選擇member center - Certificates, Identifiers & Profiles? -? Provisioning Profiles犯助,然后選擇創(chuàng)建Provisioning? file,接著選擇iOS App Development 维咸,下一步選擇AppId剂买,選中之前建立的支持push的appid,接著下一步選擇支持push的certificate癌蓖,下一步勾選需要支持的device id瞬哼,最后一步設(shè)置provisioning文件的文件名,這樣provisioning文件就生成了租副。

3. 服務(wù)端的開發(fā)

(1)如果只是希望在mac電腦上測試一下消息的推送坐慰,可以使用PushMeBaby工具,使用起來比較簡單用僧。該工具是開源的结胀,可以從https://github.com/stefanhafeneger/PushMeBaby 下載赞咙,代碼的執(zhí)行過程實際上就是設(shè)置一下SSL證書,然后連接APNS糟港,接著發(fā)送JSON數(shù)據(jù)攀操。由于要處理SSL邏輯,因此代碼稍微多點秸抚。在使用工具時速和,將工程資源中的cer文件替換成自己的cer文件,然后將代碼中的deviceToken替換成自己設(shè)備的deviceToken即可剥汤。

(2)使用php開發(fā)服務(wù)端

由于php已經(jīng)內(nèi)置了ssl模塊颠放,因此使用php連接APNS服務(wù)器來發(fā)送json的過程實際上是很簡單的,代碼如下:

該文件可以放到服務(wù)器中通過瀏覽器來訪問吭敢,也可以通過命令行的方式來解釋執(zhí)行碰凶,代碼為:$ php -f Pusher.php

復制代碼

array("alert" => 'message',"badge" => 2,"sound"=>'default'));? //推送方式,包含內(nèi)容和聲音$$ctx = stream_context_create();

//如果在Windows的服務(wù)器上省有,尋找pem路徑會有問題痒留,路徑修改成這樣的方法:

//$pem = dirname(__FILE__) . '/' . 'apns-dev.pem';

//linux 的服務(wù)器直接寫pem的路徑即可

stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");

$pass = "xxxxxx";stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);//

//此處有兩個服務(wù)器需要選擇,如果是開發(fā)測試用蠢沿,選擇第二名sandbox的服務(wù)器并使用Dev的pem證書,如果是正式發(fā)布匾效,使用Product的pem并選用正式的服務(wù)器

$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. 客戶端的開發(fā)

(1)下載前面建立的cer文件和provisioning文件舷蟀,雙擊,導入到xcode中面哼,在build setting中code signing一欄里選擇這兩個文件的名稱野宜,這樣就可以將支持push的app部署到真機中。

(2)處理推送消息

客戶端對推送消息的處理分兩種情況:

一. 在App沒有運行的情況下魔策,系統(tǒng)收到推送消息匈子,用戶點擊推送消息,啟動App闯袒。此時虎敦,不會執(zhí)行前面提到的? ? ? ? ? didReceiveRemoteNotification函數(shù),而是在App的applicationDidFinishLaunching函數(shù)中處理推送政敢,通過以下代碼可以獲取推送消息中的數(shù)據(jù): NSDictionary *userInfo =[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

二 . 當APP處于前臺時其徙,系統(tǒng)收到推送消息,此時系統(tǒng)不會彈出消息提示喷户,會直接觸發(fā)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函數(shù)唾那,推送數(shù)據(jù)在userInfo字典中。

當App處于后臺時褪尝,如果系統(tǒng)收到推送消息闹获,當用戶點擊推送消息時期犬,會執(zhí)行application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo函數(shù),

此時AppDelegate中函數(shù)執(zhí)行的順序為:

applicationWillEnterForeground

application:didReceiveRemoteNotification

applicationDidBecomeActiveI

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末避诽,一起剝皮案震驚了整個濱河市龟虎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茎用,老刑警劉巖遣总,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轨功,居然都是意外死亡旭斥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門古涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垂券,“玉大人,你說我怎么就攤上這事羡滑」阶Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵柒昏,是天一觀的道長凳宙。 經(jīng)常有香客問我,道長职祷,這世上最難降的妖魔是什么氏涩? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮有梆,結(jié)果婚禮上是尖,老公的妹妹穿的比我還像新娘。我一直安慰自己泥耀,他們只是感情好饺汹,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痰催,像睡著了一般兜辞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陨囊,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天弦疮,我揣著相機與錄音,去河邊找鬼蜘醋。 笑死胁塞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啸罢,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼编检,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扰才?” 一聲冷哼從身側(cè)響起允懂,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衩匣,沒想到半個月后蕾总,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡琅捏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年生百,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柄延。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚀浆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搜吧,到底是詐尸還是另有隱情市俊,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布滤奈,位于F島的核電站摆昧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜒程。R本人自食惡果不足惜据忘,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搞糕。 院中可真熱鬧,春花似錦曼追、人聲如沸窍仰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驹吮。三九已至,卻和暖如春晶伦,著一層夾襖步出監(jiān)牢的瞬間碟狞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工婚陪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留族沃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像脆淹,于是被迫代替她去往敵國和親常空。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容