iOS推送通知

極光推送:

1.JPush當前版本是1.8.2,其SDK的開發除了正常的功能完善和擴展外也緊隨蘋果官方的步伐,SDK在iOS8剛推出的時候跟進更新。在一定程度上來講,能夠體現極光推送的技術力量是比較強大的;

2.應用內消息提高了推送服務的及時性和可靠性,在、緊隨當下追求應用實時性的潮流,能夠提供更好的推送服務的用戶體驗;

3.JPush除了有著完善的控制臺外,還提供了服務端的接口,方便開發者的服務器調用,方便開發者對于應用管理、整合即通過應用服務器極光服務器推送服務器用戶設備,簡化了服務器端的開發強度,也方便運營期間發送推送消息的流程;

4.如果開發者同時需要用戶統計和推送功能,那么這是一款不容錯過的SDK因為JPush提供了全面直觀的統計數據,在控制臺中以圖表的形式呈現,方便運營期間的數據分析;

5.當前版本的SDK僅有5M左右的體積,嵌入應用或者打包應用影響都是很小的,開發者大可不必擔心。

6.對于高級用戶還開放了富媒體推送和更多的API調用次數,當然這也需要開發者付出一定的費用,對于有需要的開發者可以自行了解。

綜合評價:

筆者在測試極光推送之前也測試過其他的推送服務,在項目中使用的也是極光推送。對比這些推送服務來講,極光是從文檔、SDK簡潔程度、集成難度、服務都較為滿意的。在筆者的應用中有需要統計用戶行為的需求,而極光也恰恰滿足了這種需求,帶來了極大的方便。總而言之,極光推送確實能給開發者帶來不錯的編程體驗。

通過筆者的測試,極光SDK的集成難度不大,文檔注釋清晰易懂。而且有較為強大的技術支持(QQ群、論壇、博客)。所以對于有一定開發經驗的需要使用推送服務、本地推送服務、推送統計的開發者是非常適用的,而即使是對推送要求不高的項目,極光SDK的開發成本也并不是很高,所以具有較為寬泛的適用范圍。

極光推送是推送服務商中較大的一個,目前的用戶量也相當龐大,其文檔、注釋、網站控制臺都較為完善。極光SDK對推送服務進行高級封裝,除了實現APNS推送以外還實現了基于TCP連接的應用內消息,在一定程度上提高了推送服務的可靠性。其SDK非常簡潔,簡化了集成過程,而通過閱讀API的注釋及相關文檔,開發者可以很快的掌握SDK的使用。對于有一定開發經驗的開發者是非常易于上手的

高送達率,時效保證:極光推送自主協議確認推送消息的送達。開發者可以靈活的自定義推送時間

服務集成SDK簡單:簡單復制便可直接編譯運行

推送內容多樣性服務:除了通知,還有消息、多媒體等

使你的應用程序保持高注意力:即使用戶沒有打開應用程序,極光推送也能夠推送通知到達用戶手機

自定義消息內容:JPushSDK把內容完全轉給應用程序,由開發者應用程序去處理自定義消息

接入即可用功能:客戶端集成SDK即可享受高效?專業的推送服務,操作簡單的管理后臺

多平臺:同時支持?Android與iOS平臺

高安全性:傳輸信道加密,推送數據自主加密

高穩定性,大容量,高并發:目前極光推送平臺支持?十億級用戶,高達20萬/秒的下行速度

省流量,低耗電功能強大:待機流量消耗20K/天,電?量消耗30mAh/天? 畢竟國外網絡服務在中國都頗為不完善,而且推送服務對網絡和服務器端有較高的要求。因此,國內很快就興起數家像極光推送云消息推送服務的公司,是國內做得較好的一家。

優勢:

1)? ?開放注冊,免費向所有的開發者開放使用

2)SDK流量電量消耗很少

3)集成簡單,很快就能夠集成跑起來

4)服務器端推送支持大并發量、延遲小

友盟推送:

1.推送形式多樣:開發者可以在網頁設置或者采用API接入方式進行消息推送,并可以選擇文本消息、應用更新以及json式消息,滿足開發者不同場景下的運營需求。

2.用戶分組靈活:開發者可以使用多個預置條件或者自定義的用戶標簽把用戶分組,對每個分組的用戶推送更有針對性的消息,滿足開發者定向推送的需求。

3.設備能耗極低:SDK中采用了先進的長鏈接多路復用以及其他優化方案,將用戶設備的電量和流量消耗控制在最低水平,確保用戶體驗最優。

4.建立與用戶直接溝通的通道:不論是新品上架還是精彩活動舉行,都可以實時的推送到用戶設備,讓用戶第一時間獲取到相關信息。適時而準確的消息推送,可以大幅度提升用戶的活躍度和忠誠度。

功能特色

用戶分群推送

開發者可以使用多個預置條件或者自定義的用戶標簽把用戶分群,對每個用戶群的用戶推送更有針對性的消息,滿足開發者定向推送的需求。

接入方式靈活

開發者可以通過網站WEB界面或者API接入方式進行消息推送,且支持開發者提交已分群的用戶ID到友盟服務器進行消息推送,滿足開發者不同場景下的運營需求。

服務質量高

實現了同一設備多應用共享一個長連接、智能心跳等優化方案。消息發送速度快,長連接穩定,設備能耗低。

優點:

友盟推送的SDK包很小,集成的時候不需要導入其它庫,集成后對應用影響很小,使用方便;

在網站的應用信息中,可以看到推送的歷史記錄:包括發送總數、用戶打開數、打開率等等,方便統計

友盟推送集成是最簡單,使用也最方便,推送的渠道也是多樣的。

缺點:

但是在同網絡環境下,友盟的推送速度卻是比不上極光推送的。而服務器端的api使用不太方便,需要設置一個服務器IP地址才能使用。自定義的字數最多只有1500字

百度推送:

1.Push 服務

Push 服務初始化及綁定

Push 服務解除綁定

2.Tag 管理

創建 tag

刪除 tag

列出 tag

3.通知推送

4.推送效果反饋

百度有延遲,推送不穩定,不人性化,很多也只是為了服務百度系的公司來用。到達率存在問題。開發者網站不是非常用戶友好。

百度推送,推送Android還行,在推送ios時推送內容有限制,官方說是不能大于4k,但是實際推送的內容80個漢字以上就不行,推送不了。

優點:

1.1、 推送及時,支持推送通知、穿透消息推送、富媒體消息推送。

1.2、 提供常見問題解答。

1.3、 提供客服支持。

缺點:

1.1、 與其他推送平臺相比官網沒有詳細的開發文檔,不方便開發者查閱。

1.2、 與其他推送平臺相比,集成困難。

建議:在官網放一份詳細的開發文檔,方便開發者查閱和集成。

iOS推送簡介:

在移動應用中,推送已經成為不可缺少的重要功能。本文檔主要介紹有關 iOS 推送的基礎知識,并從幾個典型問題出發,分析如何解決在實現推送中出現的一些問題。

1.1 本地通知和遠程通知簡介

在 iOS 設備上(模擬器無法使用推送),系統收到通知后這樣處理:

在屏幕上彈出一些選項,或者在屏幕頂部顯示橫幅(banner)如下圖左

App 的角標數值發生變化,具體表現為 App icon 右上角的小紅點及數字,如郵件中的紅點

伴隨推送消息的提示聲音

當應用處于前臺運行時,系統是不會在屏幕上顯示通知,但是仍會調用相應的 API。

只有真機可以使用推送功能。

用戶可以設置每一個 App 的通知權限,如下圖最后一個:


用戶可以選擇關閉某個應用的推送功能。還可以設置通知是否在通知中心顯示、通知到達時是否發出聲音、通知能否改變 App 角標以及鎖屏時是否顯示該 App 的通知,還可以設置通知到達時的提醒樣式。當然,這些都可以分別對每一個應用進行單獨設置。

1.1.1 本地通知

本地通知是一種基于時間的提醒方式。

本地通知最多向系統注冊 64 個,當超過這個數量后,最早注冊的本地通知會被丟棄。

本地通知在 iOS 設備上的顯示與遠程推送通知一樣。

1.1.2 遠程通知

iOS App 運行在后臺時,無法主動進行網絡連接。

遠程通知可以用來提醒用戶。發送遠程通知時,服務器首先需要使用推送證書與 APNs(Apple Push Notification service)建立安全連接,然后將消息傳遞給它。當 APNs 收到消息后,會通過與手機之間的長連接下發到對應的手機上,然后 iOS 彈出這條消息來提醒用戶。

