iOS開發(fā)之通知推送

本地通知:就是指不需要互聯網就能發(fā)出的推送通知(不需要服務器去支持)开泽,使用的場景一般是定時提醒用戶完成一些任務,例如清理垃圾溯香,看定影喷众,記賬等。在IOS8之后本地通知還需要注冊用戶權限莺债。



通知行為:前臺通知行為滋觉,后臺通知行為


設置本地通知屬性(推薦一個一個屬性測試運行)


// 1.設置通知的內容(如果此屬性不設置是不會發(fā)送通知的)

ln.alertBody = @"小明,你媽叫你回家吃飯了!";

//? 2.設置通知觸發(fā)的開始時間

ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];

//? 3.設置重復通知的時間,間隔

ln.repeatInterval = NSCalendarUnitSecond;

//? 4.設置重復執(zhí)行使用日歷(用戶設置的日歷)

ln.repeatCalendar = [NSCalendar? currentCalendar];

//? ? NSString * const NSGregorianCalendar; 公歷

//? ? NSString * const NSChineseCalendar; 農歷

//? ? ln.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];

//? 5.設置應用圖標右上角的數字

ln.applicationIconBadgeNumber = 3;

//? 6.設置點擊推送通知進入界面的時候顯示,加載圖片

ln.alertLaunchImage = @"";

//? 7 設置通知的音效(只有真機有效)

local.soundName = UILocalNotificationDefaultSoundName;

//? 8 設置一些額外信息

local.userInfo = @{@"QQ":@"55555",@"info":@"約了沒"};

//? iOS8.0 以后新增屬性

//? ************************************

//? 1.設置區(qū)域,進入或離開某個區(qū)域的時候觸發(fā)

//? ? CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(40.1,106.1);

//? ? ln.region = [[CLCircularRegion alloc] initWithCenter:coordinate radius:10.0 identifier:@"ab"];

//? 2.設置進入或離開某個區(qū)域只執(zhí)行一次

//? ? ln.regionTriggersOnce = YES;

//? ***************************************

//? iOS8.2 新增屬性

//? ? ln.alertTitle = @"通知標題";


AppDelegate本地通知代理方法:


*? 一旦接收到本地通知就會調用該方法

*? 注意這個方法:應用在前臺也會調用

*? @param application? 應用

*? @param notification 本地通知對象

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

//? 當應用在前臺時候什么都不做

if (application.applicationState == UIApplicationStateActive) {

return;

}

//? 當應用不再前臺的時候才去跳轉,這樣用戶體檢更好

UITabBarController *tbVc = (UITabBarController *)application.keyWindow.rootViewController;

tbVc.selectedIndex = 1;

}

但是當應用被干掉的時候,不在調用application:didReceiveLocalNotification:的代理方法,但我們知道當應用程序啟動的時候一定會調用application: didFinishLaunchingWithOptions:的代理方法,在這里我們能拿到本地通知信息,也可以跳轉相應的界面

//? 如果是點擊本地通知進來的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就會有內容

if(launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]){

//頁面跳轉

UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;

tbVc.selectedIndex = 1;

}


點擊不同的通知跳轉不同的界面的方法:


在發(fā)送通知時候,設置userInfo屬性

// ?設置應用信息

ln.userInfo = @{@"pageKey":@"friend"};

在AppDelegate本地通知代理方法中進行判斷

/**

*? 一旦接收到本地通知就會調用該方法

*? 注意這個方法:應用在前臺也會調用

*? @param application? 應用

*? @param notification 本地通知對象

*/

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

{

//? 當應用在前臺時候什么都不做

if (application.applicationState == UIApplicationStateActive) {

return;

}

//? 當應用不再前臺的時候才去跳轉,這樣用戶體檢更好

//? 獲取tabBarController

UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;

//? 獲取用戶設置的跳轉頁

NSString *page = notification.userInfo[@"pageKey"];

//? 如果是朋友圈

if ([page isEqualToString:@"session"]) {

tbVc.selectedIndex = 1;

}else{

//? ? ? 否則跳轉到好友

tbVc.selectedIndex = 0;

}

}

我們取出UILocalNotification對象,剩下的做法與接收到本地通知代理方法中處理相同,所以我們把它提取為一個公用的方法

/**

*? 根據通知跳轉到不同頁面

*/

- (void) jumpToPageWithLocalNotification:(UILocalNotification *) notification

{

//? 獲取tabBarController

UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;

//? 獲取用戶設置的跳轉頁

NSString *page = notification.userInfo[@"pageKey"];

//? 如果是朋友圈

if ([page isEqualToString:@"session"]) {

tbVc.selectedIndex = 0;

}else{

//? ? ? 否則跳轉到好友

tbVc.selectedIndex = 1;

}

}

在didReceiveLocalNotification方法中

/**

*? 一旦接收到本地通知就會調用該方法

*? 注意這個方法:應用在前臺也會調用

*? @param application? 應用

*? @param notification 本地通知對象

*/

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

{

//? 當應用在前臺時候什么都不做

if (application.applicationState == UIApplicationStateActive) {

return;

}

//? 當應用不再前臺的時候才去跳轉,這樣用戶體檢更好

[self jumpToPageWithLocalNotification:notification];

}

在didFinishLaunchingWithOptions方法中


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

// Override point for customization after application launch.

//? 如果是點擊本地通知進來的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就會有內容

UILocalNotification *notifcation = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

//? 如果存在通知

if(notifcation){

[self jumpToPageWithLocalNotification:notifcation];

}

