IOS 基于APNS消息推送原理與實現(JAVA后臺)

Push的原理:
Push 的工作機制可以簡單的概括為下圖
圖中,Provider是指某個iPhone軟件的Push服務器,這篇文章我將使用.net作為Provider。
APNS 是Apple Push Notification Service(Apple Push服務器)的縮寫,是蘋果的服務器。
上圖可以分為三個階段。
第一階段:Push服務器應用程序把要發送的消息、目的iPhone的標識打包,發給APNS。
第二階段:APNS在自身的已注冊Push服務的iPhone列表中,查找有相應標識的iPhone,并把消息發到iPhone。
第三階段:iPhone把發來的消息傳遞給相應的應用程序, 并且按照設定彈出Push通知。
從上圖我們可以看到。
1、首先是應用程序注冊消息推送。
2、 IOS跟APNS Server要deviceToken。應用程序接受deviceToken。
3、應用程序將deviceToken發送給PUSH服務端程序。
4、 服務端程序向APNS服務發送消息。
5、APNS服務將消息發送給iPhone應用程序。
無論是iPhone客戶端跟APNS,還是Provider和APNS都需要通過證書進行連接的。下面介紹一下所用到證書的制作。
一、CSR文件

1、生成Certificate Signing Request(CSR)
2、填寫你的郵箱和常用名稱,并選擇保存到硬盤。
點擊繼續:
這樣就在本地生成了一個PushTest.certSigningRequest文件。


二、SSL certificate文件

1、用你付過費的帳號登錄到iOS Provisioning Portal,并創建Certificates(已創建可省略),如下圖:
點擊Submit
創建Certificate完畢。
2、新建一個App ID
點擊New App ID
輸入Description,Bundle Identifier,點擊Submit,新建App ID完畢。
找到新建的App ID 點擊右側的Configure:
Development Push SSL Certificate ,與Production Push SSL Certificate 區別在于一個是用于開發的推送證書,一個是用于發布產品的推送證書。兩個證書獲取到的終端deviceToken是不一樣的,用兩個證書生成的P12證書用于JAVA后臺連接APNS的服務器地址也是不同的,Development Push SSL Certificate 對應連接的服務器地址是:gateway.sandbox.push.apple.com。Production Push SSL Certificate??對應連接的服務器地址是:gateway.push.apple.com。
點擊Development Push SSL Certificate一行后的Configure:
點擊Continue:
選擇前面生成好的PushTest.certSigningRequest文件,點擊Generate,出現如下所示的頁面:
點擊Continue:
點擊Download,下載生成的支持推送服務的證書(命名為:aps_development-6.cer)。

點擊Done,你會發現狀態變成了Enabled:
到現在為止,我們已經生成了兩個文件:
1、PushTest.certSigningRequest
2、aps_development-6.cer(下載生成的支持推送服務的證書。)
雙擊aps_development-6.cer注冊到你的鑰匙串中,這樣你的鑰匙串中就會有
三、準備profile證書,因為推送消息只能在真機上測試,所以要建一個profile證書
點擊"new profile"為上面新建的APP ID建個profile ,成功之后下載pushtestdescDevprofile.mobileprovision
雙擊將其加入到xcode 的Provisioning Profiles 中。
四、生成JAVA后臺用于連接APNS的證書:
打開鑰匙串
選中Apple Development IOS Push Services:com.easecom.zhwgpushtestdesc,右鍵將其導出。
導出用于JAVA后臺連接APNS的P12證書。
輸入p12 證書的密碼,本文中我用的是123456。記住這個密碼,JAVA后臺使用p12證書的時候要用到。
輸入訪問鑰匙串的密碼:系統登陸密碼。
導出PushTest.p12證書完畢。
到現在為止,我們已經生成了四個文件:
1、PushTest.certSigningRequest
2、aps_development-6.cer(下載生成的支持推送服務的證書。)
3、pushtestdescDevprofile.mobileprovision
4、PushTest.p12
至此IOS消息推送(JAVA后臺)證書全部制作完畢。
下面開始上代碼:
五、IOS端代碼:
1、首先在項目的AppDelegate.m中加入以下兩個代理方法
復制代碼
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [NSString stringWithFormat:@"%@", deviceToken];//獲取終端設備標識,這個標識需要通過接口發送到服務器端,服務器端推送消息到APNS時需要知道終端的標識,APNS通過注冊的終端標識找到終端設備。NSLog(@"My token is:%@", token);   
}  
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {   NSString *error_str = [NSString stringWithFormat: @"%@", error];   NSLog(@"Failed to get token, error:%@", error_str);   
}
復制代碼

2、在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入注冊消息通知推送能力;加入當應用程序處于未啟動狀態時,判斷是否由遠程消息通知觸發;加入清除消息推送通知標記。

?

復制代碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{//判斷是否由遠程消息通知觸發應用程序啟動if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {//獲取應用程序消息通知標記數(即小紅圈中的數字)int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;if (badge>0) {//如果應用程序消息通知標記數(即小紅圈中的數字)大于0,清除標記。badge--;//清除標記。清除小紅圈中數字,小紅圈中數字為0,小紅圈才會消除。[UIApplication sharedApplication].applicationIconBadgeNumber = badge;}}//消息推送注冊[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
}
3、在項目AppDelegate.m中加入消息接收處理代理方法。
//處理收到的消息推送
- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo
{//在此處理接收到的消息。NSLog(@"Receive remote notification : %@",userInfo);
}
復制代碼

六、JAVA后臺代碼:

復制代碼
public static void main(String[] args) throws Exception 
{try{//從客戶端獲取的deviceToken,在此為了測試簡單,寫固定的一個測試設備標識。String deviceToken = "df779eda 73258894 5882ec78 3ac7b254 6ebc66fe fa295924 440d34ad 6505f8c4"System.out.println("Push Start deviceToken:" + deviceToken);//定義消息模式PayLoad payLoad = new PayLoad();payLoad.addAlert("this is test!");payLoad.addBadge(1);//消息推送標記數,小紅圈中顯示的數字。payLoad.addSound("default");//注冊deviceTokenPushNotificationManager pushManager = PushNotificationManager.getInstance();pushManager.addDevice("iPhone", deviceToken);//連接APNSString host = "gateway.sandbox.push.apple.com";//String host = "gateway.push.apple.com";int port = 2195;String certificatePath = "c:/PushTest.p12";//前面生成的用于JAVA后臺連接APNS服務的*.p12文件位置String certificatePassword = "123456";//p12文件密碼。pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);//發送推送Device client = pushManager.getDevice("iPhone");System.out.println("推送消息: " + client.getToken()+"\n"+payLoad.toString() +" ");pushManager.sendNotification(client, payLoad);//停止連接APNSpushManager.stopConnection();//刪除deviceTokenpushManager.removeDevice("iPhone");System.out.println("Push End");}catch (Exception ex){ex.printStackTrace();}
}
}
復制代碼

轉載于:https://www.cnblogs.com/wangjuneng/p/4519457.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375954.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

suse linux 查看cpu,Suse Linux zmd 耗用100% CPU

最近的SUSE Linux 10(SP3)的top命令總是顯示zmd進程耗用了100%的CPU資源,而整個系統中system級別占用CPU則占用了40%以上且根本不曾釋放。嘗試重啟服務器之后,故障依舊。下面是這個問題的描述與處理。1、top命令顯示zmd cpu占用100%,system u…

linux系統調用open、write、close、read以及stat函數詳解

學習筆記 參考鏈接1 、參考鏈接2以及百度百科 在進行C語言學習的時候我們了解到了C語言相關的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相關函數,他們都是由C庫函數提供的一些函數,是…

關于objective-c的一點隨筆

多日混跡cocoachina,這篇隨筆算是積累點前人經驗吧。 首先,要多逛兩個很好的網站,Stack Overflow和github. 對于新人,一定要注意良好的格式和命名,不然對于日后回頭看代碼會非常難,oc不限制變量名稱和函數名…

【轉載】Ubuntu環境下配置Android Studio

之前學習Android開發的時候,一直跟各種教程一樣,使用的是EclipseADT,主要是比較方便,容易上手,特別是對于習慣用Eclipse開發java的朋友來說,上手更是好無壓力。但畢竟EclipseADT最多只能算Google的干兒子&a…

linux怎么進去vi編輯器,red hat enterprise linux開機怎么進入vi編輯器界面?

2015-05-21 回答后面輸入直接打回車就會顯示出來如下xx文件#■sa■jsadjk#■sa■jsklfjdl kl■sa:----現在是低行模式 現在按esc 進入第一個模式(命令模式)就變成下面xx文件#dsadjsadjk#dsadjsklfjdl kldsa現在我們按個v 就進入可是模式 現在我們一個移動光標選擇要…

數據結構--鏈式線性表

環境&#xff1a;dev c #include<stdio.h> #include<stdlib.h>typedef struct LNode *List; typedef int ElementType;struct LNode{ElementType Data;List next; };int Length(List Ptrl); List FindKth(int k,List Ptrl); List Find(ElementType x,List Ptrl); …

linux査 到漠河 裝apache,如何在Ubuntu上搭建一臺安全的Apache?Web服務器

滿意答案1.安裝Apache2使用下面這個命令&#xff0c;安裝Apache2及其他庫。1$ sudo apt-get -y install apt-get install apache2 apache2.2-common apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-cli…

vs2010 中添加 ActiveX Control Test Container工具

vs2010中的TSTCON( ActiveX Control Test Container )工具非自動安裝&#xff0c;而是作為一個例程提供。所以應找到該例程&#xff0c;并編譯&#xff1a; 如vs2010安裝在默認路徑則 1, 進入&#xff1a;C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033&#xff…

linux c實現mypwd

