你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 詳解iOS當地推送與長途推送

詳解iOS當地推送與長途推送

編輯:IOS開發綜合

1、簡介

分為當地推送和長途推送2種。可以在運用沒有翻開乃至手機鎖屏情形下給用戶以提醒。它們都須要注冊,注冊後體系會彈出提醒框(以下圖)提醒用戶能否贊成,假如贊成則正常應用;假如用戶分歧意則下次翻開法式也不會彈出該提醒框,須要用戶到設置外面設置。一共有三種提醒類型:

UIUserNotificationTypeBadge:運用圖標右上角的信息提醒

UIUserNotificationTypeSound:播放提醒音

UIUserNotificationTypeAlert:提醒框

2、當地推送

1 注冊與處置

代碼以下:

 /// 普通在在啟動時注冊告訴,法式被殺逝世,點擊告訴後挪用此法式
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // IOS8
 UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
 [application registerUserNotificationSettings:setting];
 }

 if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
 // 這裡添加處置代碼
 }
 return YES;
}
/// 法式沒有被殺逝世(處於前台或後台),點擊告訴後會挪用此法式
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
 // 這裡添加處置代碼
}

可以看到,處置代碼有兩個辦法,一個是

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
另外一個是
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

假如法式沒有被殺逝世,即處於前台或許後台,那末挪用前者;假如法式被殺逝世,則挪用後者。

2 發送告訴

代碼以下

- (IBAction)addLocalNotification {
 // 1.創立一個當地告訴
 UILocalNotification *localNote = [[UILocalNotification alloc] init];

 // 1.1.設置告訴收回的時光
 localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];

 // 1.2.設置告訴內容
 localNote.alertBody = @"這是一個推送這是一個推送";

 // 1.3.設置鎖屏時,字體下方顯示的一個文字
 localNote.alertAction = @"趕忙!!!!!";
 localNote.hasAction = YES;

 // 1.4.設置啟動圖片(經由過程告訴翻開的)
 localNote.alertLaunchImage = @"../Documents/IMG_0024.jpg";

 // 1.5.設置經由過程到來的聲響
 localNote.soundName = UILocalNotificationDefaultSoundName;

 // 1.6.設置運用圖標左上角顯示的數字
 localNote.applicationIconBadgeNumber = 999;

 // 1.7.設置一些額定的信息
 localNote.userInfo = @{@"qq" : @"704711253", @"msg" : @"success"};

 // 2.履行告訴
 [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}

後果以下:

3 撤消告訴

// 撤消一切當地告訴
[application cancelAllLocalNotifications];

3、長途推送

與Android上我們本身完成的推送辦事紛歧樣,Apple對裝備的掌握異常嚴厲,新聞推送的流程必需要經由APNs(Apple Push Notification service).

普通情形下假如一個法式退到後台就不克不及運轉代碼(Audio、VoIP等等可以在後台運轉),或許法式加入後,那末它就和對應運用的後台辦事器斷開了鏈接,就收不到辦事器發送的信息了,然則每台裝備只需聯網就會和蘋果的APNs辦事器樹立一個長銜接(persistent IP connection),如許只需經由過程蘋果的APNs辦事器,我們本身的辦事器便可以直接的和裝備堅持銜接了,表示圖以下:

應用步調:

1 勾選Backgroud Modes -> Remote notifications,重要是IOS7以後,蘋果支撐後台運轉,假如這裡翻開後,當吸收到長途推送後,法式在後台也能夠做一些處置,以下圖所示:

2 長途推送的注冊與當地推送分歧,IOS8.0前後也分歧,代碼見上面。

別的,在第一次應用推送時,能夠會有如許的疑問:didFinishLaunchingWithOptions會在每次翻開法式時被挪用,那是否是每次都邑挪用注冊函數,每次都邑彈窗訊問用戶"能否許可推送告訴"?其實這個窗口只會在第一次翻開法式時彈出一次,不管用戶許可或不許可蘋果會記住用戶的選擇,注冊函數挪用屢次對用戶也沒甚麼影響

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 // iOS8以後和之前應差別看待
 if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];
 [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
 } else {
 [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIUserNotificationTypeSound];
 }

 return YES;
}
/// 這個函數存在的意義在於:當用戶在設置中封閉了告訴時,法式啟動時會挪用此函數,我們可以獲得用戶的設置
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
 [application registerForRemoteNotifications];
}

