iOS開發(fā)2017---推送通知

對(duì)于推送噪馏,不管是我們開發(fā)人員還是用戶祟滴,都是又愛又恨振惰,特別是iOS的推送蘋果爸爸幾乎每出一個(gè)版本的iOS系統(tǒng)都要給他一兩斧子,以改善用戶體驗(yàn)和安全性垄懂,因?yàn)闁|西實(shí)在又多又雜骑晶,所以我只說說我們常用到的一些東西。

推送無外乎就兩個(gè)草慧,一個(gè)是本地推送桶蛔,一個(gè)是遠(yuǎn)程推送,但是二者其實(shí)是相互依存的漫谷。

我們做出來的時(shí)候仔雷,還要特別注意第三個(gè)東西,那就是APP的狀態(tài):

UIApplicationStateActive,// 激活狀態(tài)舔示,用戶正在使用

AppUIApplicationStateInactive,// 待激活狀態(tài)碟婆,即用戶切換到其他App、按Home鍵回到桌面惕稻、拉下通知中心

UIApplicationStateBackground// 在后臺(tái)運(yùn)行

其實(shí)竖共,還有一個(gè)更棘手的狀態(tài),那就是app被殺死的狀態(tài)俺祠,文章末尾我將說到公给。

本地推送一般和APP的UIApplicationStateBackground這個(gè)狀態(tài)密切相關(guān),其他狀態(tài)要么沒有多大必要蜘渣,要么接收不到(殺手狀態(tài))淌铐,在收到遠(yuǎn)程推送后,先判斷狀態(tài):

switch (state) {

???? case UIApplicationStateActive:{}//可以播放聲音震動(dòng)提示

??? break;

? ? case UIApplicationStateInactive:{}//可以播放聲音震動(dòng)提示

?? break;

?? case UIApplicationStateBackground:{

? ? ? ? [self showNotificationLocalNotification];//生成本地推送

?? }

?? break;

?? default:

?? break;

}

本地推送到了iOS10蔫缸,有很大的改動(dòng)腿准,所以要判斷是否是iOS10:

- (void)showNotificationWithMessage:(EMMessage *)message

{

//接連推送判斷

NSTimeInterval timeInterval = [[NSDate date] timeIntervalSinceDate:self.lastPlaySoundDate];

BOOL playSound = NO;

if (!self.lastPlaySoundDate || timeInterval >= kDefaultPlaySoundInterval) {

self.lastPlaySoundDate = [NSDate date];

playSound = YES;

}

NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];

[userInfo setObject:@"xxx" forKey:@"key"];

if (IOS10) {

//發(fā)送本地推送

if (NSClassFromString(@"UNUserNotificationCenter")) {

UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.01 repeats:NO];

UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];

if (playSound) {

content.sound = [UNNotificationSound defaultSound];

}

content.body =alertBody;

content.userInfo = userInfo;

UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:message.messageId content:content trigger:trigger];

[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:nil];

}

else {

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

notification.fireDate = [NSDate date]; //觸發(fā)通知的時(shí)間

NSString *title = message.ext[kChatUserNick];

}

}

notification.alertBody =[NSString stringWithFormat:@"%@:%@", title, messageStr];;

notification.alertAction = NSLocalizedString(@"open", @"Open");

notification.timeZone = [NSTimeZone defaultTimeZone];

if (playSound) {

notification.soundName = UILocalNotificationDefaultSoundName;

}

notification.userInfo = userInfo;

//發(fā)送通知

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

}

UIApplication *application = [UIApplication sharedApplication];

application.applicationIconBadgeNumber += 1;

}? else {//iOS10 以下

//發(fā)送本地推送

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

notification.fireDate = [NSDate date]; //觸發(fā)通知的時(shí)間

notification.alertBody = @"xxxx";

notification.alertAction = @"打開";

notification.timeZone = [NSTimeZone defaultTimeZone];

notification.soundName = UILocalNotificationDefaultSoundName;

notification.userInfo = userInfo;

//發(fā)送通知

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

UIApplication *application = [UIApplication sharedApplication];

application.applicationIconBadgeNumber += 1;

}

}

以上是接到遠(yuǎn)程推送并發(fā)送本地推送的代碼,很多童鞋會(huì)認(rèn)為這是自定義推送捂龄,其實(shí)也可以這么理解释涛,那么怎么接收到本地推送呢加叁?

很簡單,在AppDelegate里實(shí)現(xiàn)這個(gè)方法就OK:

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

這個(gè)方法中你要放你接收到本地推送唇撬,用戶點(diǎn)擊后要處理的事情它匕,比如跳轉(zhuǎn)到某個(gè)指定頁面,那么問題又來了窖认,怎么跳轉(zhuǎn)到指定頁面呢豫柬?

這個(gè)問題就和你APP的架構(gòu)密切相關(guān)了,我只說說我的思路

1.找到APP此時(shí)頂層的UIViewController

2.回到rootViewControlle

3.跳轉(zhuǎn)至頁面

當(dāng)然扑浸,在APP殺死的狀態(tài)下烧给,你將只能收到遠(yuǎn)程推送,如果用戶點(diǎn)擊了通知喝噪,將進(jìn)入下面的方法:

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

注意础嫡,遠(yuǎn)程推送有一定的延遲。

最后說一個(gè)問題酝惧,希望有大神來指點(diǎn)迷津:

APP在綁定了推送之后榴鼎,被用戶卸載了,然后又重裝了晚唇,也能收到推送巫财,怎么破?哩陕?平项??目前發(fā)現(xiàn)微信也存在這個(gè)問題悍及,真心求解C銎啊!P母稀鸳粉!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市园担,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枯夜,老刑警劉巖弯汰,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異湖雹,居然都是意外死亡咏闪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門摔吏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸽嫂,“玉大人纵装,你說我怎么就攤上這事【菽常” “怎么了橡娄?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長癣籽。 經(jīng)常有香客問我挽唉,道長,這世上最難降的妖魔是什么筷狼? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任瓶籽,我火速辦了婚禮,結(jié)果婚禮上埂材,老公的妹妹穿的比我還像新娘塑顺。我一直安慰自己,他們只是感情好俏险,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布严拒。 她就那樣靜靜地躺著,像睡著了一般寡喝。 火紅的嫁衣襯著肌膚如雪糙俗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天预鬓,我揣著相機(jī)與錄音巧骚,去河邊找鬼。 笑死格二,一個(gè)胖子當(dāng)著我的面吹牛劈彪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顶猜,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼沧奴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了长窄?” 一聲冷哼從身側(cè)響起滔吠,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挠日,沒想到半個(gè)月后疮绷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚣潜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年冬骚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡只冻,死狀恐怖庇麦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喜德,我是刑警寧澤山橄,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站住诸,受9級(jí)特大地震影響驾胆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贱呐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一丧诺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奄薇,春花似錦驳阎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沫屡,卻和暖如春饵隙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沮脖。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工金矛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勺届。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓驶俊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親免姿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饼酿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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