IOS推送消息是許多IOS應用都具備的功能,最近也在研究這個功能,參考了很多資料終于搞定了,下面就把步驟拿出來分享下(網上同樣的步驟可以查到很多,本文轉自http://zxs19861202.iteye.com/blog/1532460
iOS消息推送的工作機制可以簡單的用下圖來概括:
Provider是指某個iPhone軟體的Push伺服器,APNS是Apple Push NotificationService的縮寫,是蘋果的伺服器。
上圖可以分為三個階段:
第一階段:應用程式把要發送的消息、目的iPhone的辨別打包,發給APNS。
第二階段:APNS在自身的已注冊Push服務的iPhone清單中,查找有相應辨別的iPhone,并把消息發送到iPhone。
第三階段:iPhone把發來的消息傳遞給相應的應用程式,并且按照設定彈出Push通知。
從上圖我們可以看到:
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)
2、填寫你的郵箱和常用名稱,并選擇儲存到硬碟。
點選繼續:
這樣就在本地生成了一個Push.certSigningRequest檔案。
二、p12檔案
1、導出密鑰。
2、輸入你的密碼。
這樣就生成了一個Push.p12檔案。
三、SSL certificate檔案
1、用你付過費的帳号登入到iOS Provisioning Portal,并建立一個App ID,這個過程可以參考:iOS應用的真機調試,這樣就會生成下面這條記錄:
2、點選右側的Configure:
3、點選Development Push SSL Certificate一行後的Configure:
4、點選Continue:
5、選擇前面生成好的Push.certSigningRequest檔案,點選Generate,出現如下所示的頁面:
6、點選Continue:
7、點選Download,并将檔案命名為aps_developer_identity.cer。
8、點選Done,你會發現狀态變成了Enabled:
到現在為止,我們已經生成了三個檔案:
1、Push.certSigningRequest
2、Push.p12
3、aps_developer_identity.cer
輕按兩下aps_developer_dientity.cer 注冊到你的鑰匙串中,這樣你的鑰匙串中就會有
二、準備profile證書,因為推送消息隻能再真機上測試,是以要建一個profile證書
點選"new profile"為上面建立的APP ID建個profile,成功之後下載下傳*_Dev_Profile.mobileprovision
輕按兩下将其加入到xcode 的Provisioning Profiles 中,這裡有一點要注意,再将這個加入xcode之前如果之前已經加入過一定要把之前加入的删掉,如果有多個的話會出錯。
三、工程代碼
到這裡證書已經準備完畢,接下來,我們在xcode中建立一個測試工程,注意設定工程的Bundle Identifier必須與上面建的APP ID裡的相同
在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):
2、生成*.p12檔案
導出密鑰,并輸入你的密碼。
3、生成cert.cer檔案
到現在為止,我們已經生成了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做相應的調整就能用了。
正式環境的話 将 sandbox=true;