本篇文章主要介紹了"iOS8下的遠程推送",主要涉及到方面的內容,對於IOS開發感興趣的同窗能夠參考一下: 昨天作了一下遠程推送,今天寫下來,分享給須要的人。參考了不少篇文章,或許是iOS8的改動,沒有一篇能夠完整的看下來,因此打算本身寫一篇。後臺我也寫了,用的是...php
昨天作了一下遠程推送,今天寫下來,分享給須要的人。參考了不少篇文章,或許是iOS8的改動,沒有一篇能夠完整的看下來,因此打算本身寫一篇。前端
後臺我也寫了,用的是SAE,PHP代碼,很簡單,調用SAE封裝好的一個類就能夠向APNS發推送信息。ios
首先,來講一下蘋果的推送機制。顧名思義,推送,是指服務器向客戶端發送消息,那麼在iOS中,應用是被後臺掛起的,並不能一直鏈接網絡,那麼服務器怎麼才能把消息發送到客戶端呢?這就用到推送,蘋果的推送機制,是隻能由APNS發送推送通知,因此你本身的後臺服務器想給客戶端推送通知,得把要推送的內容發送給APNS。程序員
說到這裏,若是還不瞭解蘋果的推送機制,能夠自行查看資料。總之總體的流程就是:APP啓動的時候,獲取本設備的device_token,而後把這個device_token告訴你本身的服務器,服務器拿到這個device_token後,使用證書文件,向蘋果的APNS服務器發起一個SSL鏈接,鏈接成功後發送一個JSON串,JSON裏面包含device_token、通知內容以及其餘的一些東西。蘋果的APNS獲得JSON後,經過device_token查找設備推送消息。json
那麼,咱們iOS前端的工做量是很是簡單的,只須要獲取device_token和接到通知後作什麼事就能夠。那麼,怎麼樣獲取設備的device_token,iOS8用到了新的方法。在APP啓動的時候就調用,好比在application: didFinishLaunchingWithOptions:這個方法裏,調用APP的註冊遠程推送申請方法。服務器
1 //ios8需註冊會話 2 3 UIUserNotificationSettings * s =[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil]; 4 5 [[UIApplication sharedApplication] registerUserNotificationSettings:s]; 6 7 [application registerForRemoteNotifications];
若註冊成功,則會回調一個方法,代碼以下網絡
1 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 2 { 3 NSString *decToken = [NSString stringWithFormat:@"%@", deviceToken]; 4 //獲取到以後要去掉尖括號和中間的空格 5 NSMutableString *st = [NSMutableString stringWithString:decToken]; 6 [st deleteCharactersInRange:NSMakeRange(0, 1)]; 7 [st deleteCharactersInRange:NSMakeRange(st.length-1, 1)]; 8 NSString *string1 = [st stringByReplacingOccurrencesOfString:@" " withString:@""]; 9 //保存到本地 10 NSUserDefaults *u = [NSUserDefaults standardUserDefaults]; 11 [u setObject:string1 forKey:@"deviceToken"]; 12 }
相對應的,確定也有一個註冊失敗的回調。裏面寫錯誤處理的代碼就能夠,這裏就不舉例了。app
那有沒有想過,正常的推送通知會在咱們的通知面板裏,那若是我正在使用這個APP,那麼推送確定不會到通知面板裏的,咱們怎麼找到它呢。在下面這個回調方法裏,當咱們正在使用APP,收到了一條通知,那麼APP會直接回調這個方法,不會去彈出通知。測試
1 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 2 { 3 NSLog(@"Receive remote notification : %@",userInfo); 4 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"好" otherButtonTitles:nil, nil]; 5 [alert show]; 6 7 }
在這個方法裏面,處理咱們接收到的消息便可。命令行
前端的任務就這麼多,別忘了把device_token交給你的服務端。
服務端的代碼原本不用咱們寫,可是遇到不會寫的,讓他們去看蘋果的官方文檔就行。要是還看不懂,就找一個現成的代碼研究一下。
程序猿攻城獅都是萬能的,不只會修電腦,還要會寫後臺。那麼,咱們就來看看後臺是怎麼實現的。
首先,按照上面流程來講,服務端獲取到device_token後,使用證書向APNS發送推送請求,那麼問題來了。挖掘機技術哪家強?
推送證書哪裏來?
須要一個開發者帳號。沒錯,和咱們真機調試的證書同樣,至少須要99刀。有了帳號,咱們就能夠申請一個證書。下面,跟着一步一步看,比較麻煩。
1.須要在MacOS上生成一個CertificateSigningRequest.certSigningRequest文件。打開應用程序中的「鑰匙串訪」,從菜單中選擇「證書助理」-》「從證書頒發機構請求證書」
IT經典笑語錄:有一個小夥子在一個辦公大樓的門口抽着煙,一個婦女路過他身邊,並對他說,「你知道不知道這個東西會危害你的健康?我是說,你有沒有注意到香菸盒上的那個警告(Warning)?」 小夥子說,「沒事兒,我是一個程序員」。 那婦女說,「這又怎樣?」 程序員說,「咱們歷來不關心Warning,只關心Error」
而後保存在本地就行。這樣咱們就獲取了一個證書請求文件。
2.這裏就要用到開發者帳號了。進入developer.apple.com,選擇numberCenter-》Certificates, Identifiers & Profiles-》Identifiers-》APP IDs。點右上角的+號,註冊一個APPID,寫id名,默認是Explicit App ID寫個bundle名。還要勾選住App Services下的Push Notifications。這樣就註冊好了。
3.生成推送證書。點Certificates,右上角+,建立一個證書,以Development爲例,選Apple Push Notification service SSL (Sandbox),而後直接下一步,會讓你選一個APPID,選擇你剛剛建立好的那個APPID,下一步,提交咱們第一步生成的請求文件,而後求送證書就完成了。download下來便可。
4.下載到的是一個cer文件,咱們後臺確定不能直接使用。須要作一個整合。如下以PHP爲例。雙擊證書,或者用拖拽,把證書放到鑰匙串中。
這樣,在鑰匙串中找到這個推送證書,前面的名字是同樣的,後面是你起的bundle名。接着,就是把cer證書轉化成pem文件,供後臺使用。右鍵點擊這個證書,選擇「導出」,放到本地。會獲得一個後綴爲p12的文件。而後打開MacOS下的命令行程序,運行如下幾條命令,其中會讓你輸入密碼,是不可見的,輸入完回車就行,屏幕上是看不到輸入的字符的,會輸入好幾回密碼,因此建議每次密碼都輸同樣的。
openssl pkcs12 -clcerts -nokeys -out 文件名A.pem -in 蘋果證書.p12
openssl pkcs12 -nocerts -out 文件名B.pem -in 蘋果證書.p12
最後把用證書拆出來的兩個文件合到一塊兒:cat 文件名A.pem 文件名B.pem > lltpush.pem
最終的這個lltpush.pem是咱們須要的,給後臺用。
這樣,就基本完成了。再寫後臺代碼以前,還須要去developer.apple.com上建一個證書和一個描述文件,一點要選支持push的那個APPID,就是咱們剛纔建立的那個。這樣,咱們才能真機調試。總結一下,要在developer.apple.com上獲取三個東西。
開頭說到,後臺是搭建在SAE雲端的,推送代碼都不用些,只要調用SAE封裝好的一個類就能夠。那麼,想要用SAE,本身去註冊一個應用,而後進入到應用首頁,得配置一下證書才能使用推送。這個很簡單,看一下SAE的推送說明文檔就OK。
到這個設置頁面,把證書上傳上去,密碼寫你在命令行合成時候填的密碼。記住你的證書序號,由於寫推送的時候,要選擇用哪一個證書發推送。
SAE就很少介紹了,本身看下文檔。如今就開始寫代碼了,新建一個PHP頁面出來。看如下的代碼。
1 <?php 2 3 $cert_id = 1686; 4 $device_token = $_REQUEST['device_token']; 5 $message = $_REQUEST['message']; 6 7 //這個是簡單的例子,更復雜的消息格式請查看蘋果官方文檔 8 $body = array( 9 'aps' => array( 'alert' => $message , 'badge' => 1, 'sound' => 'in.mp3') 10 ); 11 $apns = new SaeAPNS(); 12 //push消息到SAE推送服務器 13 $result = $apns->push( $cert_id , $body , $device_token ); 14 15 if( $result && is_array($result) ){ 16 $dic = array('success' => '0'); 17 echo json_encode($dic); 18 // var_dump( $result ); 19 } else { 20 $dic = array('success' => '1'); 21 echo json_encode($dic); 22 //var_dump($apns->errno(), $apns->errmsg()); 23 } 24 ?>
這個接口呢,須要兩個參數,一個是設備的device_token,還有就是你要推送的消息內容。而後調用SAE的方法就能夠。發送成功返回JSON串。複雜的代碼就不說了。
這只是個測試demo,真正的推送是後臺判斷的。不是咱們去調接口。
就到這裏吧。
以上就介紹了iOS8下的遠程推送,包括了方面的內容,但願對IOS開發有興趣的朋友有所幫助。