一、NSNotification是系統內部發出通知,通常用於內部事件的監聽,或者狀態的改變等等,是不可見的
二、本地通知與遠程通知是可見的,主要用於告知用戶或者發送一些App的內容更新,推送一些相關的消息,讓用戶知道App內部發生了什麼事情。面試
一、本地推送通知:(Local Notification)
二、遠程推送通知:(Remote Notification)服務器
1.設置音效,(提醒做用)
2.設置橫幅,
3.設置彈窗,
4.鎖屏下也能夠呈現,
5.App圖標的數字 (即新內容的數量)
至於顯示橫幅或者彈窗,取決於用戶的設置
iOS手機設置中:通知中心-選擇應用-選擇應用下的通知模式-OK!app
一、App在前臺運行的時候,通知不會展現出來
二、點擊通知,默認會自動打開推送通知的App
三、無論App是否打開,通知均可以如期發出less
不須要聯網就能夠發出的通知
使用場景:
提醒用戶完成一些任務,好比:定時提醒,生活備註,看電影等等iphone
// 枚舉值-發出通知的時間(有侷限性) @property(nonatomic) NSCalendarUnit repeatInterval; // 自定義-發出通知的時間(能夠自由設定時間) @property(nonatomic,copy) NSCalendar *repeatCalendar; // 區域-建立只須要建立一箇中心點與半徑就能夠了 @property(nonatomic,copy) CLRegion *region // 進入區域發出一個通知,設置yes,只會發出一個通知,設置NO就會每次進入這個區域都發送 @property(nonatomic,assign) BOOL regionTriggersOnce NO // 設置通知的內容 @property(nonatomic,copy) NSString *alertBody; // 決定alertAction是否生效 @property(nonatomic) BOOL hasAction; // 設置滑塊的文字 @property(nonatomic,copy) NSString *alertAction; // 設置點擊通知的啓動圖片(通常設置App啓動圖片後,這裏能夠隨便寫) @property(nonatomic,copy) NSString *alertLaunchImage; // 設置alertTitle,就是通知內容上面的文字 @property(nonatomic,copy) NSString *alertTitle // 設置彈出的聲音 @property(nonatomic,copy) NSString *soundName; // 設置App的消息條數 @property(nonatomic) NSInteger applicationIconBadgeNumber; // 設置通知一些額外數據 @property(nonatomic,copy) NSDictionary *userInfo;
// 1.建立本地通知 UILocalNotification *localNote = [[UILocalNotification alloc] init]; // 2.設置本地通知的內容 // 2.1.設置通知發出的時間 localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0]; // 2.2.設置通知的內容 localNote.alertBody = @"在幹嘛?"; // 2.3.設置滑塊的文字(鎖屏狀態下:滑動來「解鎖」) localNote.alertAction = @"解鎖"; // 2.4.決定alertAction是否生效 localNote.hasAction = NO; // 2.5.設置點擊通知的啓動圖片 localNote.alertLaunchImage = @"123Abc"; // 2.6.設置alertTitle localNote.alertTitle = @"你有一條新通知"; // 2.7.設置有通知時的音效 localNote.soundName = @"buyao.wav"; // 2.8.設置應用程序圖標右上角的數字 localNote.applicationIconBadgeNumber = 999; // 2.9.設置額外信息 localNote.userInfo = @{@"type" : @1}; // 3.調用通知 [[UIApplication sharedApplication] scheduleLocalNotification:localNote]; }
使用注意:
iOS7,不須要用戶受權就可發出通知,而iOS8之後,必須用戶受權才能夠發出通知fetch
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 設置應用程序的圖標右上角的數字 [application setApplicationIconBadgeNumber:0]; if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:settings]; } // 界面的跳轉(針對應用程序被殺死的狀態下的跳轉) // 殺死狀態下的,界面跳轉並不會執行下面的方法- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification, // 因此咱們在寫本地通知的時候,要在這個與下面方法中寫,但要判斷,是經過哪一種類型通知來打開的 if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) { // 跳轉代碼 UILabel *redView = [[UILabel alloc] init]; redView.frame = CGRectMake(0, 0, 200, 300); redView.numberOfLines = 0; redView.font = [UIFont systemFontOfSize:12.0]; redView.backgroundColor = [UIColor redColor]; redView.text = [NSString stringWithFormat:@"%@", launchOptions]; [self.window.rootViewController.view addSubview:redView]; } return YES; }
監聽通知,若是用戶打開通知,可讓用戶進入一些特定的界面ui
/* 應用程序在進入前臺,或者在前臺的時候都會執行該方法 */ - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { // 必需要監聽--應用程序在後臺的時候進行的跳轉 if (application.applicationState == UIApplicationStateInactive) { NSLog(@"進行界面的跳轉"); // 若是在上面的通知方法中設置了一些,能夠在這裏打印額外信息的內容,就作到監聽,也就能夠根據額外信息,作出相應的判斷 NSLog(@"%@", notification.userInfo); // UIView *redView = [[UIView alloc] init]; redView.frame = CGRectMake(0, 0, 100, 100); redView.backgroundColor = [UIColor redColor]; [self.window.rootViewController.view addSubview:redView]; } }
從遠程服務器推送給客戶端的通知(須要聯網)
遠程推送服務---就是APNs
模擬器沒法調試遠程推送atom
解決獲取傳統數據的侷限性,讓數據實時更新spa
聊天功能(通常非即時聊天)、推送一下App的內部新功能、版本下載等3d
長鏈接的做用:
時間效準、系統升級、查找個人iphone、遠程通知
好處:
數據傳輸快、數據保持最新狀態
我在面試中通常也比較喜歡問面試者這個問題。能解釋清楚確定就有貨真價實的開發經驗
一、獲取蘋果得到deviceToken-獲取手機UDID+應用的惟一標識(bundel ID)
二、獲得蘋果返回的deviceToken
三、發送deviceToken給公司的服務器
四、監聽用戶對通知的點擊
一、真機
二、調試推送須要的證書文件
證書本身配置。。。
三、發佈具備推送服務的App
包含推送的cer證書+某個具備發佈資格的電腦,就能夠發佈
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; } else { // iOS7 [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert]; } // 根據遠程通知經過UIApplicationLaunchOptionsRemoteNotificationKey打開的狀況來進行 if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { // 跳轉 // 添加一個紅色的View } return YES; }
// 獲取DeviceToken - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // 將DeviceToken傳給服務器 NSLog(@"%@", deviceToken.description); }
// 正常接到遠程通知的時候會調用這個方法 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"%@", userInfo); // 正常打開推送後, }
// 後臺操做(根據收到推送,讓程序本身執行一些操做,無論用戶是否點擊推送) - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"---------"); UIView *redV = [[UIView alloc] init]; redView.backgroundColor = [UIColor redColor]; redView.frame = CGRectMake(100, 100, 100, 100); [self.window.rootViewController.view addSubview:redV]; // 1.打開後臺模式 2.告訴系統是否有新內容的更新 3.發送的通知有固定的格式("content-available":"1") // 2.告訴系統有新內容 completionHandler(UIBackgroundFetchResultNewData); }
completionHandler(UIBackgroundFetchResultNewData);
("content-available":"1")
找的這張圖:也有相應的模擬推送代碼,須要的能夠聯繫我
通常開發中直接使用(jpush)激光推送就能夠快速完成App的推送功能。具體按照官方文檔來進行.(有空會寫一篇專門針對激光推送的文稿)