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

更多技術乾貨請戳:聽雲博客java

推送通知,是如今的應用必不可少的功能。那麼在 iOS 中,咱們是如何實現遠程推送的呢?iOS 的遠程推送原理又是什麼呢?在作 iOS 遠程推送時,咱們會遇到各類各樣的問題。那麼首先讓咱們準備一些作推送須要的東西。咱們須要一個付費的蘋果開發者帳號(免費的不能夠作遠程推送),有了開發者帳號,咱們能夠去蘋果開發者網站,配置本身所須要的推送的相關證書。而後下載證書,供咱們後面使用,詳細的證書配置過程,咱們下面再說。web

首先咱們要說說iOS推送通知的基本原理:服務器

蘋果的推送服務通知是由本身專門的推送服務器APNs (Apple Push Notification service)來完成的,其過程是 APNs 接收到咱們本身的應用服務器發出的被推送的消息,將這條消息推送到指定的 iOS 的設備上,而後再由 iOS設備通知到咱們的應用程序,咱們將會以通知或者聲音的形式收到推送回來的消息。 iOS 遠程推送的前提是,裝有咱們應用程序的 iOS 設備,須要向 APNs 服務器註冊,註冊成功後,APNs 服務器將會給咱們返回一個 devicetoken,咱們獲取到這個 token 後會將這個 token 發送給咱們本身的應用服務器。當咱們須要推送消息時,咱們的應用服務器將消息按照指定的格式進行打包,而後結合 iOS 設備的 devicetoken 一塊兒發給 APNs 服務器。咱們的應用會和 APNs 服務器維持一個基於 TCP 的長鏈接,APNs 服務器將新消息推送到iOS 設備上,而後在設備屏幕上顯示出推送的消息。網絡

設備註冊APNs的流程圖:app

1.2222.png

上圖完成了以下步驟:iphone

1.Device(設備)鏈接APNs服務器並攜帶設備序列號(UUID)ide

2.鏈接成功,APNs通過打包和處理產生devicetoken並返回給註冊的Device(設備)工具

3.Device(設備)攜帶獲取的devicetoken發送到咱們本身的應用服務器測試

4.完成須要被推送的Device(設備)在APNs服務器和咱們本身的應用服務器的註冊網站

推送過程圖:

1.333.png

推送的過程通過以下步驟:

1.首先,咱們的設備安裝了具備推送功能的應用(應用程序要用代碼註冊消息推進),咱們的 iOS設備在有網絡的狀況下會鏈接APNs推送服務器,鏈接過程當中,APNS 服務器會驗證devicetoken,鏈接成功後維持一個基於TCP 的長鏈接;

2.Provider(咱們本身的應用服務器)收到須要被推送的消息並結合被推送的 iOS設備的devicetoken一塊兒打包發送給APNS服務器;

3.APNS服務器將推送信息推送給指定devicetoken的iOS設備;

4.iOS設備收到推送消息後通知咱們的應用程序並顯示和提示用戶(聲音、彈出框)

比較直觀的流程圖:

1.33.png

信息包結構圖:

1.2323.png

上圖顯示的這個消息體就是咱們的應用服務器(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)的請求文件

在應用程序裏的使用工具中找到鑰匙串訪問,選擇從證書頒發機構請求證書

1.45.png

1.44.png

注意:郵箱地址,填本身的開發者帳號,經常使用名,隨便填一個記住就行。而後選擇存儲到磁盤。繼續就行。

1.55.png

保存位置在 tingyun(指定本身的文件夾,這裏我選擇的是個人文件夾),點擊存儲

而後點擊完成後咱們會在 tingyun 裏看到一個CertificateSigningRequest.certSigningRequest的請求文件,也就是咱們說的CSR文件。在咱們生成CSR文件的同時,會在鑰匙串訪問中生成一對祕鑰,名稱爲剛纔咱們填寫的經常使用名

2.配置AppID

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

點擊Account 

1.56.png

選擇 Certificates,identifiers&Profiles 

1.78.png

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

1.888.png

Name: 填寫 App 的名字就行

App ID Suffix 選擇不用通配符的及 Explicit App ID

Bundle ID:填寫本身應用的 Bundle ID 必定要和本身應用的一致.

1.555.png

在下面的 App Services 中選擇本身須要的服務

咱們須要推送服務,因此在Push Notifications上打勾

而後點擊continue

1.666.png

3.建立證書

證書須要建立兩種,一種是開發的、一種是發佈的,開發的是作測試用的。

選擇Development 點擊右上角的+號,建立證書,咱們首先建立開發證書

1.99.png

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

1.00.png

這兒的 App ID 選擇咱們剛纔建立的 App ID

而後點擊下一步,下一步

0.09.png

這兒點擊 Choose File,選擇咱們剛纔建立的 CSR 文件.

而後點擊生成(Generate)

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

0.08.png 

發佈證書的建立和開發證書同樣,選擇Production->Apple Push Notification service SSL (Production)後面和開發證書同樣

0.07.png

0.9888.png

4.添加 Devices:

首先選中你要添加哪一種設備,而後在左上角點擊「+」號。

0.006.png 

Name 填寫一個設備名字。

UDID 填寫本身須要加入測試的設備的 UDID。

而後點擊下一步

0.005.png

而後點擊 Register 便可

0.001.png 

點擊Done。

0.002.png 

000.png

5.查找設備的 UDID:

用本身的 iOS 設備鏈接到電腦上,打開 iTunes。

在設備摘要處能夠看見一個序列號,點擊序列號就會變成 UDID。

0091.png 

6.生成配置文件

配置文件也有兩種,一種是開發的,一種是發佈的,開發的使咱們作測試須要的,發佈的是咱們在 Appstore 上發佈時須要的,咱們都須要生成。

咱們先生成開發配置文件,選擇Provisioning Profiles->Development點擊右上角的+號。

0092.png 

選擇iOS App Development 點擊下一步

0093.png

這兒的 App ID 仍然選擇咱們剛纔建立的 App ID

0094.png

0095.png 

這兒選擇咱們開發者的證書,若是不知道是哪一個選擇所有便可

0096.png 

這兒選擇咱們的測試設備,若是沒有則在前面的Devices裏面添加便可

0097.png 

0098.png

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

1123.png 

發佈配置文件和開發配置文件同樣建立,選擇Distribution->Ad Hoc便可,後面與發佈配置文件同樣。

1125.png 

1126.png 

11250.png

證書配置完成,打開咱們建立的應用項目

打開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 包

服務器端的證書生成方式:

打開咱們前面下載的證書,在鑰匙串中找到它

0.98888.png 

點擊鼠標右鍵選擇導出

0.998.png 

導出後綴爲.p12的文件保存到本身的電腦上,須要輸入一個密碼,在 Java 服務器端要用到

0.9889.png 

Java服務器端須要的 Jar 包

0.87.png

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!");
                 }

}

 

 

 

原文連接:http://blog.tingyun.com/web/article/detail/571

相關文章
相關標籤/搜索