這個其實很簡單&#xff0c;只需要調用getcwd()這個函數就行了。 char *getcwd(char *buffer,int maxlen); 功能&#xff1a;獲取當前工作目錄 參數&#xff1a;buffer指向用來存儲絕對路徑的數組&#xff0c;maxlen絕對路徑的字符大小 返回&#xff1a;成功則返回當前的工作目…

安裝Discuz

1.下載Discuz 版本文件http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip2.下載PHPhttp://windows.php.net/downloads/releases/php-5.6.9-Win32-VC11-x64.zip把里面文件的php.ini-development 更名為php.ini Uncomment下列語句 extension_dir "ext"…

linux跑caffe模型的步驟,Caffe初步實踐——使用訓練好的模型完成語義分割任務

Caffe剛剛安裝配置結束&#xff0c;乘熱打鐵&#xff01;(一)環境準備前面我有兩篇文章寫到caffe的搭建&#xff0c;第一篇cpu only &#xff0c;第二篇是在服務器上搭建的&#xff0c;其中第二篇因為硬件環境更佳我們的步驟稍顯復雜。其實&#xff0c;第二篇也僅僅是caffe的初…

關于 Code First

第一感覺還是很新鮮的&#xff0c;你可以自由的控制數據結構。 比如&#xff0c;你想象oracle那樣&#xff0c;給每個表增加4個字段&#xff0c;創建人&#xff0c;創建時間&#xff0c;更新人&#xff0c;更新時間。完全可以創建一個父類包含著四個屬性&#xff08;甚至可以把…

靈悟禮品網上專賣店——新建數據庫

一、小組成員&#xff1a; 洪雪意&#xff08;產品負責人&#xff09; 陳淑筠&#xff08;Master&#xff09; 二、組內人員任務情況 計劃完成的任務的第三個模塊&#xff1a;分析并建立數據庫 已完成的任務&#xff1a; 任務的第三個模塊&#xff1a; 陳淑筠&#xff08;負責…

操作系統上機題目(多進程1)

1、創建1個子進程2、程通過管道與子進程連接 子進程的標準輸出連接到管道的寫端主進程的標準輸入連接到管道的讀端3、進程中調用exec(“echo”, “echo”, “hello world”, NULL)4、進程中調用read(0, buf, sizeof(buf))&#xff0c;從標準輸入中獲取子進程發送的字符串&…

Oracle數據庫dmp文件Dos命令下導入導出

Oracle數據庫dmp文件Dos命令下導入導出 2013-03-09 18:22:52| 分類&#xff1a; Oracle |舉報|字號 訂閱 數據導出: 一. 導出工具exp 他是操作系統下一個可執行的文件,存放目錄/Oracle_Home/bin. exp導出工具將數據庫中數據備份壓縮成一個二進制系統文件,可以在不同的OS間遷…

c語言報錯找不到標識符,error C3861: “_T”: 找不到標識符

頭天好好的程序&#xff0c;第二天一早就報錯&#xff0c;還是莫名其妙的錯誤&#xff1a;atlconv.h等頭文件中的“_T” 報錯&#xff0c;百思不得其解&#xff0c;各種搜索而不得&#xff0c;整個人都崩潰了。出問題一定是有原因的&#xff0c;后來冷靜下來&#xff0c;縷縷思…

js 面向對象插件寫法,還是很好理解的

/** * Created by jiangtao on 2015/5/12. * name jihe */(function () { function gather(msg) { //適應參數 if (msg) { if (msg.imgFile ! undefined) { this.imgFile msg.imgFile; }; if (msg.wechatAppid ! undefined) { this.wechatAppid msg.wechatAppid; }; }; this.…

操作系統上機題目(多進程2)

1、主進程創建2個子進程&#xff0c;主進程通過兩個管道分別與兩個子進程連接2、第一個子進程計算從1加到50的和&#xff0c;并將結果通過管道送給父進程3、第一個子進程計算從50加到100的和&#xff0c;并將結果通過管道送給父進程4、父進程讀取兩個子進程的結果&#xff0c;將…

JavaScript 的簡介

JavaScript 是一種基于對象和事件驅動的腳本語言。JavaScript和HTML一起實現網頁與客戶端的交互&#xff0c;從而可以開發客戶端的應用程序。JavaScript是通過潛入在標準的HTML文件中實現的&#xff0c;可以直接控制瀏覽器窗口個元素以及頁面內容。JavaScript一個重要的功能就是…

c語言大樂透編譯,Excel大樂透搖號vba代碼分享,說不定就中百萬了呢

大家好我是Excel從零到一&#xff0c;今天閑來無聊做了一套大樂透搖號程序的vba代碼分享給大家來看下效果Excel大樂透搖號vba代碼分享&#xff0c;說不定就中百萬了呢Sub 搖號()Dim i, a, test, s(1 To 35) As IntegerFor i 1 To 5line1: test Application.WorksheetFunction…