return YES;

}


用戶點擊本地推送通知齐邦,會自動打開APP椎侠,分為兩種情況:

app并沒有關閉,一直隱藏在后臺措拇,讓app進入前臺我纪,并會調用AppDelegate的下面方法(并非重新啟動app)

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

app已經被關閉(進程已死)啟動app,啟動完畢會調用AppDelegate的下面方法

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

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


基于位置的通知:當用戶進入或者離開某個位置就會發(fā)送通知(IOS8之后才有的)丐吓,需要設置requestWhenInUseAuthorization


遠程通知:顧名思義浅悉,就是從遠程服務器推送給客戶端的通知(需要聯網),遠程推送服務券犁,又稱為APNs(ApplePush Notification Services)术健,為什么要使用遠程通知?因為用戶關閉了APP就無法收到服務器最新的數據荞估,但是遠程通知服務可以無視用戶APP是否開啟,只要聯網了勘伺,就能收到服務器遠程推送的通知娇昙。


遠程通知的示意圖:

?所有的蘋果設備冒掌,在聯網狀態(tài)下,都會與蘋果的服務器建立長連接

什么是長連接:只要聯網了膳音,就一直建立連接

長連接的作用 1.時間校準 2.系統(tǒng)升級 3.查找我的iPhone

長連接的好處 1.數據傳輸速度快 2.數據保持最新狀態(tài)


實現遠程推送通知的過程


1 真機 ?

2 證書

開發(fā)階段

aps_development.cer 讓某個電腦具備調試遠程推送通知的能力

ios_development.cer 讓某個電腦具有真機調試的能力

dev_qq.mobileprovision 讓某個電腦上可以在某個真機上調試某個App的遠程推送服務

發(fā)布階段

aps_production.cer 讓電腦具備發(fā)布某個具有遠程推送服務的App的能力

ios_distribution.cer 讓電腦具備發(fā)布程序的能力

dis_qq.mobileprovision 讓某臺電腦具備發(fā)布某App的能力


從APNs服務器上獲取deviceToken



配置遠程推送通知證書?



遠程推送代碼實現


在iOS7下

注冊遠程通知

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

//? ? UIRemoteNotificationTypeBadge? = 1 << 0, 應用圖標右上角數字

//? ? UIRemoteNotificationTypeSound? = 1 << 1, 聲音

//? ? UIRemoteNotificationTypeAlert? = 1 << 2, 提示

//? ? UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3, 新聞,國內幾乎沒人使用

//? 遠程通知類型

UIRemoteNotificationType remoteTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert;

// 注冊遠程通知(在iOS8被廢棄了)

[application registerForRemoteNotificationTypes:remoteTypes];

return YES;

}

實現注冊遠程通知返回deviceToken的回調方法

/**

*? 當APNs返回deviceToken會調用,該方法

*

*? @param application 當前應用對象

*? @param deviceToken 設備令牌

*/

- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

{

NSLog(@"%@",deviceToken);

}

實現注冊遠程通知失敗回調方法,用于檢查失敗原因方便調試

/**

*? 當從APNs獲取deviceToken失敗的時候會回調該方法

*

*? @param application 應用

*? @param error? ? ? 錯誤

*/

- (void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

{

NSLog(@"%@",error);

}

實現點擊遠程通知,進入App調用的方法

/**

*? 處理點擊遠程通知的頁面跳轉處理

*/

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

{

NSLog(@"%s",__FUNCTION__);

}


極光推送Push(第三方API)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末兵志,一起剝皮案震驚了整個濱河市想罕,隨后出現的幾起案子按价,更是在濱河造成了極大的恐慌笙瑟,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件框产,死亡現場離奇詭異茅信,居然都是意外死亡,警方通過查閱死者的電腦和手機妖谴,發(fā)現死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窑多,“玉大人洼滚,你說我怎么就攤上這事遥巴。” “怎么了拾弃?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵豪椿,是天一觀的道長搭盾。 經常有香客問我婉支,道長,這世上最難降的妖魔是什么滋迈? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任饼灿,我火速辦了婚禮碍彭,結果婚禮上悼潭,老公的妹妹穿的比我還像新娘。我一直安慰自己皆疹,他們只是感情好略就,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窄绒,像睡著了一般彰导。 火紅的嫁衣襯著肌膚如雪敲茄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天倔幼,我揣著相機與錄音损同,去河邊找鬼鸟款。 笑死,一個胖子當著我的面吹牛组哩,可吹牛的內容都是我干的伶贰。 我是一名探鬼主播罐栈,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琅翻!你這毒婦竟也來了方椎?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棠众,失蹤者是張志新(化名)和其女友劉穎摄欲,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡迟隅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年智袭,在試婚紗的時候發(fā)現自己被綠了掠抬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞳步,死狀恐怖单起,靈堂內的尸體忽然破棺而出劣坊,到底是詐尸還是另有隱情,我是刑警寧澤测蘑,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布碳胳,位于F島的核電站赠摇,受9級特大地震影響,放射性物質發(fā)生泄漏烫罩。R本人自食惡果不足惜洽故,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一时甚、第九天 我趴在偏房一處隱蔽的房頂上張望哈踱。 院中可真熱鬧开镣,春花似錦邪财、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽九昧。三九已至,卻和暖如春愤炸,著一層夾襖步出監(jiān)牢的瞬間掉奄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工诞仓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留速兔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓谍婉,卻偏偏與公主長得像穗熬,于是被迫代替她去往敵國和親丁溅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容