iOS 遠程通知(Remote Notification)和本地通知(Local Notification)

  ios通知分爲遠程通知和本地通知,遠程通知須要鏈接網絡,本地通知是不須要的,無論用戶是打開應用仍是關閉應用,咱們的通知都會發出,並被客戶端收到ios

  咱們使用遠程通知主要是隨時更新最新的數據給用戶,使用本地通知主要是提醒用戶來完成一些任務數據庫

  

  遠程通知 Remote Notification:服務器

  其主要的工做原理爲:客戶端發送本身的UUID和Bundle ID給蘋果的APNs服務器-->蘋果的APNs服務器加密後返回一個deviceToken給客戶端-->客戶端拿到devideToken後將其發送給app公司提供的服務器-->此服務器將客戶端的deviceToken存儲到數據庫-->當服務器要發送遠程通知給客戶端的時候,會在數據庫中拿到此客戶端的deviceToken-->發送數據到蘋果的APNs服務器,而後再發送到客戶端網絡

  遠程通知是須要真機的,另外還須要去蘋果開發者中心申請證書:真機調試證書,遠程推送證書(要在哪臺電腦上調試或發佈哪一個app),描述文件證書(哪臺電腦利用哪一個設備調試哪一個app)app

  咱們可使用PushMebaby來模擬服務器,也能夠利用第三方軟件來發送通知如Jpush等ide

  下面是代碼的實現:fetch

 1 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 2 {
 3     if ([UIDevice currentDevice].systemVersion.doubleValue < 8.0){ // 小於ios8
 4     
 5         UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge;
 6         
 7         // 系統自動發送UUID和Bundle ID到蘋果APNs服務器
 8         [application registerForRemoteNotificationTypes:type];
 9     }else{ // 大於等於ios8
10     
11         UIUserNotificationType type = UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;
12         
13         UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
14         // 通知類型
15         [application registerUserNotificationSettings:settings];
16         
17         // 註冊通知
18         [application registerForRemoteNotifications];
19     }
20     
21     // 能夠獲取到userInfo數據
22     NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsAnnotationKey];
23     
24     return YES;
25 }
26 
27 // 得到deviceToken
28 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
29 {
30     NSLog(@"%@",deviceToken);
31 }
32 
33 // ios7以前調用,接收到遠程通知的內容會調用
34 // 程序是打開狀態,無論前臺仍是後臺,會調用這個方法
35 // 若是程序是關閉狀態不會調用這個,會調用application: didFinishLaunchingWithOptions:
36 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
37 {
38     NSLog(@"%@",userInfo);
39 }
40 
41 // ios7以後調用,若是接收到遠程通知的內容會調用這個方法
42 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
43 {
44     // 這個方法須要調用這個block來通知系統更新UI界面
45     // UIBackgroundFetchResultNewData, 接收到數據
46     // UIBackgroundFetchResultNoData, 沒有接收到數據
47     // UIBackgroundFetchResultFailed 接收數據失敗
48     completionHandler(UIBackgroundFetchResultNewData);
49     
50 }

  

  本地通知 Local Notification加密

  基本屬性和方法:spa

  屬性:調試

  • 指定通知發送的時間:NSDate *fireDate 
  • 指定發送通知的時區:NSTimeZone *timeZone
  • 重複的週期: repeatInterval
  • 通知內容:NSString *alertBody     
  • 鎖屏狀態的標題:NSString *alertAction
  • 點擊通知以後的啓動圖片:NSString *alertLaunchImage
  • 收到通知播放的音樂:NSString *soundName
  • 圖標提醒數字:NSInteger applicationIconBadgeNumber
  • 額外的信息:NSDictionary *userInfo

  方法:

  • 當即執行:- (void)presentLocalNotificationNow:(UILocalNotification *)notification
  • 註冊通知,根據指定發送時間執行:- (void)scheduleLocalNotification:(UILocalNotification *)notification
  • 取消單個通知:- (void)cancelLocalNotification:(UILocalNotification *)notification
  • 取消全部通知:- (void)cancelAllLocalNotifications

  下面是代碼實現:

 1 // 建立本地通知對象
 2     UILocalNotification *noti = [[UILocalNotification alloc] init];
 3     
 4     // 指定通知發送的時間10s
 5     noti.fireDate = [NSDate dateWithTimeIntervalSinceNow:10.0f];
 6     // 指定時區
 7     noti.timeZone = [NSTimeZone defaultTimeZone];
 8     // 指定通知內容
 9     noti.alertBody = @"這是通知的內容";
10     
11     // 設置通知重複的週期(1分鐘)
12     noti.repeatInterval = NSCalendarUnitSecond;
13     
14     // 指定鎖屏界面的信息
15     noti.alertAction = @"這是鎖屏界面的信息";
16     
17     // 設置點擊通知進入程序時候的啓動圖片
18     noti.alertLaunchImage = @"xxx";
19     
20     // 收到通知播放的音樂
21     noti.soundName = @"hehe.wav";
22     
23     // 設置應用程序的提醒圖標
24     noti.applicationIconBadgeNumber = 99;
25     
26     // 註冊通知時能夠指定未來點擊通知以後須要傳遞的數據
27     noti.userInfo = @{@"dogName":@"xx1",
28                       @"weight":@(20)
29                       };
30     
31     // 註冊添加通知
32     UIApplication *app =  [UIApplication sharedApplication];
33     [app scheduleLocalNotification:noti];

  注意:在ios8中須要提早註冊通知類型

 

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // Override point for customization after application launch.
 3     
 4     // 注意: 在iOS8中, 必須提早註冊通知類型
 5     if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
 6         UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
 7         UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
 8         // 註冊通知類型
 9         [application registerUserNotificationSettings:settings];
10     }
11 }
12 
13 // 接收到本地通知時就會調用,前臺自動調用,後臺點擊通知後調用
14 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
15 {
16     NSLog(@"%@",notification.userInfo);
17 }
相關文章
相關標籤/搜索