iOSアプリケーション:通知をクリアする方法?


109

一部のプッシュ通知が送信されるiOSアプリケーションがあります。私の問題は、メッセージ/通知がタップされた後、iOSの通知センターにとどまることです。次回アプリケーションが開いたときに、通知センターでアプリケーションの通知を削除するにはどうすればよいですか?

setApplicationIconBadgeNumber通知を消去するために人々がゼロ値を要求している投稿に出くわしました。それは私には非常に奇妙に思われるので、おそらく別の解決策が存在すると思いますか?

編集1:

通知の消去に問題があります。ここに私のコードを参照してください:

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

Xcodeを介してアプリを実行しています。アプリが最小化されており、通知センターの通知を使用してアプリを起動すると、ログでdidReceiveRemoteNotificationが呼び出され、ブレークポイントを使用してclearNotificationsが実行されたことがわかります。しかし、それでも通知は通知センターでハングします。どうして?

回答:


157

ほとんどの場合、通知センターは比較的新しい機能であるため、Appleは必ずしも通知をクリアするためのまったく新しいパラダイムを推進したくありませんでした。したがって、代わりに、彼ら[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];は言った通知をクリアするために多目的でした。少し奇妙に思えるかもしれませんが、Appleはこれをより直感的に行う方法を将来的に提供するかもしれませんが、当面は公式の方法です。

私自身、私はこのスニペットを使用します:

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

通知センターからアプリのすべての通知をクリアするのに失敗することはありません。


cancelAllLocalNotifications推奨されていません- developer.apple.com/documentation/uikit/uiapplication/... あなたが使用する必要が let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
のRohit Vipinマシューズ

119

pcperiniの答えを詳しく説明します。彼が言及するように、application:didFinishLaunchingWithOptions:メソッドに次のコードを追加する必要があります。

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

あなたはまた、あなたにバッジをデクリメントその後、インクリメントする必要がありapplication:didReceiveRemoteNotification:ますが、ユーザーが入力したときに、通知にメッセージセンターを押してから、APPように、メッセージ・センターからのメッセージをクリアしようとしている場合の方法、すなわち、も明らかだろう。

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

cancelAllLocalNotificationsは不要だと思います。そのラインなしで私のために働きました
Murali

@Muraliはローカル通知を使用するかどうかに依存しますか...?
AlejandroIván2015年

1
UPDATE ::“ cancelAllLocalNotifications 'is deprecated:first deprecated in iOS 10.0”したがって、アプリのバージョンがiOS10.0より高い場合は、このUNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]を使用する必要があります。[center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
User18474728 2018

21

applicationDidBecomeActiveにclearNotificationsへの呼び出しを追加することも意味があります。これにより、アプリケーションがバックグラウンドで戻ってきた場合に通知もクリアされます。

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

15

iOS 10(Swift 3)のアップデート

iOS 10アプリのすべてのローカル通知をクリアするには、次のコードを使用する必要があります。

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

このコードは、iOS 10.xおよびそれ以前のすべてのバージョンのiOSのローカル通知のクリアを処理します。あなたはimport UserNotificationsiOS 10.xコードのために必要になります。


9

保留中のスケジュールされたローカル通知がありcancelAllLocalNotifications、通知センターで古い通知を消去したくない場合は、次の操作も実行できます。

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

設定するscheduledLocalNotificationsと、通知センターの古い通知がクリアされ、それ自体を設定することで、保留中のローカル通知が保持されるようです。


1
これは、iOS 9での私の魅力のように機能します。通知が時間内(毎日または毎週)に繰り返されるため、すべての通知をキャンセルしたくありませんでした。この方法で、削除せずにすべてのものをクリアします。
superpuccio 2015年

1
私がこれまで見てきた最善の解決策。それがiOS 8で動作するかどうか誰でも知っていますか?
duncanc4

@ duncanc4前回iOS 8でテストしたところ、機能していた。
ospr

アプリ内のどこにこれを呼びますか?
Alex Zavatone

アレックス、通知センターで通知をクリアする必要があるときはいつでも呼び出す必要があります。AppDelegate applicationDidBecomeActive:application:didReceiveLocalNotification:メソッドの両方で呼び出します。
ospr 2016年

3

Swiftでは、AppDelegate内で次のコードを使用しています。

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

3

ここに来て反対のことを思っているなら(私がそうでしたように)、この投稿はあなたのためかもしれません。

バッジをクリアしたときに通知がクリアされた理由を理解できませんでした...手動でバッジをインクリメントし、ユーザーがアプリにアクセスしたときにそれをクリアしたいと考えています。ただし、通知センターを一掃する必要はありません。彼らはまだそれらの通知を見たり、行動したいかもしれません。

負の1は幸運にもトリックを行います:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
iOS9で動作しますか?バッジを0または-1に設定しても違いはわかりませんでした。それでも私の場合はすべてのリモート通知がクリアされます。
AlexeyVMP 2016

ええ、私は実際に自分のアプリで再びそれに気づき始めました。何が変わったのか分かりません。
TahoeWolverine 2016年

Appleがバッジ番号のないアプリには通知を表示しないように決定したため、私はあきらめました
AlexeyVMP 2016年

1

多分、予定されたアラームとクリアされていないアプリアイコンバッジがあるかもしれません。

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

今後、通知を繰り返した場合、それらの通知をキャンセルしたくない場合は、次の方法で通知センターのアイテムをクリアできます。

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

アプリがフォアグラウンドで開いている場合、ローカル通知を受け取った直後に以下のメソッドを呼び出して通知をクリアすることはできません。そうしないと、何千もの通知を受け取ります。たぶん、同じ通知が再度適用され、今が発砲の時なので、発砲を維持し、再度適用し、発砲し、適用します。

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

0

アプリからログアウトするときは、そのとき、ログアウトボタンのクリックメソッドで以下のコード行を使用する必要があります。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

これは私のアプリで完全に機能します。


0

AppDelegate applicationDidBecomeActiveメソッドに以下のコードを追加する必要があります。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

-1

ここからだ。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];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.