Ứng dụng iOS: Làm thế nào để xóa thông báo?


109

Tôi có một ứng dụng iOS nơi một số Thông báo đẩy được gửi đến. Vấn đề của tôi là các tin nhắn / thông báo vẫn nằm trong Trung tâm thông báo trong iOS sau khi được nhấn. Làm cách nào để xóa thông báo cho ứng dụng của tôi trong Trung tâm thông báo vào lần tiếp theo ứng dụng mở ra?

Tôi đã xem các bài đăng mà mọi người đang gọi setApplicationIconBadgeNumberđến giá trị 0 để xóa thông báo. Điều đó có vẻ rất kỳ lạ đối với tôi, vì vậy tôi tin rằng có thể có một giải pháp khác?

CHỈNH SỬA1:

Tôi đang gặp một số sự cố khi xóa thông báo. Vui lòng xem mã của tôi tại đây:

- (void) clearNotifications {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions != nil)
    {
        NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (dictionary != nil)
        {
            NSLog(@"Launched from push notification: %@", dictionary);

            [self clearNotifications];
        }
    }

    return YES;
}

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{    
    NSLog(@"Received notification: %@", userInfo);
    [self clearNotifications];
}

Tôi đang chạy Ứng dụng thông qua Xcode. Khi Ứng dụng được thu nhỏ và tôi khởi động Ứng dụng bằng thông báo trong Trung tâm thông báo, tôi có thể thấy trong nhật ký, rằng ứng dụng didReceiveRemoteNotificationđược gọi và sử dụng các điểm ngắt mà tôi có thể thấy, rằng ứng dụng clearNotificationsđã chạy. Nhưng thông báo vẫn bị treo trong Trung tâm thông báo. Tại sao?

Câu trả lời:


157

Nhiều khả năng là do Trung tâm thông báo là một tính năng tương đối mới, nên Apple không nhất thiết muốn thúc đẩy một mô hình hoàn toàn mới để xóa thông báo. Vì vậy, thay vào đó, họ đa mục đích [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];để xóa các thông báo đã nói. Nó có vẻ hơi kỳ lạ và Apple có thể cung cấp một cách trực quan hơn để làm điều này trong tương lai, nhưng hiện tại thì đó là cách chính thức.

Bản thân tôi, tôi sử dụng đoạn mã này:

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

mà không bao giờ không xóa tất cả các thông báo của ứng dụng khỏi Trung tâm thông báo.


hủyAllLocalNotifications không được chấp nhận - developer.apple.com/documentation/uikit/uiapplication/… Bạn cần sử dụng let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews

119

Chỉ để mở rộng câu trả lời của pcperini. Khi anh ấy đề cập, bạn sẽ cần thêm mã sau vào application:didFinishLaunchingWithOptions:phương pháp của mình ;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

Bạn cũng cần phải tăng sau đó giảm huy hiệu trong application:didReceiveRemoteNotification:phương pháp của mình nếu bạn đang cố xóa thông báo khỏi trung tâm thông báo để khi người dùng vào ứng dụng của bạn từ việc nhấn thông báo, trung tâm thông báo cũng sẽ xóa, tức là;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

Tôi nghĩ cancelAllLocalNotifications không được required.Worked cho tôi mà không cần dòng đó
Murali

@Murali sẽ phụ thuộc vào bạn có sử dụng thông báo cục bộ hay không ...?
Alejandro Iván

1
CẬP NHẬT :: “celAllLocalNotifications ”không được dùng nữa: lần đầu tiên không được dùng trong iOS 10.0” Vì vậy, nếu phiên bản ứng dụng của bạn cao hơn iOS10.0 thì bạn nên sử dụng UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
Người dùng18474728

21

Cũng có thể hợp lý khi thêm một cuộc gọi đến clearNotifications trong applicationDidBecomeActive để trong trường hợp ứng dụng đang ở chế độ nền và quay lại, nó cũng sẽ xóa các thông báo.

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self clearNotifications];
}

15

Cập nhật cho iOS 10 (Swift 3)

Để xóa tất cả thông báo cục bộ trong ứng dụng iOS 10, bạn nên sử dụng mã sau:

import UserNotifications

...

if #available(iOS 10.0, *) {
    let center = UNUserNotificationCenter.current()
    center.removeAllPendingNotificationRequests() // To remove all pending notifications which are not delivered yet but scheduled.
    center.removeAllDeliveredNotifications() // To remove all delivered notifications
} else {
    UIApplication.shared.cancelAllLocalNotifications()
}

Mã này xử lý việc xóa các thông báo cục bộ cho iOS 10.x và tất cả các phiên bản iOS trước đó. Bạn sẽ cần import UserNotificationsmã iOS 10.x.


9

Nếu bạn có các thông báo cục bộ đã lên lịch đang chờ xử lý và không muốn sử dụng cancelAllLocalNotificationsđể xóa các thông báo cũ trong Trung tâm thông báo, bạn cũng có thể làm như sau:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

Có vẻ như nếu bạn đặt, scheduledLocalNotificationsnó sẽ xóa các thông báo cũ trong Trung tâm thông báo và bằng cách đặt thành chính nó, bạn giữ lại các thông báo cục bộ đang chờ xử lý.


1
Điều này hoạt động như một sự quyến rũ đối với tôi trên iOS 9. Tôi không muốn hủy tất cả các thông báo của mình vì chúng lặp lại không đúng lúc (hàng ngày hoặc hàng tuần). Và bằng cách này, tôi xóa tất cả nội dung mà không xóa chúng.
superpuccio,

1
Giải pháp tốt nhất mà tôi đã thấy cho đến nay. Bất cứ ai biết nếu nó hoạt động trên iOS 8?
duncanc

@ duncanc4 lần trước tôi đã thử nghiệm nó trên iOS 8, nó đang hoạt động.
ospr

Bạn sẽ gọi cái này ở đâu trong ứng dụng?
Alex Zavatone

Alex, bạn nên gọi nó bất cứ khi nào bạn cần xóa thông báo trong Trung tâm thông báo. Tôi gọi nó trong cả AppDelegate's applicationDidBecomeActive:application:didReceiveLocalNotification:method của tôi.
ospr

3

Trong Swift, tôi đang sử dụng mã sau bên trong AppDelegate của mình:

func applicationDidBecomeActive(application: UIApplication) {
    application.applicationIconBadgeNumber = 0
    application.cancelAllLocalNotifications()
}

3

Nếu bạn đang đến đây tự hỏi điều ngược lại (như tôi), bài đăng này có thể dành cho bạn.

Tôi không thể tìm ra lý do tại sao thông báo của tôi lại bị xóa khi tôi xóa huy hiệu ... Tôi tăng huy hiệu theo cách thủ công và sau đó muốn xóa nó khi người dùng truy cập ứng dụng. Tuy nhiên, không có lý do gì để xóa trung tâm thông báo; họ có thể vẫn muốn xem hoặc hành động trên các thông báo đó.

Tiêu cực 1 thực hiện thủ thuật, may mắn là:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
Nó có hoạt động với bạn trong iOS9 không? Tôi không nhận thấy bất kỳ sự khác biệt nào khi đặt huy hiệu thành 0 hoặc -1. Nó vẫn xóa tất cả các thông báo từ xa trong trường hợp của tôi.
AlexeyVMP

Ya, tôi thực sự bắt đầu nhận thấy điều đó một lần nữa với ứng dụng của mình; Tôi không biết điều gì đã thay đổi.
TahoeWolverine

Tôi từ bỏ kể từ khi Apple bằng cách nào đó quyết định rằng ứng dụng không có số huy hiệu nên không có bất kỳ thông báo
AlexeyVMP

1

Có thể trong trường hợp có báo thức đã lên lịch và huy hiệu biểu tượng ứng dụng không rõ ràng.

NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications];
NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber];

[application cancelAllLocalNotifications];
[application setApplicationIconBadgeNumber:0];

for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
    [application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];

0

Khi bạn có nhiều thông báo trong tương lai, bạn không muốn hủy những thông báo đó, bạn có thể xóa mục đó trong trung tâm thông báo bằng cách:

func clearNotificationCenter() {
    UIApplication.sharedApplication().applicationIconBadgeNumber = 1
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0
}

Bạn không thể xóa thông báo khi ứng dụng của bạn đang mở ở chế độ nền bằng cách gọi phương thức bên dưới ngay sau khi nhận được thông báo cục bộ, nếu không, bạn sẽ nhận được hàng chục trăm thông báo. Có thể do lại áp dụng cùng một thông báo, và giờ là lúc khai hỏa, nên bạn tiếp tục áp dụng, đăng ký lại, kích hoạt, áp dụng ....:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

0

Khi bạn đăng xuất khỏi ứng dụng của mình, tại thời điểm đó bạn phải sử dụng dòng mã bên dưới trên phương pháp nhấp vào nút đăng xuất.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

và điều này hoạt động hoàn hảo trong ứng dụng của tôi.


0

Bạn cần thêm mã bên dưới vào applicationDidBecomeActivephương thức AppDelegate của mình .

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

-1

Nhận nó từ đây . Nó hoạt động cho iOS 9

UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
{
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
    //Cancelling local notification
    [app cancelLocalNotification:oneEvent];
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.