簡體   English   中英

當應用程序處於后台或應用程序中時,使用推送通知設置應用程序圖標上的徽章

[英]Setting badge on app icon with push notifications when app is in background or app has been killed

經過幾乎所有的教程后,我仍然無法正確設置我的徽章。 情況就像那樣 - 當我的應用程序處於后台時,我希望我的徽章增加1.所以我使用下面的代碼行

NSLog(@"In didReceiveRemoteNotification badge number is %ld",(long)[UIApplication sharedApplication].applicationIconBadgeNumber);
[UIApplication sharedApplication].applicationIconBadgeNumber += [[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] integerValue];
NSLog(@"In didReceiveRemoteNotification badge number is %ld",(long)[UIApplication sharedApplication].applicationIconBadgeNumber);

這兩個NSLog分別給出了值1和2。 甚至在設置applicationIconBadgeNumber之前它得到1? 因此它在接收單個通知時顯示2作為徽章。

為了使我的問題更清楚,我發布完整的代碼 - didReceiveRemoteNotification

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler{

if ((application.applicationState ==  UIApplicationStateBackground)) {

    NSLog(@"===========================");
    NSLog(@"App was in BACKGROUND...");

    NSLog(@"In didReceiveRemoteNotification badge number is %ld",(long)[UIApplication sharedApplication].applicationIconBadgeNumber);
    [UIApplication sharedApplication].applicationIconBadgeNumber += [[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] integerValue];
    NSLog(@"In didReceiveRemoteNotification badge number is %ld",(long)[UIApplication sharedApplication].applicationIconBadgeNumber);
    [[UIApplication sharedApplication] presentLocalNotificationNow:localNotif];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"pushNotification" object:nil userInfo:userInfo];}
if (application.applicationState ==  UIApplicationStateActive) {
    NSLog(@"===========================");
    NSLog(@"App was ACTIVE");

    NSString *str = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
    UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Notification Received" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    alertview.tag = 600;
    [alertview show];
}

NSLog(@"%@",userInfo);
handler(UIBackgroundFetchResultNewData);}

我的第二個問題是,當我的應用程序被殺死時,我會在didFinishLaunchingWithOptions中找到以下代碼:

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (localNotif) {
    [UIApplication sharedApplication].applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber + [[[localNotif valueForKey:@"aps"] valueForKey:@"badge"] integerValue];}

起初它根本沒有用,但在閱讀Stackoverflow的答案后,我刪除了UIRemoteNotificationTypeNewsstandContentAvailability並開始顯示。 但仍然沒有顯示增量。 徽章價值仍為1。

任何幫助,將不勝感激。

您不需要在收到遠程通知時手動設置徽章,因為iOS會使用aps - >徽章中的值自動為您設置徽章。 無論您的應用處於活動狀態,非活動狀態,背景狀態還是不運行(已殺死),這都可以開箱即用。

但是,iOS不會使用該值來增加徽章,而是設置它。 因此,如果推送通知中的徽章值為n,則無論應用程序的當前徽章值如何,iOS都會將其設置為n(非當前+ n)。 接收通知時徽章顯然增加的所有應用程序實際上管理其服務器上的徽章計數,並在通知中發送適當的遞增值。

如果這就是你想要的行為,這就是你應該做的。 通常,您有一個與服務器上的每個設備關聯的badgeCount屬性,並且每次發送推送時都會增加該屬性。 然后,當用戶打開您的應用程序時,您向服務器發送重置調用,將此值重置為0,隨后的通知將從1開始。

徽章計數由iOS本身管理,當應用程序處於后台或被殺死狀態時,它完全依賴於操作系統。

服務器端將處理計數並進行計算。

請看一下這個鏈接:

在后台應用時通過推送通知更新徽章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM