應用程序添加角標和tabBar添加角標,以及后台運行時顯示


1、設置角標的代碼:

     // 從后台取出來的數據可能是int型的不能直接給badgeValue(string類型的),需要通過description轉

     NSString *count = [responseObject[@"count"] description];

         if ([count isEqualToString:@"0"]) {

             self.tabBarItem.badgeValue = nil; //設置tabBar的角標

             [UIApplication sharedApplication].applicationIconBadgeNumber = 0;// 設置應用程序的角標

         }else

         {

             self.tabBarItem.badgeValue = count;

             [UIApplication sharedApplication].applicationIconBadgeNumber = status.intValue;

         }

 

2、在給應用程序發送角標設置的時候,可能會報以下錯誤:

  “Attempting to badge the application icon but haven't received permission from

  這是因為一切都是iOS8搗的鬼。您如果把模擬器換成iOS7.1或者更早的,就不會有這個問題。而現在在iOS8中要實現badge、alert和sound等都需要用戶同意才能,因為這些都算做Notification“通知”,為了防止有些應用動不動給用戶發送“通知”騷擾用戶,所以在iOS8時,要“通知”必須要用戶同意才行。

  下面代碼的這個“通知設置”,主要是定義“通知類型”。同時我哦們把所有的通知類型都囊括進來,這樣,我們就不需要以后一個一個的去設置alert和sound了。

  這段代碼是在AppDelegate.m的 didFinishLaunchingWithOptions中實現:

  float sysVersion=[[UIDevice currentDevice]systemVersion].floatValue;

     if (sysVersion>=8.0) {

          UIUserNotificationType type=UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;

          UIUserNotificationSettings *setting=[UIUserNotificationSettings settingsForTypes:type categories:nil];

          [[UIApplication sharedApplication]registerUserNotificationSettings:setting];

      }

 

3、當然說到角標,肯定會有一個關於后台運行的問題,以前我們程序的后台模式只有3種才允許后台長時間,例如保持網絡連接、多媒體應用、 VOIP:網絡電話(現在很多了,比如藍牙之類的)

  (1 那現在是什么情況呢?比如說我們要獲取角標的數據,通過定時器(代碼如下),如果是進入后台運行狀態可能會導致定時器暫停

    //定時獲得未讀數據  

      NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(getUnreadCount) userInfo:nil repeats:YES];

      // !!主線程也會抽時間處理一下timer不管主線程是否正在執行其他事件操作——不加的話執行其他操作可能定時器會被忽略不執行

      [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

  (2 解決方法

    首先,我們還應該知道app的狀態:  1.死亡狀態:沒有打開app  2.前台運行狀態   3.后台暫停狀態:停止一切動畫、定時器、多媒體、聯網操作,很難再作其他操作  4.后台運行狀態。

  那么進入后台運行狀態我們可以在在AppDelegate.m中調用applicationDidEnterBackground:

  /*

   * 程序進入后台的時候調用

   */

  - (void)applicationDidEnterBackground:(UIApplication *)application {

      // 向操作系統申請后台運行的資格,能維持多久,是不確定的  

      UIBackgroundTaskIdentifier task = [application beginBackgroundTaskWithExpirationHandler:^{

             // 當申請的后台運行時間已經結束(過期),就會調用這個block 

            // 過期則需要結束任務

            [application endBackgroundTask:task];

      }];

  當然這種方法是暫時性的,過期的話我們就沒辦法了嗎?不!同時我們還可以假裝是音頻軟件:在Info.plst中設置后台模式:Required background modes == App plays audio or streams audio/video using AirPlay,然后搞一個0kb的MP3文件,沒有聲音 循環播放!

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM