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文件,沒有聲音 循環播放!