天天看點

【iOS】遠端消息推送

IOS推送消息是許多IOS應用都具備的功能,最近也在研究這個功能,參考了很多資料終于搞定了,下面就把步驟拿出來分享下(網上同樣的步驟可以查到很多,本文轉自http://zxs19861202.iteye.com/blog/1532460
           

iOS消息推送的工作機制可以簡單的用下圖來概括:

【iOS】遠端消息推送

Provider是指某個iPhone軟體的Push伺服器,APNS是Apple Push NotificationService的縮寫,是蘋果的伺服器。

上圖可以分為三個階段:

第一階段:應用程式把要發送的消息、目的iPhone的辨別打包,發給APNS。 

第二階段:APNS在自身的已注冊Push服務的iPhone清單中,查找有相應辨別的iPhone,并把消息發送到iPhone。 

第三階段:iPhone把發來的消息傳遞給相應的應用程式,并且按照設定彈出Push通知。

【iOS】遠端消息推送

從上圖我們可以看到:

1、應用程式注冊消息推送。

2、iOS從APNS Server擷取device token,應用程式接收device token。

3、應用程式将device token發送給PUSH服務端程式。

4、服務端程式向APNS服務發送消息。

5、APNS服務将消息發送給iPhone應用程式。

無論是iPhone用戶端和APNS,還是Provider和APNS,都需要通過證書進行連接配接。

下面我介紹一下幾種用到的證書。

一、CSR檔案

1、生成Certificate Signing Request(CSR)

【iOS】遠端消息推送

2、填寫你的郵箱和常用名稱,并選擇儲存到硬碟。

【iOS】遠端消息推送

點選繼續:

【iOS】遠端消息推送

這樣就在本地生成了一個Push.certSigningRequest檔案。

二、p12檔案

1、導出密鑰。

【iOS】遠端消息推送
【iOS】遠端消息推送

2、輸入你的密碼。

【iOS】遠端消息推送

這樣就生成了一個Push.p12檔案。

三、SSL certificate檔案

1、用你付過費的帳号登入到iOS Provisioning Portal,并建立一個App ID,這個過程可以參考:iOS應用的真機調試,這樣就會生成下面這條記錄:

【iOS】遠端消息推送

2、點選右側的Configure:

【iOS】遠端消息推送

3、點選Development Push SSL Certificate一行後的Configure:

【iOS】遠端消息推送

4、點選Continue:

【iOS】遠端消息推送

5、選擇前面生成好的Push.certSigningRequest檔案,點選Generate,出現如下所示的頁面:

【iOS】遠端消息推送

6、點選Continue:

【iOS】遠端消息推送

7、點選Download,并将檔案命名為aps_developer_identity.cer。

8、點選Done,你會發現狀态變成了Enabled:

【iOS】遠端消息推送

到現在為止,我們已經生成了三個檔案:

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer

輕按兩下aps_developer_dientity.cer 注冊到你的鑰匙串中,這樣你的鑰匙串中就會有

【iOS】遠端消息推送

二、準備profile證書,因為推送消息隻能再真機上測試,是以要建一個profile證書

【iOS】遠端消息推送

點選"new profile"為上面建立的APP ID建個profile,成功之後下載下傳*_Dev_Profile.mobileprovision

輕按兩下将其加入到xcode 的Provisioning Profiles 中,這裡有一點要注意,再将這個加入xcode之前如果之前已經加入過一定要把之前加入的删掉,如果有多個的話會出錯。

三、工程代碼

到這裡證書已經準備完畢,接下來,我們在xcode中建立一個測試工程,注意設定工程的Bundle Identifier必須與上面建的APP ID裡的相同

【iOS】遠端消息推送

在didFinishLaunchingWithOptions 中加入一下代碼

-(BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

   [self.window makeKeyAndVisible];

   [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
   return YES;
}

 

-(void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{

   NSLog(@"regisgersuccess:%@", pToken);
   //注冊成功,将deviceToken儲存到應用伺服器資料庫中

}


-(void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo{

   // 處理推送消息
   UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"通知" message:@"我的資訊" delegate:selfcancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
   [alert show];

   [alert release];
   NSLog(@"%@",userInfo);
}


-(void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
   NSLog(@"Registfail%@",error); 
}
           

到這裡一切順利的話我們就可以在真機運作了,注冊成功我們會得到iphone的deviceToken,

Mytoken is:

<740f4707bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf61bb78ad>

四、服務端證書

(1)在應用伺服器采用php的方式将消息推送給APNS,

pem檔案是伺服器向蘋果伺服器做推送時候需要的檔案,主要是做伺服器的小夥伴們要用, 下面介紹一下pem檔案的生成。

  • 打開Keychain Access,在Certificates裡面找到上篇文章中介紹的包含推送的證書。分别将certificate和private key導出得到.p12檔案。例如:Apple Development Push Services > Export “Apple Development Push Services ID123”,儲存為 apns-dev-cert.p12。對“Private Key”做同樣操作,儲存為 apns-dev-key.p12 檔案。
  • 需要通過終端指令将這些檔案轉換為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

    此處要求輸入一個密碼,輸入123456.

  • 移除密碼(上面的123456)

    openssl rsa -in apns-dev-key.pem -out apns-dev-key.pem

  • 最後,你需要将鍵和許可檔案合成為apns-dev.pem檔案,此檔案在連接配接到APNS時需要使用:

    cat apns-dev-cert.pem apns-dev-key.pem > apns-dev.pem

同樣 Distribution Certificate 的pem檔案生成方式一樣。 openssl pkcs12 -clcerts -nokeys -out apns-dis-cert.pem -in apns-dis-cert.p12

openssl pkcs12 -nocerts -out apns-dis-key.pem -in apns-dis-key.p12 openssl rsa -in apns-dis-key.pem -out apns-dis-key.pem cat apns-dis-cert.pem apns-dis-key.pem > apns-dis.pem

這樣,伺服器的證書就生成了。

為了測試證書是否工作,執行下面的指令:

$telnet gateway.sandbox.push.apple.com 2195

Trying17.172.232.226…

Connected togateway.sandbox.push-apple.com.akadns.net.

Escapecharacter is ‘^]’.

它将嘗試發送一個規則的,不加密的連接配接到APNS服務。如果你看到上面的回報,那說明你的MAC能夠到達APNS。按下Ctrl+C關閉連接配接。如果得到一個錯誤資訊,那麼你需要確定你的防火牆允許2195端口。

然後再次連接配接,這次用我們的SSL證書和私鑰來設定一個安全的連接配接:

$openssl s_client -connectgateway.sandbox.push.apple.com:2195

-certPushChatCert.pem -key PushChatKey.pem

Enterpass phrase for PushChatKey.pem:

你會看到一個完整的輸出,讓你明白OpenSSL在背景做什麼。如果連接配接是成功的,你可以鍵入一些字元。當你按下回車後,服務就會斷開連接配接。如果在建立連接配接時有問題,OpenSSL将會給你一個錯誤消息,

ck.pem檔案就是我們需要得到php連接配接APNS的檔案,将ck.pem和push.php放入同一目錄上傳到伺服器,push.php的代碼如下: 

<?php
//這裡是我們上面得到的deviceToken,直接複制過來(記得去掉空格)

$deviceToken= '740f4707bebcf74f 9b7c25d48e3358945f6aa01da5ddb387462c7eaf 61bb78ad';

// Put your private key'spassphrase here:

$passphrase= 'abc123456';

// Put your alert messagehere:

$message= 'My first push test!';



$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 APNSserver

//這個為正是的釋出位址

 //$fp =stream_socket_client(“ssl://gateway.push.apple.com:2195“, $err,$errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);

//這個是沙盒測試位址,釋出到appstore後記得修改哦

$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 payloadbody

$body['aps'] = array(

'alert' =>$message,

'sound' => 'default'

);

// Encode the payload asJSON

$payload =json_encode($body);

// Build the binarynotification

$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 successfullydelivered' . PHP_EOL;

// Close the connection to theserver

fclose($fp);

?>
           

接下來我們通路http://localhost/push/push.php

iphone就會接收到一條推送消息了,如果有問題的話就檢查上面的操作步驟,特别是加紅的部分

另外去除标記的方法為,在viewDidApper中加入

int badge =[UIApplication sharedApplication].applicationIconBadgeNumber;

if(badge > 0)
{

      badge--;

      [UIApplication sharedApplication].applicationIconBadgeNumber = badge;

}
           

搜(2)JAVA服務跟PHP相同

(3).NET服務如下

  1、生成Certificate Signing Request (CSR):

【iOS】遠端消息推送

2、生成*.p12檔案

導出密鑰,并輸入你的密碼。

【iOS】遠端消息推送

3、生成cert.cer檔案

【iOS】遠端消息推送

到現在為止,我們已經生成了3個檔案。

1、certsign.certSigningRequest

2、key.p12

3、cert.cer

從用戶端得的deviceToken。

發送通知的.net應用程式出來需要知道deviceToken之外,還需要一個與APNS連接配接的證書。

這個證書可以通過我們前面生成的兩個檔案中得到。

使用OpenSSL生成.net和APNS通信的證書檔案。

1、将cert.cer轉換成 cert.pem格式。

openssl x509 -in cert.cer -inform DER -out cert.pem -outform PEM

2、将p12格式的私鑰轉換成pem,需要設定4次密碼,這裡密碼都設定為:abc123。

openssl pkcs12 -nocerts -out key.pem -in key.p12

3、用certificate和the key 建立PKCS#12格式的檔案。

openssl pkcs12 -export -in cert.pem -inkey key.pem -certfile certsign.certSigningRequest -name "cert" -out apns.p12

這樣我們就得到了在.net應用程式中使用的證書檔案:apns.p12。

net的生成證書就是這個樣子。其他程式的方式會不一樣。切記切記

有個開源的類庫:apns-sharp。

位址是:http://code.google.com/p/apns-sharp/。

我們下載下傳源代碼,對裡面的JdSoft.Apple.Apns.Notifications做相應的調整就能用了。

【iOS】遠端消息推送

正式環境的話   将    sandbox=true;