閱讀322 返回首頁    go 阿裏雲 go 技術社區[雲棲]


推送通知iOS客戶端編寫實現及推送服務器端編寫

1、iOS客戶端編程

推送通知技術在Mac OS X和iOS係統上都可以運行,我們本章主要介紹iOS客戶端編程,推送通知的編程比較簡單,編程的關鍵是獲得令牌,這是從APNS返回的,然後還有把提交給內容提供商。下麵我們看看開發之前的一些準備工作。

 

配置Xcode工程

編寫iOS推送應用需要在Xcode工程中進行一些配置,這些配置是主要是設置代碼簽名標識,代碼簽名標識的前提要有配置概要文件(Provisioning Profiles)。

有了配置概要文件即可以設置代碼簽名標識了,需要下載概要文件到本地,代碼簽名標識需要選擇這個配置概要文件。選擇TAGETS→MyNotes→Code Signing Identity,選擇你自己的代碼簽名標識。

20

設置完成之後可以開始編碼工作了。

代碼實現

推送通知的代碼實現主要分為兩個步驟,第一步注冊接收通知,第二步接收注冊結果。這些工作都是在應用程序委托對象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文件。

21

另外一種方法,簡單的多,我們不需要安裝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

  上一篇:go JAVA異步調用再度改進
  下一篇:go JAVA異步調用