iOS遠(yuǎn)程推送原理及詳細(xì)實現(xiàn)過程(前端后臺)

導(dǎo)語

推送通知键畴,是現(xiàn)在的應(yīng)用必不可少的功能。那么在 iOS 中驻右,我們是如何實現(xiàn)遠(yuǎn)程推送的呢什黑?iOS 的遠(yuǎn)程推送原理又是什么呢?在做 iOS 遠(yuǎn)程推送時堪夭,我們會遇到各種各樣的問題愕把。那么首先讓我們準(zhǔn)備一些做推送需要的東西。我們需要一個付費的蘋果開發(fā)者賬號(免費的不可以做遠(yuǎn)程推送)森爽,有了開發(fā)者賬號恨豁,我們可以去蘋果開發(fā)者網(wǎng)站,配置自己所需要的推送的相關(guān)證書爬迟。然后下載證書橘蜜,供我們后面使用,詳細(xì)的證書配置過程付呕,我們下面再說计福。

iOS推送通知的基本原理:

蘋果的推送服務(wù)通知是由自己專門的推送服務(wù)器APNs (Apple Push Notification service)來完成的,其過程是 APNs 接收到我們自己的應(yīng)用服務(wù)器發(fā)出的被推送的消息徽职,將這條消息推送到指定的 iOS 的設(shè)備上象颖,然后再由 iOS設(shè)備通知到我們的應(yīng)用程序,我們將會以通知或者聲音的形式收到推送回來的消息活箕。 iOS 遠(yuǎn)程推送的前提是力麸,裝有我們應(yīng)用程序的 iOS 設(shè)備可款,需要向 APNs 服務(wù)器注冊,注冊成功后克蚂,APNs 服務(wù)器將會給我們返回一個 devicetoken闺鲸,我們獲取到這個 token 后會將這個 token 發(fā)送給我們自己的應(yīng)用服務(wù)器。當(dāng)我們需要推送消息時埃叭,我們的應(yīng)用服務(wù)器將消息按照指定的格式進(jìn)行打包摸恍,然后結(jié)合 iOS 設(shè)備的 devicetoken 一起發(fā)給 APNs 服務(wù)器。我們的應(yīng)用會和 APNs 服務(wù)器維持一個基于 TCP 的長連接赤屋,APNs 服務(wù)器將新消息推送到iOS 設(shè)備上立镶,然后在設(shè)備屏幕上顯示出推送的消息。

設(shè)備注冊APNs的流程圖:
forumImage20160511110244548.png
上圖完成了如下步驟:
  • Device(設(shè)備)連接APNs服務(wù)器并攜帶設(shè)備序列號(UUID)
  • 連接成功类早,APNs經(jīng)過打包和處理產(chǎn)生devicetoken并返回給注冊的Device(設(shè)備)
  • Device(設(shè)備)攜帶獲取的devicetoken發(fā)送到我們自己的應(yīng)用服務(wù)器
  • 完成需要被推送的Device?(設(shè)備)在APNs服務(wù)器和我們自己的應(yīng)用服務(wù)器的注冊
推送過程圖:
forumImage20160511110304267.png
推送的過程經(jīng)過如下步驟:

1.首先媚媒,我們的設(shè)備安裝了具有推送功能的應(yīng)用(應(yīng)用程序要用代碼注冊消息推動),我們的 iOS設(shè)備在有網(wǎng)絡(luò)的情況下會連接APNs推送服務(wù)器涩僻,連接過程中缭召,APNS 服務(wù)器會驗證devicetoken,連接成功后維持一個基于TCP 的長連接逆日;
2.Provider(我們自己的應(yīng)用服務(wù)器)收到需要被推送的消息并結(jié)合被推送的 iOS設(shè)備的devicetoken一起打包發(fā)送給APNS服務(wù)器嵌巷;
3.APNS服務(wù)器將推送信息推送給指定devicetoken的iOS設(shè)備;
4.iOS設(shè)備收到推送消息后通知我們的應(yīng)用程序并顯示和提示用戶(聲音室抽、彈出框)

