推送通知和NSNotification是有區(qū)別的:
NSNotification:是看不到的
推送通知:是可以看到的
IOS中提供了兩種推送通知
本地推送通知:(Local Notification):手機應用本身的通知,比如:鬧鈴
遠程推送通知:(Remote Notification)從服務器發(fā)送過來的通知
推送通知的作用:讓不在前臺運行的App,告知用戶App內(nèi)部發(fā)生了什么事情.比如我們正在聊微信,突然界面上面出現(xiàn)了黑色半透明橫幅(QQ好友給你發(fā)送的消息)這就是一個推送通知.
推送通知的呈現(xiàn)效果:
1:在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)
2:在屏幕中間彈出一個UIAlertView(顯示具體內(nèi)容)
3:還可以在呈現(xiàn)推送通知的同時播放音效(提醒作用)
4:屏幕鎖屏時也照樣呈現(xiàn)(顯示具體內(nèi)容)
5:呈現(xiàn)推送通知的同時,還可以更新App圖標右上角的數(shù)字(說明新內(nèi)容的數(shù)量)
6:用戶接收的推送通知,都會展示在通知中心(手指從屏幕頂部往下拉的窗口)(顯示具體的內(nèi)容)
推送通知的使用細節(jié):
StartFragment
1:發(fā)出推送通知時,如果當前程序正運行在前臺,那么推送通知就不會被呈現(xiàn)出來
2:點擊推送通知后,默認會自動打開發(fā)出推送通知的app
3:不管app打開還是關閉,推送通知都能如期發(fā)出
什么是本地推送通知:
顧名思義,就是不需要聯(lián)網(wǎng)的就能發(fā)出的推送通知(不需要服務器的支持)
本地推送通知的使用場景:
常用來定時提醒用戶完成一些任務,比如:清理垃圾,記賬,購物,買衣服,看電影
如何發(fā)出本地推送通知:
步驟:
1:注冊通知類型(IOS8以后)
2:創(chuàng)建本地推送通知對象
3:定制一個通知
import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
-
(void)viewDidLoad {
[super viewDidLoad];
//1 :IOS8以后需要注冊通知類型,包含哪些(聲音,圖標文字,)信息,
/*
UIUserNotificationTypeNone = 0
UIUserNotificationTypeBadge = 1 << 0 包含圖標文字(左上角的數(shù)字)0001
UIUserNotificationTypeSound = 1 << 1 聲音 ----------------->0010
UIUserNotificationTypeAlert = 1 << 2 主題內(nèi)容--------------->0100
目前是:0111,這個值是數(shù)值,下面的|||之間的內(nèi)容相當于數(shù)值
*/
// |:位移運算符
UIUserNotificationSettings *seting=[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication]registerUserNotificationSettings:seting];
}
-
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//告訴它有一個本地通知
//2:創(chuàng)建一個本地推送通知對象
UILocalNotification*local=[[UILocalNotification alloc]init];
/*
// timer-based scheduling 特定的時間發(fā)出通知
@property(nonatomic,copy) NSDate *fireDate;觸發(fā)時間
@property(nonatomic,copy) NSTimeZone *timeZone;時區(qū)
@property(nonatomic) NSCalendarUnit repeatInterval;重復間隔
@property(nonatomic,copy) NSCalendar *repeatCalendar;重復間隔
@property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);區(qū)域
@property(nonatomic,assign) BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);決定區(qū)域的一個BOOL值
// alerts警告
@property(nonatomic,copy) NSString *alertBody; 提醒的主題
@property(nonatomic) BOOL hasAction; NO不顯示滑動解鎖按鈕 反之顯示
@property(nonatomic,copy) NSString *alertAction; 滑動解鎖的文字
@property(nonatomic,copy) NSString *alertLaunchImage; 點擊通知橫幅的時候啟動程序的啟動 圖片
@property(nonatomic,copy) NSString *alertTitle 提示的標題文字NS_AVAILABLE_IOS(8_2);
// sound
@property(nonatomic,copy) NSString *soundName; 伴隨的聲音,默認的是UILocalNotificationDefaultSoundName
// badge
@property(nonatomic) NSInteger applicationIconBadgeNumber;圖標右上角的數(shù)字
// user info
@property(nonatomic,copy) NSDictionary *userInfo;用戶指定的攜帶參數(shù),轉(zhuǎn)換成鍵值對放在字典里面
@property (nonatomic, copy) NSString *category NS_AVAILABLE_IOS(8_0);分類
*/
//給這些屬性賦值才能讓通知有特定的內(nèi)容
local.alertBody=@"女神:在嗎?";
//特定的時間讓顯示出來(從現(xiàn)在5秒后顯示出來)
local.fireDate=[NSDate dateWithTimeIntervalSinceNow:5];
//滑動解鎖的文字(在推送通知信息的下面一小行字)
local.alertAction =@"約";
//有聲音給聲音,沒聲音用默認的
local.soundName=@"UILocalNotificationDefaultSoundName";
//設置圖標右上角數(shù)字
local.applicationIconBadgeNumber=19;
//用戶信息
local.userInfo=@{@"name":@"女神",@"content":@"在不",@"time":@"20180101"};
//3:定制一個通知
[[UIApplication sharedApplication]scheduleLocalNotification:local];
}
@end
什么是遠程推送?
遠程:從遠程服務器推送給客戶端的通知(需要聯(lián)網(wǎng))
從服務器發(fā)送了一個通知,接收到通知以后做的和本地通知類似的事情,這個通知只不過是從遠方的服務器傳過來的,
要做的這個遠程推送通知是由遠程推送服務,又稱為APNs(Apple Push Notification Services:蘋果推送通知服務),蘋果給我們提供了這個服務就可以做遠程推送服務了.
為什么要用蘋果的服務器?-->我們都知道,程序在活著的時候是可以跟自己的服務器進行交互的(程序活著可以執(zhí)行代碼),但只要用戶關閉了app,就無法跟app的服務器溝通,無法從服務器上獲得最新的數(shù)據(jù)內(nèi)容.我們在使用QQ的時候,即使沒有登錄QQ也能收到信息,這就是用遠程推送通知做的.不管登陸還是沒有登陸QQ,都可以接收到,但前提是必須要聯(lián)網(wǎng).
遠程推送通知使用須知:所有的蘋果設備在聯(lián)網(wǎng)狀態(tài)下,都會與蘋果的設備建立長連接(只要建立連接,想發(fā)送數(shù)據(jù),隨時都可以發(fā)送, 始終保持連接),蘋果有一個服務器集群,跟所有的蘋果設備建立長連接
長連接的作用:時間校準,系統(tǒng)升級,查找我的iPhone,
長連接的好處:數(shù)據(jù)保持最新狀態(tài),數(shù)據(jù)傳輸快(以前的連接需要根據(jù)協(xié)議握幾次手,蘋果的直接就是已經(jīng)連接了).
只要和評估偶的設備保持長連接就享受蘋果的APNs服務,舉個例子:
比如說我AgentLXJ現(xiàn)在有一部IPhone手機,手機里面有很多應用比如QQ,QQ有服務器吧,我的手機現(xiàn)在聯(lián)網(wǎng)并且QQ軟件要打開,陌陌的服務器就可以和我交互,我想傳遞消息,或者我接收到了消息,陌陌服務器金額以直接的告訴我.如果退出了QQ(不是卸載),但我的手機還在聯(lián)網(wǎng),這時QQ就不能給我推送消息,這時候蘋果的服務就可以,只要我的手機在聯(lián)網(wǎng)狀態(tài)下(蘋果建立的就是長連接),蘋果要給我推送消息要是知道是哪個設備,怎么區(qū)分是哪一臺設備呢?我們的手機都有自己的唯一標識,有了設備的唯一標識就知道推送給哪一臺設備,但是還有一個問題,我的手機上不可能只有QQ這么一個軟件,比如還有微信,陌陌等軟件,所以蘋果還要知道軟件的BundleID(應用程序的唯一標識),有了設備和程序的唯一標識,就知道了推送給哪個設備的哪個應用程序.現(xiàn)在又有了一個問題,蘋果不知道要推送什么消息內(nèi)容.這里說明一個概念:消息體(來源:是誰發(fā)給我的,比如是:小媳婦.消息內(nèi)容:比如給我說的是:吃飯了么?),蘋果不知道這個消息體,但這個消息QQ知道,我的小媳婦發(fā)的這個消息體先到QQ服務器(告訴QQ我要給他發(fā)送一條消息),QQ服務器先看看被接受的人(我)在線沒有,在線了直接發(fā)過去就完了,如果我不在線,這時蘋果服務器可以發(fā)送,所以要發(fā)給蘋果服務器,但是發(fā)給蘋果服務器是有要求的1:交99美元成為開發(fā)者才能享受此服務.2:消息體 3目標的DeviceToken,QQ的服務器沒有資格保存每一個設備的唯一標識和BundleID,蘋果想了一個辦法,叫做DeviceToken(APPID(應用位置標識)和UUID(設備唯一標識)).告訴我這三點蘋果就可以幫我們做事情,怎么解析DeviceToken蘋果知道,所以QQ有一個數(shù)據(jù)庫,一旦有人注冊或者是登陸(因為手機和蘋果是長連接,一旦登陸或注冊之前就會發(fā)送設備ID和軟件ID,并在蘋果服務器獲得DeviceToken)QQ數(shù)據(jù)庫就會存用戶的信息,比如ID,名字,性別,DeviceToken(假如我的DeviceToken經(jīng)蘋果的加密生成的是ApentLXJ)等等信息,DeviceToken在每次登陸的時候保存,因為用戶有可能換手機,一旦換手機用戶的UUID就換了,這時需要重新生成一個DeviceToken,然后把最新的Devicetoken保存到服務器中,小媳婦我發(fā)消息的時候就去找蘋果,看是否符合上面你的三條(交過錢了,有消息體,有目標的DeviceToken:ApentLXJ)),一看都符合就發(fā)給我了
補充的:一個手機有多少個應用程序就有多少個DeviceToken,
如果QQ同時推送給多臺設備?比如我的QQ手機上登了,IPAD上也登了,這時候取決于QQ服務器的發(fā)給蘋果的APNS的DeviceToken,發(fā)一個就發(fā)給一臺設備,兩個DeviceToken,就發(fā)給兩臺設備.
如果我換了安卓的時候登陸陌陌,這時候就是谷歌來推送通知,谷歌也有一大推服務器來搞.