Aplikasi iOS: bagaimana cara menghapus notifikasi?


109

Saya memiliki aplikasi iOS di mana beberapa Pemberitahuan Push dikirimkan. Masalah saya adalah, bahwa pesan / pemberitahuan tetap berada di Pusat Pemberitahuan di iOS setelah itu disadap. Bagaimana cara menghapus pemberitahuan untuk aplikasi saya di Pusat Pemberitahuan saat aplikasi dibuka lagi?

Saya menemukan posting di mana orang-orang menelepon setApplicationIconBadgeNumberke nilai nol untuk menghapus notifikasi. Itu tampak sangat aneh bagi saya, jadi saya yakin mungkin ada solusi lain?

EDIT1:

Saya mengalami masalah saat menghapus notifikasi. Silakan lihat kode saya di sini:

- (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];
}

Saya menjalankan Aplikasi melalui Xcode. Ketika Aplikasi diminimalkan dan saya memulai Aplikasi menggunakan pemberitahuan di Pusat Pemberitahuan, saya dapat melihat di log, yang didReceiveRemoteNotificationdipanggil dan menggunakan breakpoints saya dapat melihat, bahwa clearNotificationstelah berjalan. Tapi tetap saja notifikasi hang di Notification Center. Mengapa?

Jawaban:


157

Kemungkinan besar karena Pusat Pemberitahuan adalah fitur yang relatif baru, Apple tidak perlu mendorong paradigma baru untuk menghapus pemberitahuan. Jadi sebagai gantinya, mereka bertujuan [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];untuk menghapus pemberitahuan tersebut. Ini mungkin tampak agak aneh, dan Apple mungkin menyediakan cara yang lebih intuitif untuk melakukan ini di masa mendatang, tetapi untuk saat ini cara tersebut resmi.

Saya sendiri, saya menggunakan cuplikan ini:

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

yang tidak pernah gagal untuk menghapus semua pemberitahuan aplikasi dari Pusat Pemberitahuan.


cancelAllLocalNotifications Tidak Berlaku Lagi - developer.apple.com/documentation/uikit/uiapplication/… Anda perlu menggunakan let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews

119

Hanya untuk memperluas jawaban pcperini. Saat dia menyebutkan Anda perlu menambahkan kode berikut ke application:didFinishLaunchingWithOptions:metode Anda ;

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

Anda juga perlu menambah kemudian mengurangi lencana dalam application:didReceiveRemoteNotification:metode Anda jika Anda mencoba untuk menghapus pesan dari pusat pesan sehingga ketika pengguna memasuki aplikasi Anda dari menekan pemberitahuan, pusat pesan juga akan dihapus, yaitu;

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

Saya pikir cancelAllLocalNotifications tidak diperlukan. Berfungsi untuk saya tanpa jalur itu
Murali

@Murali, apakah itu tergantung pada Anda menggunakan pemberitahuan lokal atau tidak ...?
Alejandro Iván

1
UPDATE :: “cancelAllLocalNotifications 'tidak digunakan lagi: pertama kali tidak digunakan lagi di iOS 10.0” Jadi jika versi aplikasi Anda lebih tinggi dari iOS10.0 maka Anda harus menggunakan UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
Pengguna18474728

21

Mungkin juga masuk akal untuk menambahkan panggilan ke clearNotifications di applicationDidBecomeActive sehingga jika aplikasi berada di latar belakang dan kembali, itu juga akan menghapus notifikasi.

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

15

Pembaruan untuk iOS 10 (Swift 3)

Untuk menghapus semua notifikasi lokal di aplikasi iOS 10, Anda harus menggunakan kode berikut:

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()
}

Kode ini menangani pembersihan pemberitahuan lokal untuk iOS 10.x dan semua versi iOS sebelumnya. Anda perlu import UserNotificationsuntuk kode iOS 10.x.


9

Jika Anda memiliki pemberitahuan lokal terjadwal yang tertunda dan tidak ingin menggunakan cancelAllLocalNotificationspemberitahuan lama di Pusat Pemberitahuan, Anda juga dapat melakukan hal berikut:

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

Tampaknya jika Anda menyetelnya scheduledLocalNotificationsmenghapus yang lama di Pusat Pemberitahuan, dan dengan menyetelnya ke dirinya sendiri, Anda mempertahankan pemberitahuan lokal yang tertunda.


1
Ini bekerja seperti pesona bagi saya di iOS 9. Saya tidak ingin membatalkan semua notifikasi saya karena berulang tepat waktu (harian atau mingguan). Dan dengan cara ini saya menghapus semua barang tanpa menghapusnya.
superpuccio

1
Solusi terbaik yang pernah saya lihat sejauh ini. Adakah yang tahu apakah ini berfungsi di iOS 8?
duncanc4

@ duncanc4 terakhir kali saya mengujinya di iOS 8, ternyata berfungsi.
ospr

Di mana di dalam aplikasi Anda akan menyebutnya?
Alex Zavatone

Alex, Anda harus memanggilnya kapan pun Anda perlu menghapus pemberitahuan di Pusat Pemberitahuan. Saya menyebutnya di AppDelegate applicationDidBecomeActive:dan application:didReceiveLocalNotification:metode saya.
ospr

3

Di Swift saya menggunakan kode berikut di dalam AppDelegate saya:

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

3

Jika Anda datang ke sini bertanya-tanya yang sebaliknya (seperti saya), posting ini mungkin cocok untuk Anda.

Saya tidak tahu mengapa notifikasi saya terhapus ketika saya membersihkan lencana ... Saya menaikkan lencana secara manual dan kemudian ingin menghapusnya ketika pengguna memasuki aplikasi. Namun, tidak ada alasan untuk menghapus pusat notifikasi; mereka mungkin masih ingin melihat atau menindaklanjuti pemberitahuan tersebut.

Negatif 1 berhasil, untungnya:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
Apakah ini berfungsi untuk Anda di iOS9? Saya tidak melihat perbedaan apa pun dengan menyetel lencana ke 0 atau -1. Itu masih menghapus semua notifikasi jarak jauh dalam kasus saya.
AlexeyVMP

Ya, saya benar-benar mulai memperhatikannya dengan aplikasi saya lagi; Saya tidak tahu apa yang berubah.
TahoeWolverine

Saya menyerah karena Apple entah bagaimana memutuskan bahwa aplikasi tanpa nomor lencana seharusnya tidak memiliki pemberitahuan
AlexeyVMP

1

Mungkin jika ada alarm terjadwal dan lencana ikon aplikasi yang tidak jelas.

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

Jika Anda memiliki pemberitahuan berulang di masa mendatang, Anda tidak ingin membatalkan pemberitahuan tersebut, Anda dapat menghapus item di pusat pemberitahuan dengan:

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

Anda tidak bisa menghapus notifikasi saat aplikasi Anda terbuka di latar depan dengan memanggil metode di bawah ini segera setelah menerima notifikasi lokal, jika tidak, Anda akan menerima puluhan dari ratusan notifikasi. Mungkin karena notifikasi yang sama berlaku lagi, dan sekarang saatnya untuk menembak, jadi Anda tetap tembak, terapkan lagi, tembak, terapkan ....:

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

0

Ketika Anda keluar dari aplikasi Anda, pada saat itu Anda harus menggunakan baris kode di bawah ini pada metode klik tombol logout Anda.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

dan ini bekerja dengan sempurna di aplikasi saya.


0

Anda perlu menambahkan kode di bawah ini dalam applicationDidBecomeActivemetode AppDelegate Anda .

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

-1

Dapatkan dari sini . Ini berfungsi untuk 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];
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.