iOS實現遠程推送原理及過程_IOS

來源:互聯網
上載者:User

推播通知,是現在的應用必不可少的功能。那麼在 iOS 中,我們是如何?遠程推送的呢?iOS 的遠程推送原理又是什麼呢?在做 iOS 遠程推送時,我們會遇到各種各樣的問題。那麼首先讓我們準備一些做推送需要的東西。我們需要一個付費的蘋果開發人員帳號(免費的不可以做遠程推送),有了開發人員帳號,我們可以去蘋果開發人員網站,配置自己所需要的推送的相關認證。然後下載認證,供我們後面使用,詳細的認證配置過程,我們下面再說。

首先我們要說說iOS推播通知的基本原理

蘋果的推送服務通知是由自己專門的推送伺服器APNs (Apple Push Notification service)來完成的,其過程是 APNs 接收到我們自己的應用伺服器發出的被推送的訊息,將這條訊息推送到指定的 iOS 的裝置上,然後再由 iOS裝置通知到我們的應用程式,我們將會以通知或者聲音的形式收到推送回來的訊息。 iOS 遠程推送的前提是,裝有我們應用程式的 iOS 裝置,需要向 APNs 伺服器註冊,註冊成功後,APNs 伺服器將會給我們返回一個 devicetoken,我們擷取到這個 token 後會將這個 token 發送給我們自己的應用伺服器。當我們需要推送訊息時,我們的應用伺服器將訊息按照指定的格式進行打包,然後結合 iOS 裝置的 devicetoken 一起發給 APNs 伺服器。我們的應用會和 APNs 伺服器維持一個基於 TCP 的長串連,APNs 伺服器將新訊息推送到iOS 裝置上,然後在裝置螢幕上顯示出推送的訊息。

裝置註冊APNs的流程圖

上圖完成了如下步驟:

1.Device(裝置)串連APNs伺服器並攜帶裝置序號(UUID)

2.串連成功,APNs經過打包和處理產生devicetoken並返回給註冊的Device(裝置)

3.Device(裝置)攜帶擷取的devicetoken發送到我們自己的應用伺服器

4.完成需要被推送的Device(裝置)在APNs伺服器和我們自己的應用伺服器的註冊

推送過程圖:

推送的過程經過如下步驟

1.首先,我們的裝置安裝了具有推送功能的應用(應用程式要用代碼註冊訊息推動),我們的 iOS裝置在有網路的情況下會串連APNs推送伺服器,串連過程中,APNS 伺服器會驗證devicetoken,串連成功後維持一個基於TCP 的長串連;

2.Provider(我們自己的應用伺服器)收到需要被推送的訊息並結合被推送的 iOS裝置的devicetoken一起打包發送給APNS伺服器;

3.APNS伺服器將推送資訊推送給指定devicetoken的iOS裝置;

4.iOS裝置收到推送訊息後通知我們的應用程式並顯示和提示使用者(聲音、彈出框)

比較直觀的流程圖:

資訊包結構圖:

上圖顯示的這個訊息體就是我們的應用伺服器(Provider)發送給APNs伺服器的訊息結構,APNs驗證這個結構正確並提取其中的資訊後,再將訊息推送到指定的iOS裝置。這個結構體包括五個部分,第一個部分是命令標示符,第二個部分是我們的devicetoken的長度,第三部分是我們的devicetoken字串,第四部分是推送消 息體(Payload)的長度,最後一部分也就是真正的訊息內容了,裡麵包含了推送訊息的基本資料,比如訊息內容,應用Icon右上方顯示多少數字以及推送訊息到達時所播放的聲音等

Payload(訊息體)的結構:

{ “aps”:{ “alert”:“聽雲給您發送了新訊息”, “badge”:1, “sound”:“default” },}

這其實就是個JSON結構體,alert標籤的內容就是會顯示在使用者手機上的推送資訊,badge顯示的數量(注意是整型)是會在應用Icon右上方顯示的數量,提示有多少條未讀訊息等,sound就是當推送資訊送達是手機播放的聲音,傳defalut就標明使用系統預設聲音。

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

1.首先我們要建立一個Certificate Signing Request(也就是CSR)的請求檔案

在應用程式裡的使用工具中找到鑰匙串訪問,選擇從憑證授權單位請求認證

注意:郵箱地址,填自己的開發人員帳號,常用名,隨便填一個記住就行。然後選擇儲存到磁碟。繼續就行。

儲存位置在 tingyun(指定自己的檔案夾,這裡我選擇的是我的檔案夾),點擊儲存

然後點擊完成後我們會在 tingyun 裡看到一個CertificateSigningRequest.certSigningRequest的請求檔案,也就是我們說的CSR檔案。在我們產生CSR檔案的同時,會在鑰匙串訪問中產生一對秘鑰,名稱為剛才我們填寫的常用名

