結合網上各個資料,再簡單整理的一份。php
1、APNS推送說明ios
1.你的IOS應用須要去註冊APNS消息推送功能。json
2.當蘋果APNS推送服收到來自你應用的註冊消息就會返回一串device token給你(很重要)服務器
3.將應用收到的device Token傳給你本地的Push服務器。app
4.當你須要爲應用推送消息的時候,你本地的推送服務器會將消息,以及Device Token打包發送到蘋果的APNS服iphone
5.APNS再將消息推送給目的iphonesocket
2、推送的準備工做測試
推送準備的主要就是一、推送證書 二、導出的密鑰文件 三、下載的描述文件ui
一、APP ID建立spa
先建立APP ID,名字爲PustTest, Bundle ID 爲com.公司名.testpush
直接點擊下一步,完成建立。
二、生成證書
證書選擇Push推送證書,下一步選擇剛剛建立的APP ID
添加從鑰匙串導出的請求文件
下一步->下載推送證書。
三、描述文件建立下載
描述文件選擇Development, 若是這裏選擇選擇下面的生產,則項目可能會閃退。下一步也是選擇剛剛建立的APP ID,而後選擇設備一步步,最後下載描述文件。
四、密鑰導出
雙擊下載的證書文件,會在鑰匙串登錄-個人證書裏生成一個新的證書,右擊導出證書,名字設置爲 push.p12
導出的密碼要記得,推送要用,我設置位aaa123;
5,整理
將密鑰,證書,和描述文件,放到桌面的一個文件夾裏,文件夾名字設置爲 "push";
6,文件轉換pem
推送該準備的文件都準備好了,而後開始作推送,將密鑰和證書轉換成pem文件。打開電腦裏的終端,生成pem文件須要用到終端命令。
首先用終端命令打開桌面的push文件夾「 cd ~/desktop/push 」 回車;
把證書文件生成pem文件命令「 openssl x509 -in aps_development.cer -inform der -out PushCert.pem 」
把密鑰p12文件生成pem文件命令「 openssl pkcs12 -nocerts -out PushKey.pem -in push.p12 」,回車後須要輸入三次密碼,也就是導出時候的密碼aaa123
而後把兩個pem文件合併成一個pem文件,命令:「 cat PushCert.pem PushKey.pem > ck.pem 」,這樣桌面的push文件夾就有6個文件了
測試推送證書可否正常運行,輸入終端命令「 telnet gateway.sandbox.push.apple.com 2195 」,若是運行以下,則一切正常。
鏈接蘋果服務器APNS,終端命令「 openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushCert.pem -key PushKey.pem 」
回車後輸入密碼 aaa123,返回一堆數據,最後截圖以下。表示沒問題。
七、項目配置
新建項目,Bundle ID 設置和APP ID裏同樣testpush,Code Signing選擇描述文件和開發帳號,
AppDelegate.m裏設置註冊,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) { //IOS8 //建立UIUserNotificationSettings,並設置消息的顯示類類型 UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil]; [application registerUserNotificationSettings:notiSettings]; [application registerForRemoteNotifications]; } else{ // ios7 [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert)]; } self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; // self.mainView = [[ViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; self.window.rootViewController = [ViewController alloc]; return YES; }
其餘回調方法
// 處理推送消息 - (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); } //返回設備表示device token -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"設備標示%@",deviceToken);//這裏的Token就是咱們設備要告訴服務端的Token碼 }
運行後獲得標示device token 「f465312ab96e2dfd35829d1c6f898a019b01141615745f5b41a4db4a312870a0」
八、PHP本地服務器
測試通知效果須要一個php文件,裏面填入獲取的標示,密鑰導出的密碼,和合並文件 ck.pem
<?php $deviceToken = 'f465312ab96e2dfd35829d1c6f898a019b01141615745f5b41a4db4a312870a0';//獲取請求參數中的deviceToken $passphrase = 'aaa123'; //mimi $message = '這是一條推送消息';//獲取請求參數中的想要推送的信息 ///打印 查看 echo $deviceToken; echo $message; // Put your alert message here: 設置你申請好並轉換好的證書和密碼 $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');//ck.pem stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server //$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|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); ?>
php文件下載:http://pan.baidu.com/s/1bi3Lym
九、推送命令
將配置好的php文件一樣放到桌面的push文件夾裏。運行終端命令,給標示手機推送一個通知 「這是一條推送消息」
先用終端命令ck打開push文件夾,再調用運行push.php文件,運行命令:「 php push.php 「
手機端收到通知消息。
注:本文主要內容都是參考網上其餘博客內容,稍微整理。