推播通知iOS用戶端編寫實現及推送伺服器端編寫

來源:互聯網
上載者:User

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程式,這樣就可以在瀏覽器中發送通知了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.