比較直觀的流程圖:
流程圖
信息包結(jié)構(gòu)圖:

信息包結(jié)構(gòu)圖

上圖顯示的這個消息體就是我們的應(yīng)用服務(wù)器(Provider)發(fā)送給APNs服務(wù)器的消息結(jié)構(gòu)搪哪,APNs驗證這個結(jié)構(gòu)正確并提取其中的信息后,再將消息推送到指定的iOS設(shè)備坪圾。這個結(jié)構(gòu)體包括五個部分晓折,第一個部分是命令標(biāo)示符,第二個部分是我們的devicetoken的長度神年,第三部分是我們的devicetoken字符串已维,第四部分是推送消 息體(Payload)的長度,最后一部分也就是真正的消息內(nèi)容了已日,里面包含了推送消息的基本信息垛耳,比如消息內(nèi)容,應(yīng)用Icon右上角顯示多少數(shù)字以及推送消息到達(dá)時所播放的聲音等
Payload(消息體)的結(jié)構(gòu):

{
     “aps”:{
     “alert”:“聽云給您發(fā)送了新消息”,
     “badge”:1,
     “sound”:“default”
     },
}

這其實就是個JSON結(jié)構(gòu)體飘千,alert標(biāo)簽的內(nèi)容就是會顯示在用戶手機上的推送信息堂鲜,badge顯示的數(shù)量(注意是整型)是會在應(yīng)用Icon右上角顯示的數(shù)量,提示有多少條未讀消息等护奈,sound就是當(dāng)推送信息送達(dá)是手機播放的聲音缔莲,傳defalut就標(biāo)明使用系統(tǒng)默認(rèn)聲音。


下面就是我們推送通知所需要的證書的推送過程:

1.首先我們要新建一個Certificate Signing Request(也就是CSR)的請求文件

在應(yīng)用程序里的使用工具中找到鑰匙串訪問霉旗,選擇從證書頒發(fā)機構(gòu)請求證書

forumImage20160511110452523.png

注意:郵箱地址,填自己的開發(fā)者賬號,常用名,隨便填一個記住就行痴奏。然后選擇存儲到磁盤蛀骇。繼續(xù)就行。

forumImage20160511110546038.png

保存位置在 tingyun(指定自己的文件夾读拆,這里我選擇的是我的文件夾),點擊存儲 然后點擊完成后我們會在 tingyun 里看到一個CertificateSigningRequest.certSigningRequest的請求文件擅憔,也就是我們說的CSR文件。在我們生成CSR文件的同時檐晕,會在鑰匙串訪問中生成一對秘鑰暑诸,名稱為剛才我們填寫的常用名

2.配置AppID

到蘋果開發(fā)者網(wǎng)站https://developer.apple.com點擊Account

forumImage20160511110641214.png

選擇 Certificates,identifiers&Profiles

forumImage20160511110703158.png

選擇 Identifiers ->App IDs 點擊上方的+號創(chuàng)建一個 App ID.

forumImage20160511110723649.png

Name: 填寫 App 的名字就行 App ID Suffix 選擇不用通配符的及 Explicit App ID Bundle ID:填寫自己應(yīng)用的 Bundle ID 一定要和自己應(yīng)用的一致.

forumImage20160511110753676.png

在下面的 App Services 中選擇自己需要的服務(wù) 我們需要推送服務(wù),所以在Push Notifications上打勾 然后點擊continue

forumImage20160511110813852.png
3.創(chuàng)建證書

證書需要創(chuàng)建兩種,一種是開發(fā)的、一種是發(fā)布的,開發(fā)的是做測試用的坯墨。 選擇Development 點擊右上角的+號,創(chuàng)建證書,我們首先創(chuàng)建開發(fā)證書

forumImage20160511110833611.png

選擇Apple Push Notification service SSL (Sandbox),創(chuàng)建推送服務(wù)證書點擊下一步

forumImage20160511110852080.png

這兒的 App ID 選擇我們剛才創(chuàng)建的 App ID然后點擊下一步,下一步

