[IOS開發]IOS開發之推送,ios開發推送
最近的項目中使用到了推送,第一次搞推送,遇到了不少坑,所以記錄下來。
參考:手把手教你做IOS推送
首先是一些基礎知識
APNS的推送機制
首先我們看一下蘋果官方給出的對iOS推送機制的解釋。如
Provider就是我們自己程式的後台伺服器,APNS是Apple Push Notification Service的縮寫,也就是蘋果的推送伺服器。
可以分為三個階段:
第一階段:應用程式的伺服器端把要發送的訊息、目的iPhone的標識打包,發給APNS。
第二階段:APNS在自身的登入Push服務的iPhone列表中,尋找有相應標識的iPhone,並把訊息發送到iPhone。
第三階段:iPhone把發來的訊息傳遞給相應的應用程式,並且按照設定彈出Push通知。
APNS推播通知的詳細工作流程
下面這張圖是說明APNS推播通知的詳細工作流程:
根據圖片我們可以概括一下:
1、應用程式註冊APNS訊息推送。
2、iOS從APNS Server擷取devicetoken,應用程式接收device token。
3、應用程式將device token發送給程式的PUSH服務端程式。
4、服務端程式向APNS服務發送訊息。
5、APNS服務將訊息發送給iPhone應用程式。
好啦,流程講完,再來講講要準備的東西
1.一台iphone。ipod 或者ipad
2.開發人員賬戶
3.IOS開發環境
下面,正式開始。
一.建立工程
記住我們的Bundle Identifier是 com.slpcb.PushDemo
二.製作認證
我們的用戶端與蘋果伺服器之間和我們自己的伺服器與蘋果伺服器之間都需要認證來進行連結。下面我們來開始進入認證的製作過程。
1.產生CSR檔案
首先我們要有產生一個Certificate Signing Request(也就是CSR)的請求檔案。
開啟鑰匙串訪問,點擊 鑰匙串訪問-》認證助理-》從憑證授權單位請求認證
2.製作認證
進入蘋果開發人員網站,
添加新的APPID
填寫必要資訊
注意必須填寫確定的appid,通配的時不可以的
勾選push notification,然後點擊繼續
接下來就是提交
下面我們回到APPID列表,編輯剛剛生產的APPID點擊建立認證
一步步確定
這裡選擇我們第一步建立的CSR檔案
選擇好之後確定
然後下載認證(記得下載後雙擊安裝)
3.產生Profile
認證生產好了之後 ,我們還需要對應的Profile檔案
照例先進入管理介面,點擊添加
繼續
現則App ID,繼續
選擇認證,繼續
選擇裝置,繼續
起個名字,繼續
好啦,完成啦 ,下載下來
製作認證完畢,接下來就是處理它們了。
首先先把認證匯出來。
開啟鑰匙串訪問 ,右擊匯出我們剛剛產生的認證
起個名字
設定密碼,這個密碼很重要。要記住。這裡我設定為123456
現在來整理一下,做了上面的步驟之後。我們得到了下面幾個檔案
1.PushDemoDev.certSigningRequest CSR檔案
2.aps_development.cer SSL認證檔案
3.PushDemo.p12 秘鑰檔案
但是這些還不夠,我們需要的是產生一個尾碼為pem的檔案,接下來我們搞定它
開啟終端,定位到我們那幾個檔案所在的位置
1、把.cer的SSL認證轉換為.pem檔案,執行命令:
openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
在推送整理檔案夾內會產生一個PushChatCert.pem檔案
2、把私密金鑰PushDemo.p12檔案轉化為.pem檔案:
openssl pkcs12 -nocerts -out PushChatKey.pem -in PushDemo.p12
,這裡會讓你輸入3次密碼,第一次是你到處p12檔案的時候設定的密碼,也就是我們上面設定的123456
第二第三次是對我們產生的pem檔案設定密碼,這個密碼是需要告訴伺服器的。為了方便,我們還是設定為123456
3、對產生的這兩個pem檔案再產生一個pem檔案,來把認證和私密金鑰整合到一個檔案裡:
cat PushChatCert.pem PushChatKey.pem > ck.pem
產生ck.pem檔案
下面我們要使用我們產生的SSL認證和私密金鑰來設定一個安全的連結去連結蘋果伺服器:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
執行完這一句命令後需要我們輸入密語
Enter pass phrase for PushChatKey.pem:
我們輸入123456按斷行符號
你會看到一個完整的輸出,讓你明白OpenSSL在後台做什麼。如果連結是成功的,你可以隨便輸入一個字元,按下斷行符號,伺服器就會取消連結,如果建立串連時有問題,OpenSSL會給你返回一個錯誤資訊。
如果看到下面的反饋,說明你成功了
好啦,此間事了,改去看看我們一開始建立的工程了
開啟工程PushDemo
開啟AppDelegate
換上
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//推送的形式:標記,聲音,提示
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
NSLog(@"regisger success:%@",pToken);
//註冊成功,將deviceToken儲存到應用伺服器資料庫中
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
// 處理推送訊息
NSLog(@"userinfo:%@",userInfo);
NSLog(@"收到推送訊息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Registfail%@",error);
}
然後設定
好的 run 一個。成功進入後,應用會快顯視窗讓使用者確認接收通知
這時,我們看看xcode的output,裡面輸出了我們蘋果機器的deviceToken,把它記下來
點擊 好。
接下來就是我們的服務端登場了
pushMe.php
裡面的代碼如下
這裡要注意的是
$deviceToken 的值換成我們上面得到的deviceToken,空格去掉
$passphrase 是我們之前設定的密碼,123456
<?php
// Put your device token here (without spaces):
$deviceToken = '978042ec5cda4a0e790b14431d00e33218c9707526d3ac3cf0d8549b72cef2cd';
// Put your private key's passphrase here:密語
$passphrase = '123456';
// Put your alert message here:
$message = '發布測試!"';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.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;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
?>
把我們的pushMe.php放在認證的那個目錄,然後終端定位到該目錄
執行:php pushMe.php
yeah, 大功告成!
不過,這隻是開發版的而已,如果是要發布版,則要建立對應的發布版認證,當然,地址也得變變。
APNS地址
測試地址gateway.sandbox.push.apple.com:2195
發布地址 gateway.push.apple.com:2195
測試的地址用的是沙箱,發布地址是不同的。發布軟體的時候記得改過來.