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

1、設置角標的代碼:

// 從后臺取出來的數(shù)據可能是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、在給應用程序發(fā)送角標設置的時候,可能會報以下錯誤:
“Attempting to badge the application icon but haven't received permission from”
這是因為一切都是iOS8搗的鬼。您如果把模擬器換成iOS7.1或者更早的,就不會有這個問題。而現(xiàn)在在iOS8中要實現(xiàn)badge、alert和sound等都需要用戶同意才能,因為這些都算做Notification“通知”,為了防止有些應用動不動給用戶發(fā)送“通知”騷擾用戶,所以在iOS8時,要“通知”必須要用戶同意才行。
  下面代碼的這個“通知設置”,主要是定義“通知類型”。同時我哦們把所有的通知類型都囊括進來,這樣,我們就不需要以后一個一個的去設置alert和sound了。
這段代碼是在AppDelegate.m的 didFinishLaunchingWithOptions中實現(xiàn):

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:網絡電話(現(xiàn)在很多了,比如藍牙之類的)
 ?。? 那現(xiàn)在是什么情況呢?比如說我們要獲取角標的數(shù)據,通過定時器(代碼如下),如果是進入后臺運行狀態(tài)可能會導致定時器暫停

//定時獲得未讀數(shù)據  
      NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(getUnreadCount) userInfo:nil repeats:YES];
      // !!主線程也會抽時間處理一下timer(不管主線程是否正在執(zhí)行其他事件操作)——不加的話執(zhí)行其他操作可能定時器會被忽略不執(zhí)行
      [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

(2 解決方法:
   首先,我們還應該知道app的狀態(tài): 1.死亡狀態(tài):沒有打開app 2.前臺運行狀態(tài) 3.后臺暫停狀態(tài):停止一切動畫、定時器、多媒體、聯(lián)網操作,很難再作其他操作 4.后臺運行狀態(tài)。
  那么進入后臺運行狀態(tài)我們可以在在AppDelegate.m中調用applicationDidEnterBackground:

   /*
   * 程序進入后臺的時候調用
   */
  - (void)applicationDidEnterBackground:(UIApplication *)application {
      // 向操作系統(tǒng)申請后臺運行的資格,能維持多久,是不確定的  
      UIBackgroundTaskIdentifier task = [application beginBackgroundTaskWithExpirationHandler:^{
        // 當申請的后臺運行時間已經結束(過期),就會調用這個block 
       // 過期則需要結束任務
         [application endBackgroundTask:task];
      }];

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,635評論 4 61
  • 今天把程序寫完了,PPT也寫完了,明天就要答辯了。開心。
    王虹淇閱讀 174評論 0 0
  • 由于在地鐵上網絡不佳,打開了手機里存的電子書,看到一本《把事情浪費在好玩的事情上》,原來是古大大的作品。 第一章第...
    原味的夏天寶寶閱讀 310評論 0 0
  • 隨著AlphaGo和圍棋第一人柯潔的對戰(zhàn),強化學習又將迎來一波熱潮。強化學習到底是怎么讓機器能夠玩游戲的,這個問題...
    b19707134332閱讀 2,343評論 0 0
  • 導語:人人都想擁有六塊腹肌,這無可非議。但你至少需要強化四個肌肉群來使腹部緊致。想如愿得到平坦的腹部嗎?這里的鍛煉...
    咸魚隊長閱讀 898評論 2 17

友情鏈接更多精彩內容