iOS實現(xiàn)遠(yuǎn)程推送原理及過程
推送通知,是現(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的流程圖:
上圖完成了如下步驟:
1.Device(設(shè)備)連接APNs服務(wù)器并攜帶設(shè)備序列號(UUID)
2.連接成功,APNs經(jīng)過打包和處理產(chǎn)生devicetoken并返回給注冊的Device(設(shè)備)
3.Device(設(shè)備)攜帶獲取的devicetoken發(fā)送到我們自己的應(yīng)用服務(wù)器
4.完成需要被推送的Device(設(shè)備)在APNs服務(wù)器和我們自己的應(yīng)用服務(wù)器的注冊
推送過程圖:
推送的過程經(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)圖:
上圖顯示的這個消息體就是我們的應(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)請求證書
注意:郵箱地址,填自己的開發(fā)者賬號,常用名,隨便填一個記住就行。然后選擇存儲到磁盤。繼續(xù)就行。
保存位置在 tingyun(指定自己的文件夾,這里我選擇的是我的文件夾),點擊存儲
然后點擊完成后我們會在 tingyun 里看到一個CertificateSigningRequest.certSigningRequest的請求文件,也就是我們說的CSR文件。在我們生成CSR文件的同時,會在鑰匙串訪問中生成一對秘鑰,名稱為剛才我們填寫的常用名
2.配置AppID
到蘋果開發(fā)者網(wǎng)站https://developer.apple.com
點擊Account
選擇 Certificates,identifiers&Profiles
選擇 Identifiers ->App IDs 點擊上方的+號創(chuàng)建一個 App ID.
Name: 填寫 App 的名字就行
App ID Suffix 選擇不用通配符的及 Explicit App ID
Bundle ID:填寫自己應(yīng)用的 Bundle ID 一定要和自己應(yīng)用的一致.
在下面的 App Services 中選擇自己需要的服務(wù)
我們需要推送服務(wù),所以在Push Notifications上打勾
然后點擊continue
3.創(chuàng)建證書
證書需要創(chuàng)建兩種,一種是開發(fā)的、一種是發(fā)布的,開發(fā)的是做測試用的。
選擇Development 點擊右上角的+號,創(chuàng)建證書,我們首先創(chuàng)建開發(fā)證書
選擇Apple Push Notification service SSL (Sandbox),創(chuàng)建推送服務(wù)證書點擊下一步
這兒的 App ID 選擇我們剛才創(chuàng)建的 App ID
然后點擊下一步,下一步
這兒點擊 Choose File,選擇我們剛才創(chuàng)建的 CSR 文件.
然后點擊生成(Generate)
最后點擊下載,下載證書。將下載的證書,放到指定位置。
發(fā)布證書的創(chuàng)建和開發(fā)證書一樣,選擇Production->Apple Push Notification service SSL (Production)后面和開發(fā)證書一樣
4.添加 Devices:
首先選中你要添加哪種設(shè)備,然后在左上角點擊“+”號。
Name 填寫一個設(shè)備名字。
UDID 填寫自己需要加入測試的設(shè)備的 UDID。
然后點擊下一步
然后點擊 Register 即可
點擊Done。
5.查找設(shè)備的 UDID:
用自己的 iOS 設(shè)備連接到電腦上,打開 iTunes。
在設(shè)備摘要處可以看見一個序列號,點擊序列號就會變成 UDID。
6.生成配置文件
配置文件也有兩種,一種是開發(fā)的,一種是發(fā)布的,開發(fā)的使我們做測試需要的,發(fā)布的是我們在 Appstore 上發(fā)布時需要的,我們都需要生成。
我們先生成開發(fā)配置文件,選擇Provisioning Profiles->Development點擊右上角的+號。
選擇iOS App Development 點擊下一步
這兒的 App ID 仍然選擇我們剛才創(chuàng)建的 App ID
這兒選擇我們開發(fā)者的證書,如果不知道是哪個選擇全部即可
這兒選擇我們的測試設(shè)備,如果沒有則在前面的Devices里面添加即可
隨便取個名字即可,然后下載下來
發(fā)布配置文件和開發(fā)配置文件一樣創(chuàng)建,選擇Distribution->Ad Hoc即可,后面與發(fā)布配置文件一樣。
證書配置完成,打開我們創(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ù)器端的證書生成方式:
打開我們前面下載的證書,在鑰匙串中找到它
點擊鼠標(biāo)右鍵選擇導(dǎo)出
導(dǎo)出后綴為.p12的文件保存到自己的電腦上,需要輸入一個密碼,在 Java 服務(wù)器端要用到
Java服務(wù)器端需要的 Jar 包
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!"); } }
本文已被整理到了《iOS推送教程》,歡迎大家學(xué)習(xí)閱讀。
以上就是完整的iOS遠(yuǎn)程推送原理及實現(xiàn)過程,希望對大家的學(xué)習(xí)有所幫助。
- Nagios遠(yuǎn)程監(jiān)控安裝與配置詳解圖文
- iOS10 適配遠(yuǎn)程推送功能實現(xiàn)代碼
- iOS實現(xiàn)播放遠(yuǎn)程網(wǎng)絡(luò)音樂的核心技術(shù)點總結(jié)
- iOS10最新實現(xiàn)遠(yuǎn)程通知的開發(fā)教程詳解
- iOS開發(fā)之運動事件和遠(yuǎn)程控制
- 詳解iOS本地推送與遠(yuǎn)程推送
- iOS消息遠(yuǎn)程推送通知
- iOS實時監(jiān)控網(wǎng)絡(luò)狀態(tài)的改變
- iOS實現(xiàn)實時檢測網(wǎng)絡(luò)狀態(tài)的示例代碼
- iOS中的實時遠(yuǎn)程配置全紀(jì)錄
相關(guān)文章
淺析iOS中的淺拷貝和深拷貝(copy和mutableCopy)
ios提供了copy和mutablecopy方法,顧名思義,copy就是復(fù)制了一個imutable的對象,而mutablecopy就是復(fù)制了一個mutable的對象。本文給大家介紹iOS中的淺拷貝和深拷貝(copy和mutableCopy) ,感興趣的朋友一起看看吧2016-04-04iOS之點擊通知欄的通知進(jìn)入程序的觸發(fā)事件
本文主要介紹了iOS中點擊通知欄的通知進(jìn)入程序的觸發(fā)事件的相關(guān)知識,具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02iOS?UITextView?實現(xiàn)類似微博的話題、提及用戶效果
這篇文章主要介紹了iOS?UITextView?實現(xiàn)類似微博的話題、提及功能,基本思路是使用正則匹配出成對的#,再利用UITextView的富文本實現(xiàn)高亮效果,需要的朋友可以參考下2022-06-06iOS 10撥打系統(tǒng)電話彈出框延遲出現(xiàn)問題的解決
iOS10的到來,帶來了條幅和鎖屏界面的重新設(shè)計,美觀又好看,再加上抬腕喚醒功能,查看需要的信息確實更便捷了,還能快捷回復(fù)一些通知,十分輕松,但同樣有問題,下面這篇文章主要給大家介紹了關(guān)于iOS 10撥打系統(tǒng)電話彈出框延遲出現(xiàn)問題的解決方法,需要的朋友可以參考下。2017-10-10