本地通知:就是指不需要互聯網就能發(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__);
}