用戶看通過點擊或滑動通知來運行 App。可通過程序中相應的方法可以獲取通知信息,然后做相應的邏輯處理。

如果不是通過通知啟動 App,那么無法在程序中獲取通知信息。例如通過點擊應用圖標啟動 App。

推送通知都包含 Payload:一個 Apple 已經定義好的屬性列表,操作系統根據它決定使用哪一種方式來提醒用戶。還可以在 Payload 中加入一些自定義數據。

通知并不能一定到達。如果在用戶無法收到推送通知時(關機或網絡不可用),這種情況下 APNs 收到了多條發往這臺設備的通知,那么只會保留最后一條,最早的會被丟棄。

APNs 首先通過移動蜂窩網絡發送通知,只有當移動蜂窩網絡不可用時才使用 Wi-Fi。

1.2 通知的兩種推送環境

在使用 iOS 遠程推送功能時,有兩種不同的環境。開發環境(Development)以及生產環境(Production)。

App 當前使用的推送環境與 Xcode - Build Settings - Code Signing - Provisioning Profile 文件的模式一致。

1.2.1 證書與證書校驗

與 APNs 之間是加密的連接,因此需要使用證書來加密連接。每個的推送環境有自己單獨的推送證書,即開發證書和生產證書。

在將證書最終轉為 pem 格式后,可通過與 APNs 連接來測試證書是否有效。

開發環境:

openssl s_client -connectgateway.sandbox.push.apple.com:2195-cert MyApnsDev.pem

生產環境:

openssl s_client -connectgateway.push.apple.com:2195-cert MyApnsPro.pem

當輸入完命令回車后,終端首先會輸出很多相關信息。

當連接建立失敗時,會直接 close 掉。

當連接建立成功時,終端會停止輸出,并等待你輸入,你可以隨便輸入一些字符后摁回車,然后連接才會關閉。

以上命令在 Mac 下沒有問題,在其他操作系統下需要指定服務器當前的 CA 根證書,具體可以從網站上下載:

entrust_2048_ca.cer 下載

下載完成之后,在以上命令后面加上 -CAfile entrust2048ca.cer 即可

1.2.2 DeviceToken

通知需推送到具體某一臺設備,而 DeviceToken 就是這臺設備的標識符。在向 APNs 發送推送通知時,需要使用 DeviceToken 來指定這條通知將要到達的設備 。

每一臺設備,不同的推送環境下分別有一個 DeviceToken。即 DeviceToken 也分開發環境和生產環境。

應用在向 APNs 注冊推送通知時,會根據當前 Xcode 工程中 target 對應的 Provisioning Profile 決定請求對應環境的 DeviceToken。即系統返回的 DeviceToken 其環境與 Provisioning Profile 的環境對應。

一般在使用 Xcode 開發時,Provisioning Profile 為 Development ,因此獲取的 DeviceToken 也是開發模式。

在 App 需要打包為 ipa 文件或者需要上傳到 AppStore 時,會將 Provisioning Profile 文件修改為 Distribution,這時獲取到的 DeviceToken 是生產模式。

1.3 在應用程序中注冊遠程推送功能

App 必須要向 APNs 請求注冊以實現推送功能,在請求成功后,APNs 會返回一個設備的標識符即 DeviceToken 給 App,服務器在推送通知的時候需要指定推送通知目的設備的 DeviceToken。在 iOS 8 以及之后,注冊推送服務主要分為四個步驟:

使用registerUserNotificationSettings:注冊應用程序想要支持的推送類型

通過調用registerForRemoteNotifications方法向 APNs 注冊推送功能

請求成功時,系統會在應用程序委托方法中返回 DeviceToken,請求失敗時,也會在對應的委托方法中給出請求失敗的原因。

將 DeviceToken 上傳到服務器,服務器在推送時使用。

上述第一個步驟注冊的 API 是 iOS 8 新增的,因此在 iOS 7,前兩個步驟需更改為 iOS 7 中的 API。

DeviceToken 有可能會更改,因此需要在程序每次啟動時都去注冊并且上傳到你的服務器端。

注意:iOS 設備與 APNs 需要建立一條長連接,之后的推送注冊以及推送獲取都需要通過這條長連接。

當 iOS 設備無網絡可用時,在向 APNs 請求注冊后,既不會有注冊成功的回調,也不會有注冊失敗的回調。如果發生這種情況,需要檢查設備的網絡連接。

