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?

dhrm
sumber

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.

Patrick Perini
sumber
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];
ADAM
sumber
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];
}
bert
sumber
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.

James Stonehill
sumber
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.

ospr
sumber
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()
}
Antoine
sumber
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;
TahoeWolverine
sumber
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];
Jong Su Park
sumber
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;
zgjie
sumber
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.

Vaibhav Shiledar
sumber
0

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
Bhavesh Patel
sumber
-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];
}
Dan L
sumber