iOS uygulaması: bildirimler nasıl temizlenir?


109

Bazı Push Bildirimlerinin gönderildiği bir iOS uygulamam var. Benim sorunum, mesajların / bildirimlerin, dokunulduktan sonra iOS'ta Bildirim Merkezi'nde kalması. Uygulama bir sonraki açışında Bildirim Merkezi'nde başvurum için bir bildirimi nasıl kaldırabilirim?

İnsanların setApplicationIconBadgeNumberbildirimleri temizlemek için sıfır değeri aradıkları gönderilere rastladım . Bu bana çok garip geliyor, bu yüzden başka bir çözümün var olabileceğine inanıyorum.

Edit1:

Bildirimleri temizlemede bazı sorunlar yaşıyorum. Lütfen koduma buradan bakın:

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

Uygulamayı Xcode üzerinden çalıştırıyorum. Uygulama küçültüldüğünde ve Bildirim Merkezi'ndeki bildirimi kullanarak Uygulamayı başlattığımda, günlükte didReceiveRemoteNotificationçağrıldığını ve görebildiğim kesme noktaları kullandığını, çalıştığını görebiliyorum clearNotifications. Ancak bildirim yine de Bildirim Merkezi'nde asılı kalıyor. Neden?

Yanıtlar:


157

Büyük olasılıkla Bildirim Merkezi nispeten yeni bir özellik olduğu için, Apple bildirimleri temizlemek için mutlaka yeni bir paradigma zorlamak istemedi. Bunun yerine, [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];söz konusu bildirimleri temizlemek için çok amaçlı davrandılar . Biraz tuhaf görünebilir ve Apple bunu gelecekte yapmanın daha sezgisel bir yolunu sağlayabilir, ancak şimdilik resmi yol bu.

Ben de bu pasajı kullanıyorum:

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

Bildirim Merkezi'nden uygulamanın tüm bildirimlerini hiçbir zaman temizleyemez.


cancelAllLocalNotifications Kaldırılmış olan - developer.apple.com/documentation/uikit/uiapplication/... Sen kullanmaya gerek let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
Rohit Vipin Mathews

119

Sadece pcperini'nin cevabını genişletmek için. Onun bahsettiği gibi, aşağıdaki kodu application:didFinishLaunchingWithOptions:metodunuza eklemeniz gerekecektir ;

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

Sen de o zaman rozeti azaltma artış gerek application:didReceiveRemoteNotification:bir bildirim mesajı merkezini basarak bir kullanıcı girdiğinde size app böylece mesaj merkezinden mesajı silmek için çalışıyorsanız yöntemiyle de temizlenir, yani;

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

Sanırım cancelAllLocalNotifications gerekli değil. Bu satır olmadan benim için çalıştım
Murali

@Murali, yerel bildirimleri kullanmanıza bağlı mı yoksa değil mi ...?
Alejandro Iván

1
UPDATE :: “cancelAllLocalNotifications 'kullanımdan kaldırıldı: ilk olarak iOS 10.0'da kullanımdan kaldırıldı” Bu nedenle, uygulama sürümünüz iOS10.0'dan yüksekse, bu UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
User18474728

21

Ayrıca applicationDidBecomeActive'de clearNotifications için bir çağrı eklemek mantıklı olabilir, böylece uygulama arka planda olup geri döndüğünde bildirimleri de temizleyecektir.

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

15

İOS 10 güncellemesi (Swift 3)

İOS 10 uygulamalarındaki tüm yerel bildirimleri temizlemek için aşağıdaki kodu kullanmalısınız:

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

Bu kod, iOS 10.x ve iOS'un önceki tüm sürümleri için yerel bildirimlerin temizlenmesini sağlar. import UserNotificationsİOS 10.x kodu için ihtiyacınız olacak .


9

Bekleyen planlanmış yerel bildirimleriniz varsa ve cancelAllLocalNotificationsBildirim Merkezi'nde eskilerini temizlemek için kullanmak istemiyorsanız, aşağıdakileri de yapabilirsiniz:

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

Bunu ayarlarsanız, scheduledLocalNotificationsBildirim Merkezi'nde eskileri temizler ve kendisine ayarlayarak, bekleyen yerel bildirimleri korursunuz.


1
Bu, iOS 9'da benim için bir cazibe gibi çalışıyor. Zamanında (günlük veya haftalık) tekrar ettikleri için tüm bildirimlerimi iptal etmek istemedim. Bu şekilde her şeyi silmeden temizliyorum.
superpuccio

1
Şimdiye kadar gördüğüm en iyi çözüm. İOS 8'de çalışıp çalışmadığını bilen var mı?
duncanc

@ duncanc4 iOS 8'de en son test ettiğimde çalışıyordu.
ospr

Uygulamanın neresinde buna denir?
Alex Zavatone

Alex, Bildirim Merkezindeki bildirimleri ne zaman temizlemen gerekirse onu aramalısın. Benim iki AppDelegate en kimseyi arama applicationDidBecomeActive:ve application:didReceiveLocalNotification:yöntemlerle.
ospr

3

Swift'de AppDelegate'imde şu kodu kullanıyorum:

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

3

Eğer buraya tam tersini merak ederek geliyorsan (benim gibi), bu yazı tam size göre olabilir.

Rozeti sildiğimde bildirimlerimin neden silindiğini anlayamadım ... Rozeti manuel olarak artırıyorum ve ardından kullanıcı uygulamaya girdiğinde temizlemek istiyorum. Ancak bu, bildirim merkezini temizlemek için bir neden değil; yine de bu bildirimleri görmek veya bunlara göre işlem yapmak isteyebilirler.

Negatif 1 hile yapar, neyse ki:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
İOS9'da sizin için çalışıyor mu? Rozeti 0 veya -1 olarak ayarlamada herhangi bir fark görmedim. Hala benim durumumdaki tüm uzak bildirimleri temizliyor.
AlexeyVMP

Evet, bunu uygulamamla tekrar fark etmeye başladım; Neyin değiştiği hakkında hiçbir fikrim yok.
TahoeWolverine

Apple bir şekilde rozet numarası olmayan bu uygulamanın herhangi bir bildirim
almaması

1

Belki programlanmış alarmlar ve temizlenmemiş uygulama simgesi rozetleri olması durumunda.

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

İleride tekrar eden bildirimleriniz olduğunda, bu bildirimleri iptal etmek istemezseniz, şu şekilde bildirim merkezindeki öğeyi temizleyebilirsiniz:

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

Yerel bildirimi aldıktan hemen sonra aşağıdaki yöntemi arayarak uygulamanız ön planda açıldığında bildirimi silemezsiniz, aksi takdirde onlarca yüzlerce bildirim alırsınız. Belki aynı bildirim tekrar geçerli olduğu ve şimdi ateş etme zamanı olduğu için, ateşe devam et, tekrar başvur, ateş et, başvur ...:

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

0

Uygulamanızdan çıkış yaptığınızda, o anda çıkış düğmesi tıklama yönteminizde aşağıdaki kod satırını kullanmanız gerekir.

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

ve bu benim uygulamamda mükemmel çalışıyor.


0

AppDelegate applicationDidBecomeActiveyönteminize aşağıdaki kodu eklemeniz gerekir .

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

-1

Buradan aldım . İOS 9 için çalışıyor

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];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.