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