IOS之推送通知(本地推送和遠(yuǎn)程推送)

推送通知和NSNotification是有區(qū)別的:

NSNotification:是看不到的

推送通知:是可以看到的

IOS中提供了兩種推送通知

本地推送通知:(Local Notification):手機(jī)應(yīng)用本身的通知,比如:鬧鈴

遠(yuǎn)程推送通知:(Remote Notification)從服務(wù)器發(fā)送過(guò)來(lái)的通知

推送通知的作用:讓不在前臺(tái)運(yùn)行的App,告知用戶(hù)App內(nèi)部發(fā)生了什么事情.比如我們正在聊微信,突然界面上面出現(xiàn)了黑色半透明橫幅(QQ好友給你發(fā)送的消息)這就是一個(gè)推送通知.

推送通知的呈現(xiàn)效果:

1:在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)

2:在屏幕中間彈出一個(gè)UIAlertView(顯示具體內(nèi)容)

3:還可以在呈現(xiàn)推送通知的同時(shí)播放音效(提醒作用)

4:屏幕鎖屏?xí)r也照樣呈現(xiàn)(顯示具體內(nèi)容)

5:呈現(xiàn)推送通知的同時(shí),還可以更新App圖標(biāo)右上角的數(shù)字(說(shuō)明新內(nèi)容的數(shù)量)

6:用戶(hù)接收的推送通知,都會(huì)展示在通知中心(手指從屏幕頂部往下拉的窗口)(顯示具體的內(nèi)容)

推送通知的使用細(xì)節(jié):

StartFragment

1:發(fā)出推送通知時(shí),如果當(dāng)前程序正運(yùn)行在前臺(tái),那么推送通知就不會(huì)被呈現(xiàn)出來(lái)

2:點(diǎn)擊推送通知后,默認(rèn)會(huì)自動(dòng)打開(kāi)發(fā)出推送通知的app

3:不管app打開(kāi)還是關(guān)閉,推送通知都能如期發(fā)出

什么是本地推送通知:

顧名思義,就是不需要聯(lián)網(wǎng)的就能發(fā)出的推送通知(不需要服務(wù)器的支持)

本地推送通知的使用場(chǎng)景:

常用來(lái)定時(shí)提醒用戶(hù)完成一些任務(wù),比如:清理垃圾,記賬,購(gòu)物,買(mǎi)衣服,看電影

如何發(fā)出本地推送通知:

步驟:

1:注冊(cè)通知類(lèi)型(IOS8以后)

2:創(chuàng)建本地推送通知對(duì)象

3:定制一個(gè)通知

import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

  • (void)viewDidLoad {

    [super viewDidLoad];

    //1 :IOS8以后需要注冊(cè)通知類(lèi)型,包含哪些(聲音,圖標(biāo)文字,)信息,

    /*

    UIUserNotificationTypeNone = 0

    UIUserNotificationTypeBadge = 1 << 0 包含圖標(biāo)文字(左上角的數(shù)字)0001

    UIUserNotificationTypeSound = 1 << 1 聲音 ----------------->0010

    UIUserNotificationTypeAlert = 1 << 2 主題內(nèi)容--------------->0100

    目前是:0111,這個(gè)值是數(shù)值,下面的|||之間的內(nèi)容相當(dāng)于數(shù)值

    */

    // |:位移運(yùn)算符

    UIUserNotificationSettings *seting=[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];

[[UIApplication sharedApplication]registerUserNotificationSettings:seting];    

}

  • (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    //告訴它有一個(gè)本地通知

    //2:創(chuàng)建一個(gè)本地推送通知對(duì)象

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

    /*

    // timer-based scheduling 特定的時(shí)間發(fā)出通知

    @property(nonatomic,copy) NSDate *fireDate;觸發(fā)時(shí)間

    @property(nonatomic,copy) NSTimeZone *timeZone;時(shí)區(qū)

    @property(nonatomic) NSCalendarUnit repeatInterval;重復(fù)間隔

    @property(nonatomic,copy) NSCalendar *repeatCalendar;重復(fù)間隔

    @property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);區(qū)域

    @property(nonatomic,assign) BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);決定區(qū)域的一個(gè)BOOL值

    // alerts警告

    @property(nonatomic,copy) NSString *alertBody; 提醒的主題

    @property(nonatomic) BOOL hasAction; NO不顯示滑動(dòng)解鎖按鈕 反之顯示

    @property(nonatomic,copy) NSString *alertAction; 滑動(dòng)解鎖的文字

    @property(nonatomic,copy) NSString *alertLaunchImage; 點(diǎn)擊通知橫幅的時(shí)候啟動(dòng)程序的啟動(dòng) 圖片

    @property(nonatomic,copy) NSString *alertTitle 提示的標(biāo)題文字NS_AVAILABLE_IOS(8_2);

    // sound

    @property(nonatomic,copy) NSString *soundName; 伴隨的聲音,默認(rèn)的是UILocalNotificationDefaultSoundName

    // badge

    @property(nonatomic) NSInteger applicationIconBadgeNumber;圖標(biāo)右上角的數(shù)字

    // user info

    @property(nonatomic,copy) NSDictionary *userInfo;用戶(hù)指定的攜帶參數(shù),轉(zhuǎn)換成鍵值對(duì)放在字典里面

    @property (nonatomic, copy) NSString *category NS_AVAILABLE_IOS(8_0);分類(lèi)

    */

//給這些屬性賦值才能讓通知有特定的內(nèi)容

local.alertBody=@"女神:在嗎?";

//特定的時(shí)間讓顯示出來(lái)(從現(xiàn)在5秒后顯示出來(lái))

local.fireDate=[NSDate dateWithTimeIntervalSinceNow:5];

//滑動(dòng)解鎖的文字(在推送通知信息的下面一小行字)

local.alertAction =@"約";

//有聲音給聲音,沒(méi)聲音用默認(rèn)的

local.soundName=@"UILocalNotificationDefaultSoundName";

//設(shè)置圖標(biāo)右上角數(shù)字

local.applicationIconBadgeNumber=19;

//用戶(hù)信息

local.userInfo=@{@"name":@"女神",@"content":@"在不",@"time":@"20180101"};

//3:定制一個(gè)通知 



[[UIApplication sharedApplication]scheduleLocalNotification:local];

}