2.配置AppID

到蘋果開發人員網站https://developer.apple.com

點擊Account 

選擇 Certificates,identifiers&Profiles 

選擇 Identifiers ->App IDs 點擊上方的+號建立一個 App ID.

Name: 填寫 App 的名字就行

App ID Suffix 選擇不用萬用字元的及 Explicit App ID

Bundle ID:填寫自己應用的 Bundle ID 一定要和自己應用的一致.

在下面的 App Services 中選擇自己需要的服務

我們需要推送服務,所以在Push Notifications上打勾

然後點擊continue

3.建立認證

認證需要建立兩種,一種是開發的、一種是發布的,開發的是做測試用的。

選擇Development 點擊右上方的+號,建立認證,我們首先建立開發認證

選擇Apple Push Notification service SSL (Sandbox),建立推送服務憑證點擊下一步

這兒的 App ID 選擇我們剛才建立的 App ID

然後點擊下一步,下一步

這兒點擊 Choose File,選擇我們剛才建立的 CSR 檔案.

然後點擊產生(Generate)

最後點擊下載,下載認證。將下載的認證,放到指定位置。

 

發布認證的建立和開發認證一樣,選擇Production->Apple Push Notification service SSL (Production)後面和開發認證一樣

4.添加 Devices:

首先選中你要添加哪種裝置,然後在左上方點擊“+”號。

 

Name 填寫一個裝置名稱字。

UDID 填寫自己需要加入測試的裝置的 UDID。

然後點擊下一步

然後點擊 Register 即可

 

點擊Done。

 

5.尋找裝置的 UDID:

用自己的 iOS 裝置串連到電腦上,開啟 iTunes。

在裝置摘要處可以看見一個序號,點擊序號就會變成 UDID。

 

6.組建組態檔案

設定檔也有兩種,一種是開發的,一種是發布的,開發的使我們做測試需要的,發布的是我們在 Appstore 上發布時需要的,我們都需要產生。

我們先產生開發設定檔,選擇Provisioning Profiles->Development點擊右上方的+號。

 

選擇iOS App Development 點擊下一步

這兒的 App ID 仍然選擇我們剛才建立的 App ID

 

這兒選擇我們開發人員的認證,如果不知道是哪個選擇全部即可

 

這兒選擇我們的測試裝置,如果沒有則在前面的Devices裡面添加即可

 

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

 

發行設定檔和開發設定檔一樣建立,選擇Distribution->Ad Hoc即可,後面與發行設定檔一樣。

 

 

認證配置完成,開啟我們建立的應用項目

開啟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 蘋果推送伺服器產生的唯一標識/** 接收伺服器傳回的裝置唯一標識 token */-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{  // 第一次運行擷取到DeviceToken時間會比較長! // 將deviceToken轉換成字串,以便後續使用 NSString *token = [deviceToken description]; NSLog(@"description %@", token);}下面方法是當有訊息推送回來時,接收推送訊息 /** 裝置接收到來自蘋果推送伺服器的訊息時觸發的,用來顯示推送訊息 */-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"userInfo == %@",userInfo);}上面方法是當註冊推送服務失敗時,接收錯誤資訊/** 註冊推送服務失敗 */-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"註冊失敗 %@",error);}

伺服器端(Java伺服器)

伺服器端我們需要,一個尾碼為. p12的認證,以及需要的 jar 包

伺服器端的認證產生方式:

開啟我們前面下載的認證,在鑰匙串中找到它

 

點擊滑鼠右鍵選擇匯出

 

匯出尾碼為.p12的檔案儲存到自己的電腦上,需要輸入一個密碼,在 Java 伺服器端要用到

 

Java伺服器端需要的 Jar 包

Java 伺服器端代碼:

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應用程式標示符      PayLoad payLoad = new PayLoad();    payLoad.addAlert("測試我的push訊息");    payLoad.addBadge(1);    payLoad.addSound("default");          PushNotificationManager pushManager = PushNotificationManager.getInstance();    pushManager.addDevice("iphone", deviceToken);           //測試推送伺服器位址:gateway.sandbox.push.apple.com /2195    //產品推送伺服器位址:gateway.push.apple.com / 2195     String host="gateway.sandbox.push.apple.com"; //測試用的蘋果推送伺服器    int port = 2195;    String certificatePath = "/Users/hsw/Desktop/PushTest/PushTest.p12"; //剛才在mac系統下匯出的認證        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!");   }}

本文已被整理到了《iOS推送教程》,歡迎大家學習閱讀。

以上就是完整的iOS遠程推送原理及實現過程,希望對大家的學習有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.