iOS 通知機(jī)制總結(jié)

iOS中提供了2種推送通知

  • 本地推送通知(Local Notification)
  • 遠(yuǎn)程推送通知(Remote Notification)

推送通知的作用

  • 可以讓不在前臺(tái)運(yùn)行的app铅辞,告知用戶app內(nèi)部發(fā)生了什么事情
  • 推送通知的呈現(xiàn)效果總結(jié)
  • 用戶接收的推送通知厌漂,都會(huì)展示在“通知中心”
  • 從屏幕頂部往下滑,就能調(diào)出“通知中心”
  • 顯示橫幅還是UIAlertView斟珊,取決于用戶的設(shè)置

總結(jié)一下苇倡,推送通知有5種不同的呈現(xiàn)效果

  • 在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)
  • 在屏幕中間彈出一個(gè)UIAlertView(顯示具體內(nèi)容)
  • 在鎖屏界面顯示一塊橫幅(鎖屏狀態(tài)下,顯示具體內(nèi)容)
  • 更新app圖標(biāo)的數(shù)字(說(shuō)明新內(nèi)容的數(shù)量)
  • 播放音效(提醒作用)

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

  • 發(fā)出推送通知時(shí)囤踩,如果當(dāng)前程序正運(yùn)行在前臺(tái)旨椒,那么推送通知就不會(huì)被呈現(xiàn)出來(lái)
  • 點(diǎn)擊推送通知后,默認(rèn)會(huì)自動(dòng)打開發(fā)出推送通知的app
  • 不管app打開還是關(guān)閉堵漱,推送通知都能如期發(fā)出

本地推送

AppDelegate.m

#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 /* UIUserNotificationTypeNone = 0, 無(wú)類型(不給用戶發(fā)通知) 
    UIUserNotificationTypeBadge = 1 << 0, 是否可以改變應(yīng)用圖標(biāo)右上角的提示數(shù)字
    UIUserNotificationTypeSound = 1 << 1, 該通知是否會(huì)有聲音 
    UIUserNotificationTypeAlert = 1 << 2, 是否有彈出提示
 */
 if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
    [application registerUserNotificationSettings:settings];
 }
 if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
 // 跳轉(zhuǎn) UILabel *label = [[UILabel alloc] init];
    label.frame = CGRectMake(0, 300, 300, 300);
    label.backgroundColor = [UIColor redColor];
    label.text  = [NSString stringWithFormat:@"%@", launchOptions];
    label.font = [UIFont systemFontOfSize:14];
    label.numberOfLines = 0;
    [self.window.rootViewController.view addSubview:label];
 }
    return YES;
}
/** 
* 點(diǎn)擊通知打開應(yīng)用的時(shí)候會(huì)執(zhí)行該方法 
* 應(yīng)用在前臺(tái)的時(shí)候,收到通知也會(huì)執(zhí)行該方法 
* 
* @param notification 通知 
*/
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
    UILabel *label = [[UILabel alloc] init];
    label.frame = CGRectMake(0, 0, 300, 300);
    label.backgroundColor = [UIColor redColor];
    label.text = [NSString stringWithFormat:@"%@", notification]
    label.font = [UIFont systemFontOfSize:14];
    label.numberOfLines = 0;
    [self.window.rootViewController.view addSubview:label];
   // if (application.applicationState == UIApplicationStateBackground) {
// 
// }
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 
    return YES;
}
@end

推送

#import "ViewController.h"
@interface ViewController ()
/**
 * 點(diǎn)擊按鈕后添加本地通知
 */
- (IBAction)addLocalNote;
/**
 * 移除通知(不常用) 
 */
- (IBAction)removeLocalNote;
@end
@implementation ViewController
- (void)viewDidLoad {
     [super viewDidLoad];
}
/**
 * 點(diǎn)擊按鈕后添加本地通知 
 */