@end

什么是遠(yuǎn)程推送?

遠(yuǎn)程:從遠(yuǎn)程服務(wù)器推送給客戶(hù)端的通知(需要聯(lián)網(wǎng))

從服務(wù)器發(fā)送了一個(gè)通知,接收到通知以后做的和本地通知類(lèi)似的事情,這個(gè)通知只不過(guò)是從遠(yuǎn)方的服務(wù)器傳過(guò)來(lái)的,

要做的這個(gè)遠(yuǎn)程推送通知是由遠(yuǎn)程推送服務(wù),又稱(chēng)為APNs(Apple Push Notification Services:蘋(píng)果推送通知服務(wù)),蘋(píng)果給我們提供了這個(gè)服務(wù)就可以做遠(yuǎn)程推送服務(wù)了.

為什么要用蘋(píng)果的服務(wù)器?-->我們都知道,程序在活著的時(shí)候是可以跟自己的服務(wù)器進(jìn)行交互的(程序活著可以執(zhí)行代碼),但只要用戶(hù)關(guān)閉了app,就無(wú)法跟app的服務(wù)器溝通,無(wú)法從服務(wù)器上獲得最新的數(shù)據(jù)內(nèi)容.我們?cè)谑褂肣Q的時(shí)候,即使沒(méi)有登錄QQ也能收到信息,這就是用遠(yuǎn)程推送通知做的.不管登陸還是沒(méi)有登陸QQ,都可以接收到,但前提是必須要聯(lián)網(wǎng).

遠(yuǎn)程推送通知使用須知:所有的蘋(píng)果設(shè)備在聯(lián)網(wǎng)狀態(tài)下,都會(huì)與蘋(píng)果的設(shè)備建立長(zhǎng)連接(只要建立連接,想發(fā)送數(shù)據(jù),隨時(shí)都可以發(fā)送, 始終保持連接),蘋(píng)果有一個(gè)服務(wù)器集群,跟所有的蘋(píng)果設(shè)備建立長(zhǎng)連接

長(zhǎng)連接的作用:時(shí)間校準(zhǔn),系統(tǒng)升級(jí),查找我的iPhone,

長(zhǎng)連接的好處:數(shù)據(jù)保持最新?tīng)顟B(tài),數(shù)據(jù)傳輸快(以前的連接需要根據(jù)協(xié)議握幾次手,蘋(píng)果的直接就是已經(jīng)連接了).

只要和評(píng)估偶的設(shè)備保持長(zhǎng)連接就享受蘋(píng)果的APNs服務(wù),舉個(gè)例子:

