極光推送:
1.JPush當(dāng)前版本是1.8.2,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐笤成,SDK在iOS8剛推出的時候跟進(jìn)更新炕泳。在一定程度上來講培遵,能夠體現(xiàn)極光推送的技術(shù)力量是比較強(qiáng)大的;
2.應(yīng)用內(nèi)消息提高了推送服務(wù)的及時性和可靠性皇耗,在郎楼、緊隨當(dāng)下追求應(yīng)用實(shí)時性的潮流箭启,能夠提供更好的推送服務(wù)的用戶體驗(yàn);
3.JPush除了有著完善的控制臺外北救,還提供了服務(wù)端的接口珍策,方便開發(fā)者的服務(wù)器調(diào)用攘宙,方便開發(fā)者對于應(yīng)用管理疗绣、整合即通過應(yīng)用服務(wù)器極光服務(wù)器推送服務(wù)器用戶設(shè)備多矮,簡化了服務(wù)器端的開發(fā)強(qiáng)度,也方便運(yùn)營期間發(fā)送推送消息的流程湾盗;
4.如果開發(fā)者同時需要用戶統(tǒng)計(jì)和推送功能格粪,那么這是一款不容錯過的SDK因?yàn)镴Push提供了全面直觀的統(tǒng)計(jì)數(shù)據(jù)匀借,在控制臺中以圖表的形式呈現(xiàn),方便運(yùn)營期間的數(shù)據(jù)分析瑰艘;
5.當(dāng)前版本的SDK僅有5M左右的體積均蜜,嵌入應(yīng)用或者打包應(yīng)用影響都是很小的囤耳,開發(fā)者大可不必?fù)?dān)心充择。
6.對于高級用戶還開放了富媒體推送和更多的API調(diào)用次數(shù)椎麦,當(dāng)然這也需要開發(fā)者付出一定的費(fèi)用琴儿,對于有需要的開發(fā)者可以自行了解造成。
綜合評價:
筆者在測試極光推送之前也測試過其他的推送服務(wù),在項(xiàng)目中使用的也是極光推送夷磕。對比這些推送服務(wù)來講坐桩,極光是從文檔绵跷、SDK簡潔程度、集成難度净当、服務(wù)都較為滿意的像啼。在筆者的應(yīng)用中有需要統(tǒng)計(jì)用戶行為的需求,而極光也恰恰滿足了這種需求僧诚,帶來了極大的方便湖笨〖缁恚總而言之辫呻,極光推送確實(shí)能給開發(fā)者帶來不錯的編程體驗(yàn)。
通過筆者的測試怖侦,極光SDK的集成難度不大,文檔注釋清晰易懂艳悔。而且有較為強(qiáng)大的技術(shù)支持(QQ群猜年、論壇、博客)杨幼。所以對于有一定開發(fā)經(jīng)驗(yàn)的需要使用推送服務(wù)、本地推送服務(wù)歹撒、推送統(tǒng)計(jì)的開發(fā)者是非常適用的暖夭,而即使是對推送要求不高的項(xiàng)目,極光SDK的開發(fā)成本也并不是很高裕菠,所以具有較為寬泛的適用范圍。
極光推送是推送服務(wù)商中較大的一個闭专,目前的用戶量也相當(dāng)龐大奴潘,其文檔旧烧、注釋、網(wǎng)站控制臺都較為完善画髓。極光SDK對推送服務(wù)進(jìn)行高級封裝掘剪,除了實(shí)現(xiàn)APNS推送以外還實(shí)現(xiàn)了基于TCP連接的應(yīng)用內(nèi)消息奈虾,在一定程度上提高了推送服務(wù)的可靠性。其SDK非常簡潔,簡化了集成過程,而通過閱讀API的注釋及相關(guān)文檔,開發(fā)者可以很快的掌握SDK的使用熙宇。對于有一定開發(fā)經(jīng)驗(yàn)的開發(fā)者是非常易于上手的
高送達(dá)率馆蠕,時效保證:極光推送自主協(xié)議確認(rèn)推送消息的送達(dá)吼渡。開發(fā)者可以靈活的自定義推送時間
服務(wù)集成SDK簡單:簡單復(fù)制便可直接編譯運(yùn)行
推送內(nèi)容多樣性服務(wù):除了通知,還有消息耿戚、多媒體等
使你的應(yīng)用程序保持高注意力:即使用戶沒有打開應(yīng)用程序皂股,極光推送也能夠推送通知到達(dá)用戶手機(jī)
自定義消息內(nèi)容:JPushSDK把內(nèi)容完全轉(zhuǎn)給應(yīng)用程序蘑辑,由開發(fā)者應(yīng)用程序去處理自定義消息
接入即可用功能:客戶端集成SDK即可享受高效?專業(yè)的推送服務(wù)副砍,操作簡單的管理后臺
多平臺:同時支持?Android與iOS平臺
高安全性:傳輸信道加密,推送數(shù)據(jù)自主加密
高穩(wěn)定性谨垃,大容量,高并發(fā):目前極光推送平臺支持?十億級用戶捍掺,高達(dá)20萬/秒的下行速度
省流量不瓶,低耗電功能強(qiáng)大:待機(jī)流量消耗20K/天,電?量消耗30mAh/天? 畢竟國外網(wǎng)絡(luò)服務(wù)在中國都頗為不完善,而且推送服務(wù)對網(wǎng)絡(luò)和服務(wù)器端有較高的要求迈嘹。因此雁刷,國內(nèi)很快就興起數(shù)家像極光推送云消息推送服務(wù)的公司目派,是國內(nèi)做得較好的一家徒河。
優(yōu)勢:
1)? ?開放注冊,免費(fèi)向所有的開發(fā)者開放使用
2)SDK流量電量消耗很少
3)集成簡單淆院,很快就能夠集成跑起來
4)服務(wù)器端推送支持大并發(fā)量、延遲小
友盟推送:
1.推送形式多樣:開發(fā)者可以在網(wǎng)頁設(shè)置或者采用API接入方式進(jìn)行消息推送结洼,并可以選擇文本消息酥艳、應(yīng)用更新以及json式消息,滿足開發(fā)者不同場景下的運(yùn)營需求哄啄。
2.用戶分組靈活:開發(fā)者可以使用多個預(yù)置條件或者自定義的用戶標(biāo)簽把用戶分組,對每個分組的用戶推送更有針對性的消息逸月,滿足開發(fā)者定向推送的需求惜索。
3.設(shè)備能耗極低:SDK中采用了先進(jìn)的長鏈接多路復(fù)用以及其他優(yōu)化方案,將用戶設(shè)備的電量和流量消耗控制在最低水平搀罢,確保用戶體驗(yàn)最優(yōu)枫弟。
4.建立與用戶直接溝通的通道:不論是新品上架還是精彩活動舉行宙攻,都可以實(shí)時的推送到用戶設(shè)備形真,讓用戶第一時間獲取到相關(guān)信息脉课。適時而準(zhǔn)確的消息推送,可以大幅度提升用戶的活躍度和忠誠度蚌吸。
功能特色
用戶分群推送
開發(fā)者可以使用多個預(yù)置條件或者自定義的用戶標(biāo)簽把用戶分群哺眯,對每個用戶群的用戶推送更有針對性的消息盏浙,滿足開發(fā)者定向推送的需求许起。
接入方式靈活
開發(fā)者可以通過網(wǎng)站W(wǎng)EB界面或者API接入方式進(jìn)行消息推送鹿寻,且支持開發(fā)者提交已分群的用戶ID到友盟服務(wù)器進(jìn)行消息推送财搁,滿足開發(fā)者不同場景下的運(yùn)營需求。
服務(wù)質(zhì)量高
實(shí)現(xiàn)了同一設(shè)備多應(yīng)用共享一個長連接铲咨、智能心跳等優(yōu)化方案泉坐。消息發(fā)送速度快壳猜,長連接穩(wěn)定,設(shè)備能耗低壤追。
優(yōu)點(diǎn):
友盟推送的SDK包很小,集成的時候不需要導(dǎo)入其它庫,集成后對應(yīng)用影響很小,使用方便跷敬;
在網(wǎng)站的應(yīng)用信息中间雀,可以看到推送的歷史記錄:包括發(fā)送總數(shù)、用戶打開數(shù)吗购、打開率等等透罢,方便統(tǒng)計(jì)
友盟推送集成是最簡單,使用也最方便,推送的渠道也是多樣的肛著。
缺點(diǎn):
但是在同網(wǎng)絡(luò)環(huán)境下首装,友盟的推送速度卻是比不上極光推送的。而服務(wù)器端的api使用不太方便,需要設(shè)置一個服務(wù)器IP地址才能使用。自定義的字?jǐn)?shù)最多只有1500字
百度推送:
1.Push 服務(wù)
Push 服務(wù)初始化及綁定
Push 服務(wù)解除綁定
2.Tag 管理
創(chuàng)建 tag
刪除 tag
列出 tag
3.通知推送
4.推送效果反饋
百度有延遲,推送不穩(wěn)定采桃,不人性化,很多也只是為了服務(wù)百度系的公司來用。到達(dá)率存在問題。開發(fā)者網(wǎng)站不是非常用戶友好。
百度推送栖秕,推送Android還行,在推送ios時推送內(nèi)容有限制棠耕,官方說是不能大于4k今瀑,但是實(shí)際推送的內(nèi)容80個漢字以上就不行各聘,推送不了。
優(yōu)點(diǎn):
1.1茁帽、 推送及時,支持推送通知、穿透消息推送、富媒體消息推送不脯。
1.2民假、 提供常見問題解答宰衙。
1.3窘疮、 提供客服支持岔乔。
缺點(diǎn):
1.1农渊、 與其他推送平臺相比官網(wǎng)沒有詳細(xì)的開發(fā)文檔患蹂,不方便開發(fā)者查閱。
1.2砸紊、 與其他推送平臺相比传于,集成困難。
建議:在官網(wǎng)放一份詳細(xì)的開發(fā)文檔醉顽,方便開發(fā)者查閱和集成沼溜。
iOS推送簡介:
在移動應(yīng)用中,推送已經(jīng)成為不可缺少的重要功能游添。本文檔主要介紹有關(guān) iOS 推送的基礎(chǔ)知識系草,并從幾個典型問題出發(fā)弹惦,分析如何解決在實(shí)現(xiàn)推送中出現(xiàn)的一些問題。
1.1 本地通知和遠(yuǎn)程通知簡介
在 iOS 設(shè)備上(模擬器無法使用推送)悄但,系統(tǒng)收到通知后這樣處理:
在屏幕上彈出一些選項(xiàng)棠隐,或者在屏幕頂部顯示橫幅(banner)如下圖左
App 的角標(biāo)數(shù)值發(fā)生變化,具體表現(xiàn)為 App icon 右上角的小紅點(diǎn)及數(shù)字檐嚣,如郵件中的紅點(diǎn)
伴隨推送消息的提示聲音
當(dāng)應(yīng)用處于前臺運(yùn)行時助泽,系統(tǒng)是不會在屏幕上顯示通知,但是仍會調(diào)用相應(yīng)的 API嚎京。
只有真機(jī)可以使用推送功能嗡贺。
用戶可以設(shè)置每一個 App 的通知權(quán)限,如下圖最后一個:
用戶可以選擇關(guān)閉某個應(yīng)用的推送功能鞍帝。還可以設(shè)置通知是否在通知中心顯示诫睬、通知到達(dá)時是否發(fā)出聲音、通知能否改變 App 角標(biāo)以及鎖屏?xí)r是否顯示該 App 的通知帕涌,還可以設(shè)置通知到達(dá)時的提醒樣式摄凡。當(dāng)然,這些都可以分別對每一個應(yīng)用進(jìn)行單獨(dú)設(shè)置蚓曼。
1.1.1 本地通知
本地通知是一種基于時間的提醒方式亲澡。
本地通知最多向系統(tǒng)注冊 64 個,當(dāng)超過這個數(shù)量后纫版,最早注冊的本地通知會被丟棄床绪。
本地通知在 iOS 設(shè)備上的顯示與遠(yuǎn)程推送通知一樣。
1.1.2 遠(yuǎn)程通知
iOS App 運(yùn)行在后臺時其弊,無法主動進(jìn)行網(wǎng)絡(luò)連接癞己。
遠(yuǎn)程通知可以用來提醒用戶。發(fā)送遠(yuǎn)程通知時梭伐,服務(wù)器首先需要使用推送證書與 APNs(Apple Push Notification service)建立安全連接痹雅,然后將消息傳遞給它。當(dāng) APNs 收到消息后籽御,會通過與手機(jī)之間的長連接下發(fā)到對應(yīng)的手機(jī)上练慕,然后 iOS 彈出這條消息來提醒用戶。
用戶看通過點(diǎn)擊或滑動通知來運(yùn)行 App技掏×褰可通過程序中相應(yīng)的方法可以獲取通知信息,然后做相應(yīng)的邏輯處理哑梳。
如果不是通過通知啟動 App劲阎,那么無法在程序中獲取通知信息。例如通過點(diǎn)擊應(yīng)用圖標(biāo)啟動 App鸠真。
推送通知都包含 Payload:一個 Apple 已經(jīng)定義好的屬性列表悯仙,操作系統(tǒng)根據(jù)它決定使用哪一種方式來提醒用戶龄毡。還可以在 Payload 中加入一些自定義數(shù)據(jù)。
通知并不能一定到達(dá)锡垄。如果在用戶無法收到推送通知時(關(guān)機(jī)或網(wǎng)絡(luò)不可用)沦零,這種情況下 APNs 收到了多條發(fā)往這臺設(shè)備的通知,那么只會保留最后一條货岭,最早的會被丟棄路操。
APNs 首先通過移動蜂窩網(wǎng)絡(luò)發(fā)送通知,只有當(dāng)移動蜂窩網(wǎng)絡(luò)不可用時才使用 Wi-Fi千贯。
1.2 通知的兩種推送環(huán)境
在使用 iOS 遠(yuǎn)程推送功能時屯仗,有兩種不同的環(huán)境。開發(fā)環(huán)境(Development)以及生產(chǎn)環(huán)境(Production)搔谴。
App 當(dāng)前使用的推送環(huán)境與 Xcode - Build Settings - Code Signing - Provisioning Profile 文件的模式一致魁袜。
1.2.1 證書與證書校驗(yàn)
與 APNs 之間是加密的連接,因此需要使用證書來加密連接敦第。每個的推送環(huán)境有自己單獨(dú)的推送證書峰弹,即開發(fā)證書和生產(chǎn)證書。
在將證書最終轉(zhuǎn)為 pem 格式后申尼,可通過與 APNs 連接來測試證書是否有效垮卓。
開發(fā)環(huán)境:
openssl s_client -connectgateway.sandbox.push.apple.com:2195-cert MyApnsDev.pem
生產(chǎn)環(huán)境:
openssl s_client -connectgateway.push.apple.com:2195-cert MyApnsPro.pem
當(dāng)輸入完命令回車后垫桂,終端首先會輸出很多相關(guān)信息师幕。
當(dāng)連接建立失敗時,會直接 close 掉诬滩。
當(dāng)連接建立成功時霹粥,終端會停止輸出,并等待你輸入疼鸟,你可以隨便輸入一些字符后摁回車后控,然后連接才會關(guān)閉。
以上命令在 Mac 下沒有問題空镜,在其他操作系統(tǒng)下需要指定服務(wù)器當(dāng)前的 CA 根證書浩淘,具體可以從網(wǎng)站上下載:
下載完成之后,在以上命令后面加上 -CAfile entrust2048ca.cer 即可
1.2.2 DeviceToken
通知需推送到具體某一臺設(shè)備吴攒,而 DeviceToken 就是這臺設(shè)備的標(biāo)識符张抄。在向 APNs 發(fā)送推送通知時,需要使用 DeviceToken 來指定這條通知將要到達(dá)的設(shè)備 洼怔。
每一臺設(shè)備署惯,不同的推送環(huán)境下分別有一個 DeviceToken。即 DeviceToken 也分開發(fā)環(huán)境和生產(chǎn)環(huán)境镣隶。
應(yīng)用在向 APNs 注冊推送通知時极谊,會根據(jù)當(dāng)前 Xcode 工程中 target 對應(yīng)的 Provisioning Profile 決定請求對應(yīng)環(huán)境的 DeviceToken诡右。即系統(tǒng)返回的 DeviceToken 其環(huán)境與 Provisioning Profile 的環(huán)境對應(yīng)。
一般在使用 Xcode 開發(fā)時轻猖,Provisioning Profile 為 Development 帆吻,因此獲取的 DeviceToken 也是開發(fā)模式。
在 App 需要打包為 ipa 文件或者需要上傳到 AppStore 時咙边,會將 Provisioning Profile 文件修改為 Distribution桅锄,這時獲取到的 DeviceToken 是生產(chǎn)模式。
1.3 在應(yīng)用程序中注冊遠(yuǎn)程推送功能
App 必須要向 APNs 請求注冊以實(shí)現(xiàn)推送功能样眠,在請求成功后友瘤,APNs 會返回一個設(shè)備的標(biāo)識符即 DeviceToken 給 App,服務(wù)器在推送通知的時候需要指定推送通知目的設(shè)備的 DeviceToken檐束。在 iOS 8 以及之后辫秧,注冊推送服務(wù)主要分為四個步驟:
使用registerUserNotificationSettings:注冊應(yīng)用程序想要支持的推送類型
通過調(diào)用registerForRemoteNotifications方法向 APNs 注冊推送功能
請求成功時,系統(tǒng)會在應(yīng)用程序委托方法中返回 DeviceToken被丧,請求失敗時盟戏,也會在對應(yīng)的委托方法中給出請求失敗的原因。
將 DeviceToken 上傳到服務(wù)器甥桂,服務(wù)器在推送時使用柿究。
上述第一個步驟注冊的 API 是 iOS 8 新增的,因此在 iOS 7黄选,前兩個步驟需更改為 iOS 7 中的 API蝇摸。
DeviceToken 有可能會更改,因此需要在程序每次啟動時都去注冊并且上傳到你的服務(wù)器端办陷。
注意:iOS 設(shè)備與 APNs 需要建立一條長連接貌夕,之后的推送注冊以及推送獲取都需要通過這條長連接。
當(dāng) iOS 設(shè)備無網(wǎng)絡(luò)可用時民镜,在向 APNs 請求注冊后啡专,既不會有注冊成功的回調(diào),也不會有注冊失敗的回調(diào)制圈。如果發(fā)生這種情況们童,需要檢查設(shè)備的網(wǎng)絡(luò)連接。
開發(fā)環(huán)境和生產(chǎn)環(huán)境建立不同的長連接鲸鹦,且設(shè)備上要至少有一個開發(fā)環(huán)境的 App 并且注冊推送慧库,才會建立開發(fā)環(huán)境下的長連接。
當(dāng)已經(jīng)注冊過推送服務(wù)后亥鬓,以后系統(tǒng)會立刻返回給你 DeviceToken完沪。還有一點(diǎn)是,返回 DeviceToken 的回調(diào)方法并不一定是只有在你注冊或者再次注冊時才被系統(tǒng)調(diào)用,當(dāng)DeviceToken 改變時也會被系統(tǒng)直接調(diào)用覆积。
1.4 在程序中處理通知
我們來看一下當(dāng)系統(tǒng)傳遞本地或遠(yuǎn)程通知的時候都有哪些情況听皿。
通知到達(dá)時,應(yīng)用不在前臺宽档。
這種情況下尉姨,操作系統(tǒng)將呈現(xiàn)通知,彈出一個選項(xiàng)或者在屏幕上部顯示 banner 提醒吗冤,給 App 角標(biāo)設(shè)置對應(yīng)的數(shù)字又厉,可能播放提示音,當(dāng)用戶稍微往下滑動通知時顯示更多的 action 按鈕(如果有設(shè)置)椎瘟。
通知到達(dá)時覆致,應(yīng)用在前臺運(yùn)行。
這種情況下肺蔚,不會彈出 banner煌妈。系統(tǒng)會根據(jù)當(dāng)前的通知是本地通知還是遠(yuǎn)程通知,調(diào)用不同的方法宣羊,并且在方法中傳遞通知的 Payload 數(shù)據(jù)璧诵。
在 iOS8 的通知中益眉,用戶點(diǎn)擊通知上的自定義 action 按鈕進(jìn)入應(yīng)用纯路。
這種情況下,系統(tǒng)會調(diào)用 iOS8 中對 action 按鈕新增的處理方法鸠窗。
用戶點(diǎn)擊通知進(jìn)入應(yīng)用苛坚。
系統(tǒng)會根據(jù)當(dāng)前的通知是本地通知還是遠(yuǎn)程通知比被,調(diào)用不同的方法,并且在方法中傳遞通知的 Payload 數(shù)據(jù)炕婶。
注意:只有當(dāng)通過通知進(jìn)入到 App 時姐赡,才可以獲取到通知信息。
1.4.1 自定義通知提示音
你可以在 App 的 Bundle 中加入一段自定義提示音文件柠掂。然后當(dāng)通知到達(dá)時可以指定播放這個文件。必須為以下幾種數(shù)據(jù)格式:
Linear PCM
MA4(IMA/ADPCM)
μLaw
aLaw
你可以將它們打包為aiff依沮、wav或caf文件涯贞。自定義的聲音文件時間必須小于 30 秒,如果超過了這個時間危喉,將被系統(tǒng)聲音代替宋渔。
1.4.2 Payload
Payload 是通知的一部分,每一條推送通知都包含一個 Payload辜限。它包含了系統(tǒng)提醒用戶通知到達(dá)的方式皇拣,還可以添加自定義的數(shù)據(jù)。即通知主要傳遞的數(shù)據(jù)為 Payload。
Payload 本身為 JSON 格式的字符串氧急,它內(nèi)部必須要包含一個鍵為aps的字典颗胡。aps 中可以包含以下字段中的一個或多個:
alert:其內(nèi)容可以為字符串或者字典,如果是字符串吩坝,那么將會在通知中顯示這條內(nèi)容
badge:其值為數(shù)字毒姨,表示當(dāng)通知到達(dá)設(shè)備時,應(yīng)用的角標(biāo)變?yōu)槎嗌俣で蕖H绻麤]有使用這個字段弧呐,那么應(yīng)用的角標(biāo)將不會改變。設(shè)置為 0 時嵌纲,會清除應(yīng)用的角標(biāo)俘枫。
sound:指定通知展現(xiàn)時伴隨的提醒音文件名。如果找不到指定的文件或者值為 default逮走,那么默認(rèn)的系統(tǒng)音將會被使用崩哩。如果為空,那么將沒有聲音言沐。
content-available:此字段為 iOS 7 silent remote notification 使用邓嘹。不使用此功能時無需包含此字段。
推送通知跟NSNotification有所區(qū)別:
1> NSNotification是抽象的险胰,不可見的
2> 推送通知是可見的(能用肉眼看到)
iOS中提供了2種推送通知: 本地推送通知, 遠(yuǎn)程推送通知
1> 本地推送通知(Local Notification)
2> 遠(yuǎn)程推送通知(Remote Notification)
推送通知可以不讓在前臺運(yùn)行的app,告知app內(nèi)部發(fā)生了什么變化,比如:有新的內(nèi)容,新消息等.
推送通知的使用:
發(fā)出推送通知時汹押,如果當(dāng)前程序正運(yùn)行在前臺,那么推送通知就不會被呈現(xiàn)出來
點(diǎn)擊推送通知后起便,默認(rèn)會自動打開發(fā)出推送通知的app
不管app打開還是關(guān)閉棚贾,推送通知都能如期發(fā)出
推送通知有5種呈現(xiàn)效果:
1. 在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)
2. 在屏幕中間彈出一個UIAlertView(顯示具體內(nèi)容,使用較少)
3. 在鎖屏界面顯示一塊橫幅(鎖屏狀態(tài)下,顯示具體內(nèi)容)
4. 播放音效(提醒作用)
5. 更新app圖標(biāo)的數(shù)字(說明新內(nèi)容的數(shù)量)
推送通知分為本地推送通知和遠(yuǎn)程推送通知,下面一一介紹.
本地推送通知
本地推送通知不需要服務(wù)器的支持,不需要聯(lián)網(wǎng)就可以發(fā)送通知.通常本地推送通知用于定時提醒用戶,比如清理垃圾,淘寶購物,紀(jì)念日提醒等任務(wù).
在蘋果官方給出了本地推送通知的一些屬性,以及使用.
屬性介紹:
@property(nonatomic,copy)NSDate *fireDate;// 設(shè)置本地推送的時間@property(nonatomic,copy) NSTimeZone *timeZone;// 時區(qū)(一般設(shè)置為[NSTimeZone defaultTimeZone] 榆综,跟隨手機(jī)的時區(qū))@property(nonatomic) NSCalendarUnit repeatInterval;// 沒隔多久重復(fù)發(fā)出一次@property(nonatomic,copy)NSCalendar *repeatCalendar;// 設(shè)置日期@property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);// 比如某一個區(qū)域的時候發(fā)出通知@property(nonatomic,assign)BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);// 進(jìn)入?yún)^(qū)域是否重復(fù)@property(nonatomic,copy)NSDictionary *userInfo;// 附加的額外信息@property(nonatomic,copy)NSString *alertBody;// 消息的內(nèi)容@property(nonatomic)BOOL hasAction;// 是否顯示alertAction的文字(默認(rèn)是YES)@property(nonatomic,copy)NSString *alertAction;// 設(shè)置鎖屏狀態(tài)下,顯示的一個文字@property(nonatomic,copy)NSString *alertLaunchImage;// 啟動圖片@property(nonatomic,copy)NSString *soundName;//? UILocalNotificationDefaultSoundName@property(nonatomic)NSInteger applicationIconBadgeNumber;// 應(yīng)用圖標(biāo)右上角的提醒數(shù)字@property(nonatomic,copy)NSArray *scheduledLocalNotifications;// 獲得被調(diào)度(定制)的所有本地推送通知(已經(jīng)發(fā)出且過期的推送通知就算調(diào)度結(jié)束妙痹,會自動從這個數(shù)組中移除)
使用方法:
創(chuàng)建本地通知
UILocalNotification *localNoti = [[UILocalNotification alloc] init];
調(diào)度本地推送通知(調(diào)度完畢后,推送通知會在特地時間fireDate發(fā)出)
[[UIApplication sharedApplication]scheduleLocalNotification:localNoti];取消調(diào)度本地推送通知
-(void)cancelLocalNotification:(UILocalNotification *)notification;-(void)cancelAllLocalNotifications;
立即發(fā)出本地推送通知
-(void)presentLocalNotificationNow:(UILocalNotification *)notification;
注意:
iOS8.0以后在本地推送通知上新加了一些新功能,為了用戶體驗(yàn),以及更加人性化,如果要使用本地通知鼻疮,需要得到用戶的許可.
需要在AppDelegate中添加如下代碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/*? ? UIUserNotificationTypeNone? ? = 0,? ? ? 沒有,沒有本地通知? ? UIUserNotificationTypeBadge? = 1 << 0, 接受圖標(biāo)右上角提醒數(shù)字? ? UIUserNotificationTypeSound? = 1 << 1, 接受通知時候,可以發(fā)出音效? ? UIUserNotificationTypeAlert? = 1 << 2, 接受提醒(橫幅/彈窗)? ? */// iOS8需要添加請求用戶的授權(quán)if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {? ? ? ? UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
}
}
點(diǎn)擊本地推送通知
當(dāng)用戶點(diǎn)擊本地推送通知怯伊,會自動打開app,這里有2種情況
1> app并沒有關(guān)閉判沟,一直隱藏在后臺(運(yùn)行在后臺)
讓app進(jìn)入前臺耿芹,并會調(diào)用AppDelegate的下面方法(并非重新啟動app)
-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
1
1
2> app已經(jīng)被關(guān)閉(進(jìn)程已死)
啟動app,啟動完畢會調(diào)用AppDelegate的下面方法
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
launchOptions參數(shù)通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象
若要實(shí)現(xiàn)界面的跳轉(zhuǎn),需要分清當(dāng)前應(yīng)用程序的所處狀態(tài),進(jìn)行判斷:
1> 若是當(dāng)前應(yīng)用在后臺運(yùn)行,接收到通知時,要想進(jìn)行界面的跳轉(zhuǎn),可以在didReceiveLocalNotification:方法中實(shí)現(xiàn)跳轉(zhuǎn)界面的方法
2> 若是當(dāng)前的應(yīng)用程序已經(jīng)關(guān)閉,我們在前面說到,當(dāng)應(yīng)用關(guān)閉,推送通知也會如期發(fā)送.但此時,是不會走didReceiveLocalNotification:方法的,那我們只有didFinishLaunchingWithOptions:方法利用,launchOptions參數(shù)通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象,實(shí)現(xiàn)跳轉(zhuǎn)的功能.
下面是演示代碼:
#import"AppDelegate.h"@interfaceAppDelegate ()@end@implementationAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/*? ? UIUserNotificationTypeNone? ? = 0,? ? ? 沒有,沒有本地通知? ? UIUserNotificationTypeBadge? = 1 << 0, 接受圖標(biāo)右上角提醒數(shù)字? ? UIUserNotificationTypeSound? = 1 << 1, 接受通知時候,可以發(fā)出音效? ? UIUserNotificationTypeAlert? = 1 << 2, 接受提醒(橫幅/彈窗)? ? */// iOS8需要添加請求用戶的授權(quán)if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {? ? ? ? UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];? ? ? ? [application registerUserNotificationSettings:settings];? ? }if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {// 跳轉(zhuǎn)界面? ? }returnYES;}/** *? 如果應(yīng)用在后臺,通過點(diǎn)擊通知的時候打開應(yīng)用會來到該代理方法 *? 如果應(yīng)用在前臺,接受到本地通知就會調(diào)用該方法 * *? @param notification 通過哪一個通知來這里 */- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{if (application.applicationState == UIApplicationStateActive)return;if (application.applicationState == UIApplicationStateInactive) {// 實(shí)現(xiàn)跳轉(zhuǎn)? ? }}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{returnYES;}#import"ViewController.h"
@interfaceViewController ()// 點(diǎn)擊按鈕之后添加通知- (IBAction)addLocalNote;@end@implementationViewController- (void)viewDidLoad {? ? [super viewDidLoad];? ? [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];}- (IBAction)addLocalNote {// 1.創(chuàng)建本地通知UILocalNotification *localNote = [[UILocalNotification alloc] init];// 設(shè)置什么時間彈出? ? localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];// 設(shè)置彈出的內(nèi)容? ? localNote.alertBody = @"您有新消息";// 設(shè)置鎖屏狀態(tài)下,顯示的一個文字? ? localNote.alertAction = @"快點(diǎn)打開";// 是否顯示alertAction的文字(默認(rèn)是YES)? ? localNote.hasAction =YES;// 設(shè)置音效? ? localNote.soundName = UILocalNotificationDefaultSoundName;// 應(yīng)用圖標(biāo)右上角的提醒數(shù)字? ? localNote.applicationIconBadgeNumber =1;// 設(shè)置UserInfo來傳遞信息? ? localNote.userInfo = @{@"alertBody" : localNote.alertBody, @"applicationIconBadgeNumber" : @(localNote.applicationIconBadgeNumber)};// 2.調(diào)度通知? ? [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}
遠(yuǎn)程推送通知
遠(yuǎn)程推送通知:就是通過網(wǎng)絡(luò)從遠(yuǎn)程服務(wù)器推送給客戶端的通知.
為什么需要遠(yuǎn)程推送通知挪哄?
傳統(tǒng)獲取數(shù)據(jù)的局限性
只要用戶關(guān)閉了app吧秕,就無法跟app的服務(wù)器溝通,無法從服務(wù)器上獲得最新的數(shù)據(jù)內(nèi)容
遠(yuǎn)程推送通知可以解決以上問題
不管用戶打開還是關(guān)閉app迹炼,只要聯(lián)網(wǎng)了砸彬,都能接收到服務(wù)器推送的遠(yuǎn)程通知
遠(yuǎn)程推送通知的使用
所有的蘋果設(shè)備,在聯(lián)網(wǎng)狀態(tài)下,都會與蘋果的服務(wù)器建立長連接
長連接: 只要聯(lián)網(wǎng)了砂碉,就一直建立連接
長連接的作用: 時間校準(zhǔn), 系統(tǒng)升級, 查找我的iPhone
長連接的好處 : 數(shù)據(jù)傳輸速度快 , 數(shù)據(jù)保持最新狀態(tài)
遠(yuǎn)程推送功能機(jī)制
蘋果給iOS和Mac添加了消息推送的功能蛀蜜,使得我們可以通過后臺服務(wù)器給應(yīng)用程序(APP)發(fā)送消息,不管APP是否正在使用绽淘,比如郵箱的來件提示功能涵防。這項(xiàng)服務(wù)被稱為Apple Push Notification service(APNs)。里面一共涉及到四個角色:APP沪铭、設(shè)備壮池、APNs和應(yīng)用后臺服務(wù)器(Provider),其中APP杀怠、后臺服務(wù)器和APNs之間使用deviceToken唯一的標(biāo)識一個用戶椰憋。
推送服務(wù)的工作流程:
APP向系統(tǒng)注冊推送服務(wù)。
設(shè)備從APNs請求deviceToken赔退。
通過代理方法將deviceToken返回給APP橙依。
APP將deviceToken發(fā)送給應(yīng)用后臺服務(wù)器(Provider)。
應(yīng)用后臺服務(wù)器保存deviceToken硕旗,然后在需要推送通知的時候窗骑,給APNs發(fā)送信息,使用deviceToken標(biāo)識所要送達(dá)的客戶端漆枚。
APNs將后臺服務(wù)器發(fā)過來的數(shù)據(jù)推送到設(shè)備创译。
設(shè)備將消息分發(fā)給應(yīng)用程序。
在使用推送功能的時候墙基,需要在開發(fā)者中心創(chuàng)建支持Push Notification的證書软族,并且將證書和私鑰用于應(yīng)用后臺服務(wù)器與APNs之間通信。
我也寫了一個比較易懂的遠(yuǎn)程推送流程圖!http://blog.csdn.net/ismilesky/article/details/48324723
遠(yuǎn)程推送近年來,都是通過第三方進(jìn)行實(shí)現(xiàn),因?yàn)榈谌酵扑偷墓δ鼙容^強(qiáng)大.
推送平臺: 百度推送 , 極光推送, 騰訊信鴿推送, 個推
遠(yuǎn)程推送我們這里以極光推送(第三方)為例,進(jìn)行測試.
極光遠(yuǎn)程推送的使用
如要使用極光第三方遠(yuǎn)程推送,我們需要集成iOS SDK,需要進(jìn)行應(yīng)用的配置,和環(huán)境配置.在開發(fā)者中心有
developer.apple.com開發(fā)者賬號 , iOS真機(jī)(iPhone残制、iPad立砸、iPod)等。
遠(yuǎn)程推送應(yīng)用配置過程:
創(chuàng)建支持遠(yuǎn)程推送功能的App ID
申請開發(fā)者證書初茶,并選中剛剛創(chuàng)建的App ID
下載CER文件颗祝,并導(dǎo)入鑰匙串管理
申請發(fā)布證書,并選中剛剛創(chuàng)建的App ID
下載CER文件纺蛆,并導(dǎo)入鑰匙串管理
檢查App ID吐葵,確認(rèn)證書已經(jīng)指定
這些相關(guān)配置極光推送已經(jīng)給了非常詳細(xì)的文檔資料, iOS SDK集成指南 :http://docs.jpush.io/guideline/ios_guide/, iOS SDK調(diào)試指南 :http://docs.jpush.io/client/ios_tutorials/#ios-sdk, 只需要按照流程進(jìn)行就可以.
實(shí)現(xiàn)代碼:
#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 (必須實(shí)現(xiàn))// 當(dāng)?shù)玫教O果的APNs服務(wù)器返回的DeviceToken就會被調(diào)用- (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);}// 接收到遠(yuǎn)程通知,觸發(fā)方法和本地通知一致 (必須實(shí)現(xiàn))- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {// Required? ? [APService handleRemoteNotification:userInfo];}#pragma mark - 使用后臺的遠(yuǎn)程消息推送 (必須實(shí)現(xiàn))/** 1> 在Capabilities中打開遠(yuǎn)程推送通知 2> 實(shí)現(xiàn)該代理方法遠(yuǎn)程消息數(shù)據(jù)格式: {"aps" : {"content-available" : 1},"content-id" : 42} 執(zhí)行completionHandler有兩個目的 1> 系統(tǒng)會估量App消耗的電量桥氏,并根據(jù)傳遞的UIBackgroundFetchResult 參數(shù)記錄新數(shù)據(jù)是否可用 2> 調(diào)用完成的處理代碼時,應(yīng)用的界面縮略圖會自動更新 注意:接收到遠(yuǎn)程通知到執(zhí)行完網(wǎng)絡(luò)請求之間的時間不能超過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(@"刷新數(shù)據(jù)結(jié)束"); 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];// 判斷應(yīng)用程序在前臺還是后臺if (application.applicationState == UIApplicationStateActive) {// 活躍狀態(tài)// 實(shí)現(xiàn)方法? ? }elseif (application.applicationState == UIApplicationStateInactive) {// 不活躍狀態(tài)// 實(shí)現(xiàn)方法? ? }else {// application.applicationState == UIApplicationStateBackground// 后臺// 實(shí)現(xiàn)方法? ? }/** 必須回調(diào) */? ? completionHandler(UIBackgroundFetchResultNewData);}測試時,運(yùn)行完應(yīng)用程序,要發(fā)送通知,進(jìn)行推送的測試,真機(jī)收到通知才算成功.