- (IBAction)addLocalNote {
 /* 
 @property(nonatomic,copy) NSDate *fireDate;
 @property(nonatomic,copy) NSTimeZone *timeZone;
 @property(nonatomic) NSCalendarUnit repeatInterval;
 @property(nonatomic,copy) NSCalendar *repeatCalendar;
 @property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);
 @property(nonatomic,assign) BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);
 @property(nonatomic,copy) NSString *alertBody;
 @property(nonatomic) BOOL hasAction;
 @property(nonatomic,copy) NSString *alertAction;
 @property(nonatomic,copy) NSString *alertLaunchImage;
 @property(nonatomic,copy) NSString *soundName;
 UILocalNotificationDefaultSoundName @property(nonatomic) NSInteger applicationIconBadgeNumber;
 @property(nonatomic,copy) NSDictionary *userInfo;
 */
     // 1.創(chuàng)建一個(gè)本地通知
     UILocalNotification *localNote = [[UILocalNotification alloc] init];
     // 1.1.設(shè)置通知發(fā)出的時(shí)間
     localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
     // 1.2.設(shè)置通知發(fā)出的內(nèi)容
     localNote.alertBody = @"吃飯了嗎?";
     // 1.3.是否彈出提示框
     localNote.hasAction = YES;
     // 1.4.設(shè)置提示框
     localNote.alertAction = @"趕緊查看";
     // 1.5.設(shè)置啟動(dòng)的圖片
     localNote.alertLaunchImage = @"1111";
     // 1.6.設(shè)置啟動(dòng)的音效
     localNote.soundName = UILocalNotificationDefaultSoundName;
     // 1.7.設(shè)置應(yīng)用圖標(biāo)提醒的數(shù)字
     localNote.applicationIconBadgeNumber = 999;
     // 1.8.如果想將通知的信息傳遞過(guò)去,必須使用userInfo屬性
     localNote.userInfo = @{@"msg" : @"吃飯了嗎", @"date" : localNote.fireDate};
     // 2.調(diào)度通知
     [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
     [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}
- (IBAction)removeLocalNote {
     [[UIApplication sharedApplication] cancelAllLocalNotifications];
// [UIApplication sharedApplication] cancelLocalNotification:(UILocalNotification *)
}
@end

遠(yuǎn)程推送

** AppDelegate.m**

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
        // 1.向用戶請(qǐng)求可以給用戶推送消息
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [application registerUserNotificationSettings:settings];
        
        // 2.注冊(cè)遠(yuǎn)程通知(拿到用戶的DeviceToken)
        [application registerForRemoteNotifications];
    } else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
    
    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
        // 頁(yè)面的跳轉(zhuǎn)
    }
    
    [application setApplicationIconBadgeNumber:0];
    
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 將用戶的用戶名和deviceToken發(fā)送給服務(wù)器,讓服務(wù)器進(jìn)行保存?zhèn)浞菁纯?    NSLog(@"%@", deviceToken);
}

/**
 *  當(dāng)接受到遠(yuǎn)程通知的時(shí)候會(huì)調(diào)用該方法
 *
 *  @param userInfo    遠(yuǎn)程通知的信息
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    // 在這里可以跳轉(zhuǎn)的其他頁(yè)面
    NSLog(@"%@", userInfo);
}

/**
 *  如果接受到遠(yuǎn)程通知時(shí),想要后臺(tái)執(zhí)行任務(wù),則實(shí)現(xiàn)調(diào)用該方法
 *
 *  @param userInfo
 *  @param completionHandler 后臺(tái)執(zhí)行完之后要告知系統(tǒng),是否更新成功
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%@", userInfo);
    
    completionHandler(UIBackgroundFetchResultNewData);
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末综慎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勤庐,更是在濱河造成了極大的恐慌示惊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愉镰,死亡現(xiàn)場(chǎng)離奇詭異米罚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)丈探,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門录择,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碗降,你說(shuō)我怎么就攤上這事隘竭。” “怎么了遗锣?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵货裹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我精偿,道長(zhǎng)弧圆,這世上最難降的妖魔是什么赋兵? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮搔预,結(jié)果婚禮上霹期,老公的妹妹穿的比我還像新娘。我一直安慰自己拯田,他們只是感情好历造,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著船庇,像睡著了一般吭产。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸭轮,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天臣淤,我揣著相機(jī)與錄音,去河邊找鬼窃爷。 笑死邑蒋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的按厘。 我是一名探鬼主播医吊,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逮京!你這毒婦竟也來(lái)了卿堂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤造虏,失蹤者是張志新(化名)和其女友劉穎御吞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓藕,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陶珠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了享钞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揍诽。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栗竖,靈堂內(nèi)的尸體忽然破棺而出暑脆,到底是詐尸還是另有隱情,我是刑警寧澤狐肢,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布添吗,位于F島的核電站,受9級(jí)特大地震影響份名,放射性物質(zhì)發(fā)生泄漏碟联。R本人自食惡果不足惜妓美,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲤孵。 院中可真熱鬧壶栋,春花似錦、人聲如沸普监。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凯正。三九已至毙玻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廊散,已是汗流浹背淆珊。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奸汇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓往声,卻偏偏與公主長(zhǎng)得像擂找,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浩销,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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