2012-02-12 31 views
6

Tôi đã thiết lập thông báo cục bộ lặp lại mỗi phút, tuy nhiên, tôi cần số huy hiệu ứng dụng để tăng mỗi lần. Khi tôi chạy nó tại thời điểm nó dường như không tăng, nó chỉ ở lại 1. Xin vui lòng ai đó có thể giúp tôi ra?Cách tăng số hiệu ứng dụng cho thông báo địa phương định kỳ (iPhone)

Dưới đây là cách tôi tạo ra các thông báo:

// Create the UILocalNotification 
UILocalNotification *myNotification = [[UILocalNotification alloc] init]; 
myNotification.alertBody = @"Blah blah blah..."; 
myNotification.alertAction = @"Blah"; 
myNotification.soundName = UILocalNotificationDefaultSoundName; 
myNotification.applicationIconBadgeNumber++; 
myNotification.timeZone = [NSTimeZone defaultTimeZone]; 
myNotification.repeatInterval = NSMinuteCalendarUnit; 
myNotification.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:myNotification]; 
+0

Bạn có thể gửi một số mã? – HeikoG

+0

@HeikoG Tôi đã thêm mã tôi sử dụng để tạo thông báo. –

+0

@ TheCrazyChimp bạn đã bao giờ tìm ra giải pháp cho vấn đề này chưa? –

Trả lời

18

Sau khi thực hiện rất nhiều của nghiên cứu tôi đã tìm ra giải pháp là không có giải pháp:

iPhone: Incrementing the application badge through a local notification

Nó không thể cập nhật tự động số huy hiệu với các thông báo địa phương trong khi ứng dụng của bạn đang ở chế độ nền. Bạn phải sử dụng thông báo đẩy.

+5

Trong khi câu trả lời này là đúng về mặt kỹ thuật, bạn thực sự có thể thực hiện những gì The Crazy Chimp muốn làm với một công việc nhỏ hơn bằng cách sử dụng cá thể UIApplication được chia sẻ.Mỗi lần bạn lên lịch thông báo địa phương mới hoặc tải ứng dụng, bạn có thể sử dụng thuộc tính 'scheduledLocalNotifications' và thuộc tính 'cancelAllLocalNotifications' để hủy tất cả thông báo trong tương lai và gán lại số lượng huy hiệu cho thông báo địa phương trong tương lai bằng cách liệt kê chúng theo thứ tự thời gian & tăng số huy hiệu bạn chỉ định. Không dễ dàng như gõ ứng dụngBadgeNumber ++, nhưng nó hoạt động. – BFar

+0

+1 nhận xét của người dùng này. Tôi đã thử nghiệm phương pháp này và nó hoạt động. Dưới đây là một giải thích hoàn chỉnh hơn về việc triển khai: http://stackoverflow.com/a/15461328/2546416 –

+1

nhưng điều đó sẽ không hoạt động nếu bạn đang sử dụng repeatInterval .. nếu ứng dụng của bạn không bao giờ được bắt đầu lại và bạn không thể dự đoán giá trị huy hiệu (vì bạn đang có khoảng thời gian lặp lại hàng ngày) thì bạn không thể tăng thêm ... –

-1

Cố gắng một cái gì đó như:

int plusOne = [myNotification.applicationIconBadgeNumber intValue]; 
plusOne++; 

myNotification.applicationIconBadgeNumber = plusOne; 
+0

Thật không may điều này đã không làm việc cho tôi - cảm ơn cho đề nghị mặc dù. –

-1

này nên làm việc.

myNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; 
+1

Không, người đàn ông. Nó hoạt động hiếm khi – fnc12

0

Trong khi không có phương thức applicationIconBadgeNumber++ đơn giản nào, như BFar đã đề cập, bạn có thể đạt được những gì bạn đang yêu cầu bằng cách cập nhật tất cả ứng dụng UILocalNotifications được lập lịch 'ApplicationIconBadgeNumbers bất cứ khi nào thông báo được thêm hoặc xóa.

Trong khi này sẽ không hoạt động nếu bạn có thông báo rằng sử dụng repeatInterval, chừng nào bạn gọi scheduleNotificationdecrementBadgeNumber vào đúng thời điểm, lớp dưới đây sẽ làm các trick.

@implementation NotificationScheduler 

+ (void) scheduleNotification:(NSString*)message date:(NSDate*)date { 
    UIApplication *app = [UIApplication sharedApplication]; 
    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    if (notification) { 
     notification.fireDate = date; 
     notification.timeZone = [NSTimeZone defaultTimeZone]; 

     notification.alertBody = message; 
     notification.soundName = UILocalNotificationDefaultSoundName; 
     notification.applicationIconBadgeNumber = [self getExpectedApplicationIconBadgeNumber:date]; 

     [app scheduleLocalNotification:notification]; 
     [self updateBadgeCountsForQueuedNotifiations]; 
    } 
} 

+ (void) decrementBadgeNumber:(long)amount { 
    [self setCurrentBadgeNumber:([self getCurrentBadgeNumber] - amount)]; 
    [self updateBadgeCountsForQueuedNotifiations]; 
} 

+ (long) getExpectedApplicationIconBadgeNumber:(NSDate*)notificationDate { 
    long number = [self getCurrentBadgeNumber]; 
    for (UILocalNotification *notice in [self getScheduledLocalNotifications]) { 
     if (notice.fireDate <= notificationDate) { 
      number++; 
     } 
    } 
    return number; 
} 

+ (void) updateBadgeCountsForScheduledNotifiations { 
    long expectedBadgeNumber = [self getCurrentBadgeNumber]; 
    NSArray *allLocalNotifications = [self getScheduledLocalNotifications]; 
    for (UILocalNotification *notice in allLocalNotifications) { 
     expectedBadgeNumber++; 
     notice.applicationIconBadgeNumber = expectedBadgeNumber; 
    } 
    [[UIApplication sharedApplication] setScheduledLocalNotifications:allLocalNotifications]; 
} 

+ (long) getCurrentBadgeNumber { 
    return [UIApplication sharedApplication].applicationIconBadgeNumber; 
} 

+ (void) setCurrentBadgeNumber:(long)number { 
    [UIApplication sharedApplication].applicationIconBadgeNumber = number; 
} 

+ (NSArray*) getScheduledLocalNotifications { 
    NSSortDescriptor * fireDateDesc = [NSSortDescriptor sortDescriptorWithKey:@"fireDate" ascending:YES]; 
    return [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingDescriptors:@[fireDateDesc]]; 
} 

@end 
+0

thiếu phương thức updateBadgeCountsForQueuedNotifiations ... vui lòng cập nhật ... –

1

Nếu bạn sử dụng dịch vụ bên ngoài như Parse for Push, việc này nên dễ dàng thực hiện. Chỉ cần tăng Phân tích cú pháp số huy hiệu khi thông báo địa phương được kích hoạt. Mặc dù, đây là một trường hợp đặc biệt.

-1

Hãy thử điều này ... nó làm việc cho tôi trong kịch bản đơn giản ...

notification.applicationIconBadgeNumber = [UIApplication sharedApplication].scheduledLocalNotifications.count + 1; 

Và đừng quên để thiết lập biểu tượng huy hiệu trở về 0 khi ứng dụng khởi động.

0

tôi đã có thể làm điều đó bằng cách sử dụng dòng sau khi lịch trình thông báo địa phương

localNotification.applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber + 1; 

và ở đầu bên kia trong appdelegate

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { 

    application.applicationIconBadgeNumber -= 1; 
} 
Các vấn đề liên quan