開發環境和生產環境建立不同的長連接,且設備上要至少有一個開發環境的 App 并且注冊推送,才會建立開發環境下的長連接。

當已經注冊過推送服務后,以后系統會立刻返回給你 DeviceToken。還有一點是,返回 DeviceToken 的回調方法并不一定是只有在你注冊或者再次注冊時才被系統調用,當DeviceToken 改變時也會被系統直接調用。

1.4 在程序中處理通知

我們來看一下當系統傳遞本地或遠程通知的時候都有哪些情況。

通知到達時,應用不在前臺

這種情況下,操作系統將呈現通知,彈出一個選項或者在屏幕上部顯示 banner 提醒,給 App 角標設置對應的數字,可能播放提示音,當用戶稍微往下滑動通知時顯示更多的 action 按鈕(如果有設置)。

通知到達時,應用在前臺運行

這種情況下,不會彈出 banner。系統會根據當前的通知是本地通知還是遠程通知,調用不同的方法,并且在方法中傳遞通知的 Payload 數據。

在 iOS8 的通知中,用戶點擊通知上的自定義 action 按鈕進入應用。

這種情況下,系統會調用 iOS8 中對 action 按鈕新增的處理方法。

用戶點擊通知進入應用。

系統會根據當前的通知是本地通知還是遠程通知,調用不同的方法,并且在方法中傳遞通知的 Payload 數據。

注意:只有當通過通知進入到 App 時,才可以獲取到通知信息。

1.4.1 自定義通知提示音

你可以在 App 的 Bundle 中加入一段自定義提示音文件。然后當通知到達時可以指定播放這個文件。必須為以下幾種數據格式:

Linear PCM

MA4(IMA/ADPCM)

μLaw

aLaw

你可以將它們打包為aiff、wav或caf文件。自定義的聲音文件時間必須小于 30 秒,如果超過了這個時間,將被系統聲音代替。

1.4.2 Payload

Payload 是通知的一部分,每一條推送通知都包含一個 Payload。它包含了系統提醒用戶通知到達的方式,還可以添加自定義的數據。即通知主要傳遞的數據為 Payload。

Payload 本身為 JSON 格式的字符串,它內部必須要包含一個鍵為aps的字典。aps 中可以包含以下字段中的一個或多個:

alert:其內容可以為字符串或者字典,如果是字符串,那么將會在通知中顯示這條內容

badge:其值為數字,表示當通知到達設備時,應用的角標變為多少。如果沒有使用這個字段,那么應用的角標將不會改變。設置為 0 時,會清除應用的角標。

sound:指定通知展現時伴隨的提醒音文件名。如果找不到指定的文件或者值為 default,那么默認的系統音將會被使用。如果為空,那么將沒有聲音。

content-available:此字段為 iOS 7 silent remote notification 使用。不使用此功能時無需包含此字段。

推送通知跟NSNotification有所區別:

1> NSNotification是抽象的,不可見的

2> 推送通知是可見的(能用肉眼看到)

iOS中提供了2種推送通知: 本地推送通知, 遠程推送通知

1> 本地推送通知(Local Notification)

2> 遠程推送通知(Remote Notification)

推送通知可以不讓在前臺運行的app,告知app內部發生了什么變化,比如:有新的內容,新消息等.

推送通知的使用:

發出推送通知時,如果當前程序正運行在前臺,那么推送通知就不會被呈現出來

點擊推送通知后,默認會自動打開發出推送通知的app

不管app打開還是關閉,推送通知都能如期發出

推送通知有5種呈現效果:

1. 在屏幕頂部顯示一塊橫幅(顯示具體內容)

2. 在屏幕中間彈出一個UIAlertView(顯示具體內容,使用較少)

3. 在鎖屏界面顯示一塊橫幅(鎖屏狀態下,顯示具體內容)

4. 播放音效(提醒作用)

5. 更新app圖標的數字(說明新內容的數量)

推送通知分為本地推送通知和遠程推送通知,下面一一介紹.

本地推送通知

本地推送通知不需要服務器的支持,不需要聯網就可以發送通知.通常本地推送通知用于定時提醒用戶,比如清理垃圾,淘寶購物,紀念日提醒等任務.

