web-dev-qa-db-ja.com

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

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

通知をクリアするために、人々がsetApplicationIconBadgeNumberをゼロ値で呼び出している投稿に出会いました。それは私にとって非常に奇妙に思えるので、おそらく別の解決策が存在すると思いますか?

EDIT1:

通知のクリアに問題があります。ここに私のコードを見てください:

- (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が実行されたことを確認できるブレークポイントを使用できます。 。ただし、通知は引き続き通知センターでハングします。どうして?

107
dhrm

おそらく、通知センターは比較的新しい機能であるため、Appleは必ずしも通知をクリアするためのまったく新しいパラダイムをプッシュする必要はありませんでした。そのため、代わりに[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];を使用して、通知をクリアしました。少し奇妙に思えるかもしれませんし、Appleは将来これを行うためのより直感的な方法を提供するかもしれませんが、当面は公式の方法です。

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

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

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

156
Patrick Perini

Pcperiniの答えを拡張するだけです。彼が言及したように、次のコードをapplication:didFinishLaunchingWithOptions:メソッドに追加する必要があります。

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

Alsoメッセージセンターからメッセージを消去しようとする場合、application:didReceiveRemoteNotification:メソッドでバッジをインクリメントしてデクリメントする必要があるセンターもクリアされます。

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

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

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

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のローカル通知の消去を処理します。 iOS 10.xコードでは、import UserNotificationsが必要です。

15
James Stonehill

保留中のローカルスケジュール通知があり、cancelAllLocalNotificationsを使用して通知センターの古い通知をクリアしたくない場合は、次のこともできます。

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

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

9
ospr

反対のことを考えてここに来ている場合(私がそうであったように)、 this postがあなたのためかもしれません。

バッジをクリアしたときに通知がクリアされた理由がわかりませんでした...バッジを手動でインクリメントし、ユーザーがアプリに入ったときにそれをクリアしたいです。ただし、通知センターを削除する理由はありません。彼らはまだそれらの通知を見たり行動したいかもしれません。

ネガティブ1は幸運にもこのトリックを行います:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;
3
TahoeWolverine

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

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

スケジュールされたアラームと未確認のアプリアイコンバッジがある場合があります。

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

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

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

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

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

アプリがフォアグラウンドで開いている場合、ローカル通知を受信した直後に以下のメソッドを呼び出して通知をクリアすることはできません。そうしないと、数万の通知を受信します。おそらく同じ通知が再び適用され、今が発砲のタイミングであるため、発砲し続け、再度発砲し、発砲し、適用します。

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

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
0
Bhavesh Patel

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

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

0