forumImage20160511110906544.png

這兒點擊 Choose File,選擇我們剛才創(chuàng)建的 CSR 文件. 然后點擊生成(Generate)最后點擊下載,下載證書。將下載的證書西采,放到指定位置。
forumImage20160511110929879.png

發(fā)布證書的創(chuàng)建和開發(fā)證書一樣,選擇Production->Apple Push Notification service SSL (Production)后面和開發(fā)證書一樣


forumImage20160511111121989.png
4.添加 Devices:

首先選中你要添加哪種設(shè)備乃坤,然后在左上角點擊“+”號苛让。

forumImage20160511111201022.png

Name 填寫一個設(shè)備名字。 UDID 填寫自己需要加入測試的設(shè)備的 UDID湿诊。 然后點擊下一步

forumImage20160511111230260.png

然后點擊 Register 即可

forumImage20160511111303570.png

點擊Done。

forumImage20160511111404730.png
5.查找設(shè)備的 UDID:

用自己的 iOS 設(shè)備連接到電腦上瘦材,打開 iTunes厅须。 在設(shè)備摘要處可以看見一個序列號,點擊序列號就會變成 UDID食棕。

forumImage20160511111435241.png

6.生成配置文件

配置文件也有兩種朗和,一種是開發(fā)的,一種是發(fā)布的簿晓,開發(fā)的使我們做測試需要的眶拉,發(fā)布的是我們在 Appstore 上發(fā)布時需要的,我們都需要生成憔儿。 我們先生成開發(fā)配置文件,選擇Provisioning Profiles->Development點擊右上角的+號忆植。

forumImage20160511111458753.png

選擇iOS App Development 點擊下一步

forumImage20160511111527684.png

這兒的 App ID 仍然選擇我們剛才創(chuàng)建的 App ID

forumImage20160511111551686.png

forumImage20160511111611829.png

這兒選擇我們開發(fā)者的證書,如果不知道是哪個選擇全部即可

forumImage20160511111637112.png

這兒選擇我們的測試設(shè)備,如果沒有則在前面的Devices里面添加即可

forumImage20160511111709881.png

forumImage20160511111732656.png

隨便取個名字即可,然后下載下來

forumImage20160511111817402.png

發(fā)布配置文件和開發(fā)配置文件一樣創(chuàng)建,選擇Distribution->Ad Hoc即可,后面與發(fā)布配置文件一樣谒臼。

forumImage20160511111914255.png
forumImage20160511111956889.png
forumImage20160511112034232.png

證書配置完成,打開我們創(chuàng)建的應(yīng)用項目

打開AppDelegate.m 文件,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中添加下面代碼,注冊消息推送

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
        /** 消息推送注冊 */
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
        
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    }else {
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    }
    
    return YES;
}
下面方法是返回 ANPs 蘋果推送服務(wù)器生成的唯一標(biāo)識
/** 接收服務(wù)器傳回的設(shè)備唯一標(biāo)識 token */
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    
    // 第一次運行獲取到DeviceToken時間會比較長朝刊!
    // 將deviceToken轉(zhuǎn)換成字符串,以便后續(xù)使用
    NSString *token = [deviceToken description];
    NSLog(@"description %@", token);
}

下面方法是當(dāng)有消息推送回來時,接收推送消息   
/** 設(shè)備接收到來自蘋果推送服務(wù)器的消息時觸發(fā)的,用來顯示推送消息 */

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

    NSLog(@"userInfo == %@",userInfo);
}

上面方法是當(dāng)注冊推送服務(wù)失敗時,接收錯誤信息
/** 注冊推送服務(wù)失敗 */
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    NSLog(@"注冊失敗 %@",error);
}

服務(wù)器端(Java服務(wù)器)

服務(wù)器端我們需要,一個后綴為. p12的證書,以及需要的 jar 包 服務(wù)器端的證書生成方式: 打開我們前面下載的證書,在鑰匙串中找到它

forumImage20160511112206166.png

點擊鼠標(biāo)右鍵選擇導(dǎo)出

forumImage20160511112222101.png

導(dǎo)出后綴為.p12的文件保存到自己的電腦上,需要輸入一個密碼,在 Java 服務(wù)器端要用到

forumImage20160511112257281.png

Java服務(wù)器端需要的 Jar 包
forumImage20160511112326820.png

Java 服務(wù)器端代碼:

import javapns.back.PushNotificationManager;
import javapns.back.SSLConnectionHelper;
import javapns.data.Device;
import javapns.data.PayLoad;
public class pushService {
    public static void main(String[] args) {
           
           
          try {
                   String deviceToken = "eab6df47eb4f81e0aaa93bb208cffd7dc3884fd346ea0743fcf93288018cfcb6";
                   //被推送的iphone應(yīng)用程序標(biāo)示符      
                   PayLoad payLoad = new PayLoad();
                   payLoad.addAlert("測試我的push消息");
                   payLoad.addBadge(1);
                   payLoad.addSound("default");
                            
                   PushNotificationManager pushManager = PushNotificationManager.getInstance();
                   pushManager.addDevice("iphone", deviceToken);
                   
                                   //測試推送服務(wù)器地址:gateway.sandbox.push.apple.com /2195 
                   //產(chǎn)品推送服務(wù)器地址:gateway.push.apple.com / 2195 
                   String host="gateway.sandbox.push.apple.com";  //測試用的蘋果推送服務(wù)器
                   int port = 2195;
                   String certificatePath = "/Users/hsw/Desktop/PushTest/PushTest.p12"; //剛才在mac系統(tǒng)下導(dǎo)出的證書
                   
                   String certificatePassword= "123456";
                  
                   pushManager.initializeConnection(host, port, certificatePath,certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
                             
                   //Send Push
                   Device client = pushManager.getDevice("iphone");
                   pushManager.sendNotification(client, payLoad); //推送消息
                   pushManager.stopConnection();
                   pushManager.removeDevice("iphone");
                  }
                  catch (Exception e) {
                   e.printStackTrace();
                   System.out.println("push faild!");
                    return;
                  }
                  System.out.println("push succeed!");
                 }

}

注:資料來自聽云College團(tuán)隊成員阮小乙蜈缤,郵箱:ruanqy#tingyun.com拾氓;轉(zhuǎn)載注明 http://blog.tingyun.com/web/article/detail/571

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市底哥,隨后出現(xiàn)的幾起案子咙鞍,更是在濱河造成了極大的恐慌房官,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件续滋,死亡現(xiàn)場離奇詭異翰守,居然都是意外死亡,警方通過查閱死者的電腦和手機吃粒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門潦俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徐勃,你說我怎么就攤上這事事示。” “怎么了僻肖?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵肖爵,是天一觀的道長。 經(jīng)常有香客問我臀脏,道長劝堪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任揉稚,我火速辦了婚禮秒啦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搀玖。我一直安慰自己余境,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布灌诅。 她就那樣靜靜地躺著芳来,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猜拾。 梳的紋絲不亂的頭發(fā)上即舌,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音挎袜,去河邊找鬼顽聂。 笑死,一個胖子當(dāng)著我的面吹牛宋雏,可吹牛的內(nèi)容都是我干的芜飘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼磨总,長吁一口氣:“原來是場噩夢啊……” “哼嗦明!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚪燕,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤娶牌,失蹤者是張志新(化名)和其女友劉穎奔浅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诗良,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汹桦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鉴裹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞骆。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖径荔,靈堂內(nèi)的尸體忽然破棺而出督禽,到底是詐尸還是另有隱情,我是刑警寧澤总处,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布狈惫,位于F島的核電站,受9級特大地震影響鹦马,放射性物質(zhì)發(fā)生泄漏胧谈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一荸频、第九天 我趴在偏房一處隱蔽的房頂上張望菱肖。 院中可真熱鬧,春花似錦旭从、人聲如沸蔑滓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燎窘,卻和暖如春摹闽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褐健。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工付鹿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚜迅。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓舵匾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谁不。 傳聞我的和親對象是個殘疾皇子坐梯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容