比如說(shuō)我AgentLXJ現(xiàn)在有一部IPhone手機(jī),手機(jī)里面有很多應(yīng)用比如QQ,QQ有服務(wù)器吧,我的手機(jī)現(xiàn)在聯(lián)網(wǎng)并且QQ軟件要打開(kāi),陌陌的服務(wù)器就可以和我交互,我想傳遞消息,或者我接收到了消息,陌陌服務(wù)器金額以直接的告訴我.如果退出了QQ(不是卸載),但我的手機(jī)還在聯(lián)網(wǎng),這時(shí)QQ就不能給我推送消息,這時(shí)候蘋(píng)果的服務(wù)就可以,只要我的手機(jī)在聯(lián)網(wǎng)狀態(tài)下(蘋(píng)果建立的就是長(zhǎng)連接),蘋(píng)果要給我推送消息要是知道是哪個(gè)設(shè)備,怎么區(qū)分是哪一臺(tái)設(shè)備呢?我們的手機(jī)都有自己的唯一標(biāo)識(shí),有了設(shè)備的唯一標(biāo)識(shí)就知道推送給哪一臺(tái)設(shè)備,但是還有一個(gè)問(wèn)題,我的手機(jī)上不可能只有QQ這么一個(gè)軟件,比如還有微信,陌陌等軟件,所以蘋(píng)果還要知道軟件的BundleID(應(yīng)用程序的唯一標(biāo)識(shí)),有了設(shè)備和程序的唯一標(biāo)識(shí),就知道了推送給哪個(gè)設(shè)備的哪個(gè)應(yīng)用程序.現(xiàn)在又有了一個(gè)問(wèn)題,蘋(píng)果不知道要推送什么消息內(nèi)容.這里說(shuō)明一個(gè)概念:消息體(來(lái)源:是誰(shuí)發(fā)給我的,比如是:小媳婦.消息內(nèi)容:比如給我說(shuō)的是:吃飯了么?),蘋(píng)果不知道這個(gè)消息體,但這個(gè)消息QQ知道,我的小媳婦發(fā)的這個(gè)消息體先到QQ服務(wù)器(告訴QQ我要給他發(fā)送一條消息),QQ服務(wù)器先看看被接受的人(我)在線沒(méi)有,在線了直接發(fā)過(guò)去就完了,如果我不在線,這時(shí)蘋(píng)果服務(wù)器可以發(fā)送,所以要發(fā)給蘋(píng)果服務(wù)器,但是發(fā)給蘋(píng)果服務(wù)器是有要求的1:交99美元成為開(kāi)發(fā)者才能享受此服務(wù).2:消息體 3目標(biāo)的DeviceToken,QQ的服務(wù)器沒(méi)有資格保存每一個(gè)設(shè)備的唯一標(biāo)識(shí)和BundleID,蘋(píng)果想了一個(gè)辦法,叫做DeviceToken(APPID(應(yīng)用位置標(biāo)識(shí))和UUID(設(shè)備唯一標(biāo)識(shí))).告訴我這三點(diǎn)蘋(píng)果就可以幫我們做事情,怎么解析DeviceToken蘋(píng)果知道,所以QQ有一個(gè)數(shù)據(jù)庫(kù),一旦有人注冊(cè)或者是登陸(因?yàn)槭謾C(jī)和蘋(píng)果是長(zhǎng)連接,一旦登陸或注冊(cè)之前就會(huì)發(fā)送設(shè)備ID和軟件ID,并在蘋(píng)果服務(wù)器獲得DeviceToken)QQ數(shù)據(jù)庫(kù)就會(huì)存用戶(hù)的信息,比如ID,名字,性別,DeviceToken(假如我的DeviceToken經(jīng)蘋(píng)果的加密生成的是ApentLXJ)等等信息,DeviceToken在每次登陸的時(shí)候保存,因?yàn)橛脩?hù)有可能換手機(jī),一旦換手機(jī)用戶(hù)的UUID就換了,這時(shí)需要重新生成一個(gè)DeviceToken,然后把最新的Devicetoken保存到服務(wù)器中,小媳婦我發(fā)消息的時(shí)候就去找蘋(píng)果,看是否符合上面你的三條(交過(guò)錢(qián)了,有消息體,有目標(biāo)的DeviceToken:ApentLXJ)),一看都符合就發(fā)給我了

補(bǔ)充的:一個(gè)手機(jī)有多少個(gè)應(yīng)用程序就有多少個(gè)DeviceToken,

如果QQ同時(shí)推送給多臺(tái)設(shè)備?比如我的QQ手機(jī)上登了,IPAD上也登了,這時(shí)候取決于QQ服務(wù)器的發(fā)給蘋(píng)果的APNS的DeviceToken,發(fā)一個(gè)就發(fā)給一臺(tái)設(shè)備,兩個(gè)DeviceToken,就發(fā)給兩臺(tái)設(shè)備.

如果我換了安卓的時(shí)候登陸陌陌,這時(shí)候就是谷歌來(lái)推送通知,谷歌也有一大推服務(wù)器來(lái)搞.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容