在蘋果官方給出了本地推送通知的一些屬性,以及使用.

屬性介紹:

@property(nonatomic,copy)NSDate *fireDate;// 設置本地推送的時間@property(nonatomic,copy) NSTimeZone *timeZone;// 時區(一般設置為[NSTimeZone defaultTimeZone] ,跟隨手機的時區)@property(nonatomic) NSCalendarUnit repeatInterval;// 沒隔多久重復發出一次@property(nonatomic,copy)NSCalendar *repeatCalendar;// 設置日期@property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);// 比如某一個區域的時候發出通知@property(nonatomic,assign)BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);// 進入區域是否重復@property(nonatomic,copy)NSDictionary *userInfo;// 附加的額外信息@property(nonatomic,copy)NSString *alertBody;// 消息的內容@property(nonatomic)BOOL hasAction;// 是否顯示alertAction的文字(默認是YES)@property(nonatomic,copy)NSString *alertAction;// 設置鎖屏狀態下,顯示的一個文字@property(nonatomic,copy)NSString *alertLaunchImage;// 啟動圖片@property(nonatomic,copy)NSString *soundName;//? UILocalNotificationDefaultSoundName@property(nonatomic)NSInteger applicationIconBadgeNumber;// 應用圖標右上角的提醒數字@property(nonatomic,copy)NSArray *scheduledLocalNotifications;// 獲得被調度(定制)的所有本地推送通知(已經發出且過期的推送通知就算調度結束,會自動從這個數組中移除)

使用方法:

創建本地通知

UILocalNotification *localNoti = [[UILocalNotification alloc] init];

調度本地推送通知(調度完畢后,推送通知會在特地時間fireDate發出)

[[UIApplication sharedApplication]scheduleLocalNotification:localNoti];取消調度本地推送通知

-(void)cancelLocalNotification:(UILocalNotification *)notification;-(void)cancelAllLocalNotifications;

立即發出本地推送通知

-(void)presentLocalNotificationNow:(UILocalNotification *)notification;

注意:

iOS8.0以后在本地推送通知上新加了一些新功能,為了用戶體驗,以及更加人性化,如果要使用本地通知,需要得到用戶的許可.

需要在AppDelegate中添加如下代碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/*? ? UIUserNotificationTypeNone? ? = 0,? ? ? 沒有,沒有本地通知? ? UIUserNotificationTypeBadge? = 1 << 0, 接受圖標右上角提醒數字? ? UIUserNotificationTypeSound? = 1 << 1, 接受通知時候,可以發出音效? ? UIUserNotificationTypeAlert? = 1 << 2, 接受提醒(橫幅/彈窗)? ? */// iOS8需要添加請求用戶的授權if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {? ? ? ? UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];

[application registerUserNotificationSettings:settings];

}

}

點擊本地推送通知

當用戶點擊本地推送通知,會自動打開app,這里有2種情況

1> app并沒有關閉,一直隱藏在后臺(運行在后臺)

讓app進入前臺,并會調用AppDelegate的下面方法(并非重新啟動app)

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

1

1

2> app已經被關閉(進程已死)

啟動app,啟動完畢會調用AppDelegate的下面方法

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

launchOptions參數通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象

若要實現界面的跳轉,需要分清當前應用程序的所處狀態,進行判斷:

1> 若是當前應用在后臺運行,接收到通知時,要想進行界面的跳轉,可以在didReceiveLocalNotification:方法中實現跳轉界面的方法

2> 若是當前的應用程序已經關閉,我們在前面說到,當應用關閉,推送通知也會如期發送.但此時,是不會走didReceiveLocalNotification:方法的,那我們只有didFinishLaunchingWithOptions:方法利用,launchOptions參數通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象,實現跳轉的功能.

下面是演示代碼:

#import"AppDelegate.h"@interfaceAppDelegate ()@end@implementationAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/*? ? UIUserNotificationTypeNone? ? = 0,? ? ? 沒有,沒有本地通知? ? UIUserNotificationTypeBadge? = 1 << 0, 接受圖標右上角提醒數字? ? UIUserNotificationTypeSound? = 1 << 1, 接受通知時候,可以發出音效? ? UIUserNotificationTypeAlert? = 1 << 2, 接受提醒(橫幅/彈窗)? ? */// iOS8需要添加請求用戶的授權if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {? ? ? ? UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];? ? ? ? [application registerUserNotificationSettings:settings];? ? }if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {// 跳轉界面? ? }returnYES;}/** *? 如果應用在后臺,通過點擊通知的時候打開應用會來到該代理方法 *? 如果應用在前臺,接受到本地通知就會調用該方法 * *? @param notification 通過哪一個通知來這里 */- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{if (application.applicationState == UIApplicationStateActive)return;if (application.applicationState == UIApplicationStateInactive) {// 實現跳轉? ? }}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{returnYES;}#import"ViewController.h"

