iOS 通知推送APNS

結合網上各個資料,再簡單整理的一份。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  「

手機端收到通知消息。

 

注:本文主要內容都是參考網上其餘博客內容,稍微整理。

相關文章
相關標籤/搜索