推送通知iOS客戶端編寫實現及推送服務器端編寫
1、iOS客戶端編程
推送通知技術在Mac OS X和iOS係統上都可以運行,我們本章主要介紹iOS客戶端編程,推送通知的編程比較簡單,編程的關鍵是獲得令牌,這是從APNS返回的,然後還有把提交給內容提供商。下麵我們看看開發之前的一些準備工作。
配置Xcode工程
編寫iOS推送應用需要在Xcode工程中進行一些配置,這些配置是主要是設置代碼簽名標識,代碼簽名標識的前提要有配置概要文件(Provisioning Profiles)。
有了配置概要文件即可以設置代碼簽名標識了,需要下載概要文件到本地,代碼簽名標識需要選擇這個配置概要文件。選擇TAGETS→MyNotes→Code Signing Identity,選擇你自己的代碼簽名標識。
設置完成之後可以開始編碼工作了。
代碼實現
推送通知的代碼實現主要分為兩個步驟,第一步注冊接收通知,第二步接收注冊結果。這些工作都是在應用程序委托對象AppDelegate中實現的。
我們先看看注冊部分的代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //注冊接收通知類型 [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; //設置圖標標記 application.applicationIconBadgeNumber = 1; return YES; }
注冊過程比較長,它通過APNS從蘋果公司返回,注冊結束後的回調方法代碼:
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(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 = @”https://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*)application didFailToRegisterForRemoteNotificationsWithError:(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,然後用瀏覽器運行,在瀏覽器中輸入https://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(https://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可以在https://code.google.com/p /javapns/下載到。log4j-1.2.15.jar到https://logging.apache.org/log4j/1.2 /download.html下載。
這個Java程序的運行我們就不再介紹了,它是一個Java Application可以在有jre環境運行,我們可以把它做成JavaWeb程序,這樣就可以在瀏覽器中發送通知了。
最後更新:2017-04-03 18:52:01