@interfaceViewController ()// 點擊按鈕之后添加通知- (IBAction)addLocalNote;@end@implementationViewController- (void)viewDidLoad {? ? [super viewDidLoad];? ? [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];}- (IBAction)addLocalNote {// 1.創建本地通知UILocalNotification *localNote = [[UILocalNotification alloc] init];// 設置什么時間彈出? ? localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];// 設置彈出的內容? ? localNote.alertBody = @"您有新消息";// 設置鎖屏狀態下,顯示的一個文字? ? localNote.alertAction = @"快點打開";// 是否顯示alertAction的文字(默認是YES)? ? localNote.hasAction =YES;// 設置音效? ? localNote.soundName = UILocalNotificationDefaultSoundName;// 應用圖標右上角的提醒數字? ? localNote.applicationIconBadgeNumber =1;// 設置UserInfo來傳遞信息? ? localNote.userInfo = @{@"alertBody" : localNote.alertBody, @"applicationIconBadgeNumber" : @(localNote.applicationIconBadgeNumber)};// 2.調度通知? ? [[UIApplication sharedApplication] scheduleLocalNotification:localNote];

}

遠程推送通知

遠程推送通知:就是通過網絡從遠程服務器推送給客戶端的通知.

為什么需要遠程推送通知?

傳統獲取數據的局限性

只要用戶關閉了app,就無法跟app的服務器溝通,無法從服務器上獲得最新的數據內容

遠程推送通知可以解決以上問題

不管用戶打開還是關閉app,只要聯網了,都能接收到服務器推送的遠程通知

遠程推送通知的使用

所有的蘋果設備,在聯網狀態下,都會與蘋果的服務器建立長連接

長連接: 只要聯網了,就一直建立連接

長連接的作用: 時間校準, 系統升級, 查找我的iPhone

長連接的好處 : 數據傳輸速度快 , 數據保持最新狀態

遠程推送功能機制

蘋果給iOS和Mac添加了消息推送的功能,使得我們可以通過后臺服務器給應用程序(APP)發送消息,不管APP是否正在使用,比如郵箱的來件提示功能。這項服務被稱為Apple Push Notification service(APNs)。里面一共涉及到四個角色:APP、設備、APNs和應用后臺服務器(Provider),其中APP、后臺服務器和APNs之間使用deviceToken唯一的標識一個用戶。


推送服務的工作流程:

APP向系統注冊推送服務。

設備從APNs請求deviceToken。

通過代理方法將deviceToken返回給APP。

APP將deviceToken發送給應用后臺服務器(Provider)。

應用后臺服務器保存deviceToken,然后在需要推送通知的時候,給APNs發送信息,使用deviceToken標識所要送達的客戶端。

APNs將后臺服務器發過來的數據推送到設備。

設備將消息分發給應用程序。

在使用推送功能的時候,需要在開發者中心創建支持Push Notification的證書,并且將證書和私鑰用于應用后臺服務器與APNs之間通信。

我也寫了一個比較易懂的遠程推送流程圖!http://blog.csdn.net/ismilesky/article/details/48324723

遠程推送近年來,都是通過第三方進行實現,因為第三方推送的功能比較強大.

推送平臺: 百度推送 , 極光推送, 騰訊信鴿推送, 個推

遠程推送我們這里以極光推送(第三方)為例,進行測試.

極光遠程推送的使用

如要使用極光第三方遠程推送,我們需要集成iOS SDK,需要進行應用的配置,和環境配置.在開發者中心有

developer.apple.com開發者賬號 , iOS真機(iPhone、iPad、iPod)等。

遠程推送應用配置過程:

創建支持遠程推送功能的App ID

申請開發者證書,并選中剛剛創建的App ID

下載CER文件,并導入鑰匙串管理

申請發布證書,并選中剛剛創建的App ID