3 假如注冊掉敗,好比沒有證書等等,會挪用:

/// 注冊掉敗挪用
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
 NSLog(@"長途告訴注冊掉敗:%@",error);
}

4 獲得deviceToken

假如用戶贊成,蘋果會依據運用的 bundleID 和 手機UDID 生成 deviceToken,然後挪用 application 的 didregister 辦法前往 devicetoken,法式應當把 devicetoken 發給運用的辦事器,辦事器有責任將其存儲(假如許可多點登錄,能夠存多個 devicetoken)。deviceToken也是會變的: ”If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes“,是以應每次都發給辦事器(provider)

/// 用戶贊成後,會挪用此法式,獲得體系的deviceToken,應把deviceToken傳給辦事器保留,此函數會在法式每次啟動時挪用(條件是用戶許可告訴)
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
 NSLog(@"deviceToken = %@",deviceToken);
}

5 用戶點擊了告訴

默許會翻開法式。處置代碼有三個函數,分iOS7之前以後和法式能否處於後台

5.1 iOS7及其之以後

此函數不管是法式被殺逝世照樣處於後台,只需用戶點擊了告訴,都邑被挪用,是以假如是iOS7,則不用在didFinishLaunchingWithOptions中做處置,只鄙人面函數做處置便可,此時應防止在didFinishLaunchingWithOptions函數中也做反復處置。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
 // userInfo
} 

注:當在第一步翻開後台運轉後,用戶不點擊告訴,也能夠履行:

 - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler 

5.2 iOS7之前

當用戶點擊告訴後,假如法式被殺逝世則會挪用上面第一個函數,假如法式處於後台會挪用上面第二個函數,是以上面兩個函數應搭配應用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 // 獲得長途推送新聞
 NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
 if (userInfo) {
 // 有推送的新聞,處置推送的新聞
 }
 return YES;
}
/// iOS3以後才有,只要在法式處於後台時,用戶點擊了告訴後才會被挪用,應搭配didFinishLaunchingWithOptions應用
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
 // userInfo
}

在現實編程時,假如想兼容iOS7之前,三個函數可同時應用,都列出來,體系會主動選擇適合的挪用。

6 總結下函數的挪用:

初次裝置後啟動:

didRegisterForRemoteNotificationsWithDeviceToken 被挪用

體系訊問用戶能否贊成吸收 Notifications

不論用戶選擇贊成或謝絕,didRegisterUserNotificationSettings 被挪用

運用非初次啟動時:

假如 notifications 處於謝絕狀況:didRegisterUserNotificationSettings 被挪用

假如 notifications 處於許可狀況

didRegisterForRemoteNotificationsWithDeviceToken 被挪用

didRegisterUserNotificationSettings 被挪用

運用運轉進程頂用戶修正 notifications 設置:

從謝絕變成許可:didRegisterForRemoteNotificationsWithDeviceToken 被挪用

從許可變成謝絕:甚麼也不產生

7 辦事端推送的格局

{
 "aps" : {   // 必需有
 "alert" : "string",
 "body" : "string",
 "badge" : number,
 "sound" : "string"
 },
 "NotiId" : 20150821, // 自界說key值
}

8 推送的年夜小限制

長途告訴負載的年夜小依據辦事器應用的API分歧而分歧。當應用HTTP/2 provider API時,負載最年夜為4kB;當應用legacy binary interface時,負載最年夜為2kB。當負載年夜小跨越劃定的負載年夜小時,APNs會謝絕發送此告訴。

9 全體以下圖所示(以微信推送為例):

10 最初,還須要請求證書,這裡不再胪陳-_-

本文已被整頓到了《iOS推送教程》,迎接年夜家進修浏覽。

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐本站。

【詳解iOS當地推送與長途推送】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved