iOS開發--本地通知與遠程通知
iOS開發--本地通知與遠程通知
作者 雷潮 關註 2016.02.01 00:18* 字數 1921 閱讀 8898評論 1喜歡 41這裏是指推送通知跟NSNotification有區別:
1、NSNotification是系統內部發出通知,一般用於內部事件的監聽,或者狀態的改變等等,是不可見的
2、本地通知與遠程通知是可見的,主要用於告知用戶或者發送一些App的內容更新,推送一些相關的消息,讓用戶知道App內部發生了什麽事情。
Paste_Image.png
iOS常用通知
1、本地推送通知:(Local Notification)
2、遠程推送通知:(Remote Notification)
iOS通知呈現效果(5)
1.設置音效,(提醒作用)
2.設置橫幅,
3.設置彈窗,
4.鎖屏下也可以呈現,
5.App圖標的數字 (即新內容的數量)
至於顯示橫幅或者彈窗,取決於用戶的設置
iOS手機設置中:通知中心-選擇應用-選擇應用下的通知模式-OK!
Paste_Image.png
通知的註意點
1、App在前臺運行的時候,通知不會展示出來
2、點擊通知,默認會自動打開推送通知的App
3、不管App是否打開,通知都可以如期發出
1、本地推送通知:
不需要聯網就可以發出的通知
使用場景:
提醒用戶完成一些任務,比如:定時提醒,生活備註,看電影等等
推送通知屬性:
// 枚舉值-發出通知的時間(有局限性)
@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以後,必須用戶授權才可以發出通知
- (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;
}
監聽通知,如果用戶打開通知,可以讓用戶進入一些特定的界面
/*
應用程序在進入前臺,或者在前臺的時候都會執行該方法
*/
- (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];
}
}
2、遠程推送通知:
從遠程服務器推送給客戶端的通知(需要聯網)
遠程推送服務---就是APNs
模擬器無法調試遠程推送
為什麽需要遠程推送通知:
解決獲取傳統數據的局限性,讓數據實時更新
使用場景:
聊天功能(一般非即時聊天)、推送一下App的內部新功能、版本下載等
註:所有的蘋果設備,在聯網狀態下,都會與蘋果的服務器建立-長連接
長連接的作用:
時間效準、系統升級、查找我的iphone、遠程通知
好處:
數據傳輸快、數據保持最新狀態
Paste_Image.png
Paste_Image.png
Paste_Image.png
我在面試中一般也比較喜歡問面試者這個問題。能解釋清楚肯定就有貨真價實的開發經驗
使用遠程推送
1、獲取蘋果獲得deviceToken-獲取手機UDID+應用的唯一標識(bundel ID)
2、得到蘋果返回的deviceToken
3、發送deviceToken給公司的服務器
4、監聽用戶對通知的點擊
如何調試遠程推送功能
1、真機
2、調試推送需要的證書文件
證書自己配置。。。
3、發布具有推送服務的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);
}
1、打開後臺模式
Paste_Image.png
2、告訴系統有新內容
completionHandler(UIBackgroundFetchResultNewData);
3、發送通知有固定格式
("content-available":"1")
找的這張圖:也有相應的模擬推送代碼,需要的可以聯系我
Paste_Image.png
一般開發中直接使用(jpush)激光推送就可以快速完成App的推送功能。具體按照官方文檔來進行.(有空會寫一篇專門針對激光推送的文稿)
iOS開發iOS開發--本地通知與遠程通知