下載CER文件,并導入鑰匙串管理

檢查App ID,確認證書已經指定

這些相關配置極光推送已經給了非常詳細的文檔資料, iOS SDK集成指南 :http://docs.jpush.io/guideline/ios_guide/, iOS SDK調試指南 :http://docs.jpush.io/client/ios_tutorials/#ios-sdk, 只需要按照流程進行就可以.

實現代碼:

#define kDeviceVersion? ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)#import"AppDelegate.h"#import"APService.h"@interfaceAppDelegate ()@end@implementationAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1if (kDeviceVersion) {//可以添加自定義categories? ? ? ? [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert) categories:nil];? ? }else {//categories 必須為nil? ? ? ? [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil];? ? }#else//categories 必須為nil? ? [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil];#endif? ? [APService setupWithOption:launchOptions];returnYES;}#pragma mark - 獲取device token (必須實現)// 當得到蘋果的APNs服務器返回的DeviceToken就會被調用- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{NSLog(@"%@",deviceToken);// Required? ? [APService registerDeviceToken:deviceToken];}#pragma mark - 獲取device token失敗- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{NSLog(@"function == %s? line == %d? error == %@",__FUNCTION__,__LINE__,error);}// 接收到遠程通知,觸發方法和本地通知一致 (必須實現)- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {// Required? ? [APService handleRemoteNotification:userInfo];}#pragma mark - 使用后臺的遠程消息推送 (必須實現)/** 1> 在Capabilities中打開遠程推送通知 2> 實現該代理方法遠程消息數據格式: {"aps" : {"content-available" : 1},"content-id" : 42} 執行completionHandler有兩個目的 1> 系統會估量App消耗的電量,并根據傳遞的UIBackgroundFetchResult 參數記錄新數據是否可用 2> 調用完成的處理代碼時,應用的界面縮略圖會自動更新 注意:接收到遠程通知到執行完網絡請求之間的時間不能超過30秒 if (userInfo) { int contentId = [userInfo[@"content-id"] intValue]; ViewController *vc = (ViewController *)application.keyWindow.rootViewController; [vc loadDataWithContentID:contentId completion:^(NSArray *dataList) { vc.dataList = dataList; NSLog(@"刷新數據結束"); completionHandler(UIBackgroundFetchResultNewData); }]; } else { completionHandler(UIBackgroundFetchResultNoData); }*/- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {// IOS 7 Support Required? ? [APService handleRemoteNotification:userInfo];? ? [[UIApplication sharedApplication]setApplicationIconBadgeNumber:0];// 判斷應用程序在前臺還是后臺if (application.applicationState == UIApplicationStateActive) {// 活躍狀態// 實現方法? ? }elseif (application.applicationState == UIApplicationStateInactive) {// 不活躍狀態// 實現方法? ? }else {// application.applicationState == UIApplicationStateBackground// 后臺// 實現方法? ? }/** 必須回調 */? ? completionHandler(UIBackgroundFetchResultNewData);}測試時,運行完應用程序,要發送通知,進行推送的測試,真機收到通知才算成功.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,250評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,923評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,041評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,475評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,253評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,801評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,882評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,023評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,530評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,494評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,639評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,177評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,890評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,289評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,552評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,242評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,626評論 2 370

推薦閱讀更多精彩內容

  • 作品鏈接:http://www.lxweimin.com/users/1e0f5e6f73f6/top_articl...
    打電話記錯號碼的人閱讀 661評論 0 4
  • 推送通知注意:這里說的推送通知跟NSNotification有所區別NSNotification是抽象的,不可見的...
    醉葉惜秋閱讀 1,526評論 0 3
  • 推送通知 注意:這里說的推送通知跟NSNotification有所區別 NSNotification是抽象的,不可...
    iOS開發攻城獅閱讀 4,267評論 1 13
  • 今早莫名的醒的很早,明明昨天累的腰酸背痛。正好今天也和玲狗約了出門游蕩。 雖然作為女生真的好嫌棄女生出門要磨很久這...
    仙貝還是雪餅閱讀 206評論 0 1
  • 說來奇怪 漸漸的我發現我從一個典型的射手座變成了一個 不會射箭的射手。 想起以前總是幾個女生堆在一起嘰嘰喳喳的討論...
    未愈Q閱讀 456評論 0 1