推送:
用戶被動的接收消息移迫,是程序在后臺的一種通知機制推送通知跟NSNotification不同
1.NSNotification是抽象的旺嬉,不可見的
2.推送通知是可見的
IOS中提供了兩種推送通知
1.本地推送通知(Local Notification)
2.遠程推送通知(Remote Notification)
源生和極光
推送的作用:可以讓不在前臺運行的app,告知客戶app內部發(fā)生的事情厨埋。(QQ消息推送邪媳,微信消息推送等)
推送通知的呈現(xiàn)效果:
1.在屏幕頂部顯示的一條橫幅
2.在屏幕中間彈出一個UIAlertView
3.在鎖屏界面顯示一塊橫幅
4.更新app圖標的數(shù)字
5.播放提示音
PS:工作常用、面試必問
推送
源生方法
- 推送原理
1.應用程序注冊消息推送荡陷。
2.IOS從APNS Server獲取device token雨效,應用程序接收device token.
3.應用程序將device token發(fā)送給PUSH服務端程序
4.服務端向APNS發(fā)送推送消息
5.APNS服務將消息發(fā)送給iPhone應用程序
一、推送證書
二废赞、配置工程
三设易、需要實現(xiàn)的代碼
首先由應用注冊遠程通知。注冊成功之后APNS會返回一個唯一標識的設備令牌碼deviceToken蛹头,應用拿到分配的設備令牌碼之后顿肺,需要將該設備的設備令牌碼連同其他設備以及賬戶相關信息(如果有必要的話)傳遞給該應用對應的后臺服務器。當后臺服務器需要推送消息時渣蜗,就將消息以及需要推送設備對應的deviceToken傳遞給APNS屠尊,由APNS完成推送工作
建立我們的推送的項目(注意Bundleldentifier必須和我們推送應用的App id一致)
在AppDelegate里didiFinishLaunchingWithOptions函數(shù)里寫
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSdicionary *)launchOptions {
......
//推送的形式:標記,聲音耕拷,提示
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
return YES;
}
- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
NSLog(@"regisger success:%@",pToken);
//注冊成功讼昆,將deviceToken保存到應用服務器數(shù)據(jù)庫中
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
// 處理推送消息
NSLog(@"userinfo:%@",userInfo);
NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
//Icon推送數(shù)量設為0
// application.applicationIconBadgeNumber=0;
}
- (void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Registfail%@",error);
}
我們運行程序的時候會有提示,說我們的程序要發(fā)送推送通知骚烧。
應用程序不出在后臺浸赫,且通過推送通知打開的時候闰围,如果需要推送下來相關的信息可以在
- (**BOOL**)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中加入
///應用程序不處在后臺,并且是通過推送打開應用的時候
** ****if** (launchOptions) {
///獲取到推送相關的信息
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
第三方
極光推送既峡、友盟等
詳見官網(wǎng)
https://www.jpush.cn/
什么是遠程推送羡榴?
遠程:從遠程服務器推送給客戶端的通知(需要聯(lián)網(wǎng))
從服務器發(fā)送了一個通知,接收到通知以后做的和本地通知類似的事情运敢,這個通知只不過是從遠方的服務器傳過來的校仑,要做的這個遠程推送通知是由遠程推送服務,又稱為APNS(Apple Push Notification Services:蘋果推送通知服務)传惠,蘋果給我們提供了這個服務就可以做遠程推送服務了迄沫。
為什么要用蘋果的服務器?-->我們都知道卦方,程序在或者的時候是可以跟自己的服務器進行交互的(程序或著可以執(zhí)行代碼)羊瘩,但只要用戶關閉了app,就無法跟app的服務器溝通盼砍,無法從服務器上獲得最新的數(shù)據(jù)內容尘吗。我們在使用QQ的時候,即使沒有登錄QQ也能收到信息衬廷,這就是用遠程推送通知做的摇予,不管登錄還是沒有登錄QQ,都可以接收到信息(前提是聯(lián)網(wǎng)狀態(tài)下)
- 遠程推送通知使用須知
所有的蘋果設備在聯(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)在又有了一個問題,蘋果不知道要推送什么消息內容.這里說明一個概念:消息體(來源:是誰發(fā)給我的,比如是:小媳婦.消息內容:比如給我說的是:吃飯了么?),蘋果不知道這個消息體,但這個消息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ā)給兩臺設備.*