1、iOS用戶端編程
推播通知技術在Mac OS X和iOS系統上都可以運行,我們本章主要介紹iOS用戶端編程,推播通知的編程比較簡單,編程的關鍵是獲得令牌,這是從APNS返回的,然後還有把提交給內容供應商。下面我們看看開發之前的一些準備工作。
配置Xcode工程
編寫iOS推送應用需要在Xcode工程中進行一些配置,這些配置是主要是設定程式碼簽署標識,程式碼簽署標識的前提要有配置概要檔案(Provisioning Profiles)。
有了配置概要檔案即可以設定程式碼簽署標識了,需要下載概要檔案到本地,程式碼簽署標識需要選擇這個配置概要檔案。選擇TAGETS→MyNotes→Code Signing Identity,選擇你自己的程式碼簽署標識。
設定完成之後可以開始編碼工作了。
代碼實現
推播通知的代碼實現主要分為兩個步驟,第一步註冊接收通知,第二步接收註冊結果。這些工作都是在應用程式委派物件AppDelegate中實現的。
我們先看看註冊部分的代碼:
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions{//註冊接收通知類型[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound| UIRemoteNotificationTypeAlert)];//設定表徵圖標記application.applicationIconBadgeNumber = 1;return YES;}
註冊過程比較長,它通過APNS從蘋果公司返回,註冊結束後的回調方法代碼:
- (void)application:(UIApplication*)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{NSLog(@”裝置令牌: %@”, deviceToken); ①NSString *tokeStr = [NSString stringWithFormat:@"%@",deviceToken]; ②if ([tokeStr length] == 0) {return;}NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"\<\>"];tokeStr = [tokeStr stringByTrimmingCharactersInSet:set]; ③tokeStr = [tokeStr stringByReplacingOccurrencesOfString:@" " withString:@""]; ④NSString *strURL = @”http://192.168.1.103/push_chat_service.php”; ⑤NSURL *url = [NSURL URLWithString:strURL];ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];[request setPostValue:tokeStr forKey:@"token"];[request setPostValue:@"98Z3R5XU29.com.51work6.PushChat" forKey:@"appid" ];[request setDelegate:self];NSLog(@”發送給伺服器”);[request startAsynchronous]; ⑥} - (void)application:(UIApplication*)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError*)error{NSLog(@”獲得令牌失敗: %@”, error);}
2、推送服務端編程
內容提供者接收到裝置的令牌並儲存起來,在有新的內容需要推送的時候,他們將啟動一個服務程式逐個裝置推送他們的內容。在推送具體的過程中並非直接 由內容提供者,直接發送給使用者裝置,而是服務程式與APNS通訊建立信任連接,然後把資料推送給APNS,再由APNS利用安全通道推送給使用者裝置。
如果要編寫內容提供者的推送服務程式,我們需要進行SSL認證編程,以及構建APNS資料包,資料包分為3個主要部分:Command(命令)、deviceToken(令牌)和Payload(載荷)。載荷不能超過256位元組,是JSON格式,例如:
{“aps” : {“alert” : ”You got your emails.”,“badge” : 9,“sound” : ”bingbong.aiff”}}
作為推出服務程式可以使用很多電腦語言實現,如果從便於管理角度看,使用PHP、Java和.NET,甚至是Note.js都是可以選擇的。本書重點介紹PHP和Java編寫推送服務程式。
使用PHP實現推送服務
PHP是非常不錯的伺服器端指令碼,這麼多年來沒有被JavaEE和.NET蠶食掉,說明它有過人之處。PHP編程簡單很多人原意使用,實現本章推送服務也很簡單。下面代碼是實現了推送的PHP代碼:
<?php $deviceToken= ’1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db’;//推送方式,包含內容和聲音$body = array(“aps” => array(“alert” => ’新年好. from PHP’,”badge” => 11,”sound”=>’default’)); ①//建立資料流內容物件$ctx = stream_context_create();//設定pem格式檔案$pem = ”apns-dev.pem”; ②//設定資料流內容相關的本地認證認證stream_context_set_option($ctx,”ssl”,”local_cert”, $pem); ③$pass = ”51work6.com”;//設定資料流內容相關的密碼stream_context_set_option($ctx, ’ssl’, ’passphrase’, $pass); ④//產品發布APNS伺服器,gateway.push.apple.com//測試APNS伺服器,gateway.sandbox.push.apple.com//socket通訊$fp = stream_socket_client(“ssl://gateway.sandbox.push.apple.com:2195″, $err, $errstr, 60,STREAM_CLIENT_CONNECT, $ctx); ⑤if (!$fp) {echo ”串連失敗.”;return;}print ”串連OK\n”;//載荷資訊,JSON編碼$payload = json_encode($body); ⑥//構建發送的二進位資訊$msg = chr(0) . pack(“n”,32) . pack(“H*”, str_replace(‘ ’, ”, $deviceToken)). ack(“n”,strlen($payload)) . $payload; ⑦echo ”發送訊息:” . $payload .”\n”;fwrite($fp, $msg);fclose($fp); ?>
開啟終端視窗執行如下命令:
$ openssl pkcs12 -in 認證.p12 -out apns-dev.pem -nodes
Enter Import Password:
MAC verified OK
斷行符號後需要輸入密碼,這個密碼是匯出“認證.p12”時候設定的密碼。
PHP代碼編寫完成可以運行PHP了,有兩種方法可以運行,一種是把這個檔案放到Apache HTTP伺服器目錄下,並保證Apache下安裝和 PHP,然後用瀏覽器運行,在瀏覽器中輸入http://localhost/phpPNs/Pusher.php,這個URL是我自己 Apache HTTP伺服器上的PHP檔案。
另外一種方法,簡單的多,我們不需要安裝Apache HTTP伺服器,只需要安裝了PHP解譯器就可以了,我們在終端中運行下面的指令:
$ php -f Pusher.php
串連OK
發送訊息:{“aps”:{“alert”:”\u65b0\u5e74\u597d. from PHP”,”badge”:11,”sound”:”default”}}
這樣就可以推播通知了,如果一切正常推送成功,使用者的裝置就可以接收到通知了。
使用Java推送服務
上面我們介紹了PHP實現的推送服務程式,使用其它語言編寫基本的過程也一樣的,這一節我們就介紹Java推送服務程式。由於具體的流程與PHP一 樣,這裡我們就不再自己編寫Java的實現代碼,而是使用別人已經封裝好的javapns(http://code.google.com/p /javapns/)類庫,它封裝了socket實現細節問題,開發起來變的比較簡單了。
下面代碼是實現了推送的Java代碼:
package com._51work6; import javapns.Push;import javapns.notification.PushNotificationPayload; public class Pusher { public static void main(String[] args) {try {PushNotificationPayload payload = new PushNotificationPayload(); ①payload.addCustomAlertBody(“新年好!from Java”); ②payload.addBadge(11); ③payload.addSound(“default”); ④ Push.payload(payload, ”ssl/認證.p12″, ”51work6.com”, false,“1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db”); ⑤ } catch (Exception e) {e.printStackTrace();}}}
上面的代碼還依賴與下面的類庫:bcprov-jdk15-146.jar、JavaPNS_2.2.jar和log4j-1.2.15.jar。 其中bcprov-jdk15-146.jar和JavaPNS_2.2.jar可以在http://code.google.com/p /javapns/下載到。log4j-1.2.15.jar到http://logging.apache.org/log4j/1.2 /download.html下載。
這個Java程式的運行我們就不再介紹了,它是一個Java Application可以在有jre環境運行,我們可以把它做成JavaWeb程式,這樣就可以在瀏覽器中發送通知了。