iOS 애플리케이션 : 알림을 지우는 방법?


109

일부 푸시 알림이 전송되는 iOS 애플리케이션이 있습니다. 내 문제는 메시지 / 알림이 iOS의 알림 센터에 남아 있다는 것입니다. 다음에 애플리케이션이 열릴 때 알림 센터에서 애플리케이션에 대한 알림을 제거하려면 어떻게해야합니까?

사람들이 setApplicationIconBadgeNumber알림을 지우기 위해 0 값으로 전화 하는 게시물을 보았습니다. 그것은 나에게 매우 이상해 보이므로 다른 해결책이 존재할 수 있다고 생각합니까?

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실행 되었음을 확인할 수 있습니다 . 그러나 여전히 알림은 알림 센터에서 멈 춥니 다. 왜?

답변:


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 Mathews

119

pcperini의 답변을 확장하십시오. 그가 언급했듯이 application:didFinishLaunchingWithOptions:메서드에 다음 코드를 추가해야합니다 .

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

당신은 또한 다음의 배지를 감소 증가 할 필요가 application:didReceiveRemoteNotification:당신은 통지에게 메시지 센터를 눌러에서 사용자가 입력 할 때 앱되도록 메시지 센터에서 메시지를 삭제하려는 경우 방법 것 또한 분명, 즉;

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

나는 cancelAllLocalNotifications가 필요하지 않다고 생각한다. 그 줄없이 나를 위해
Murali

@Murali는 로컬 알림 을 사용하는지 여부에 달려 있습니까?
Alejandro Iván

1
업데이트 ::“cancelAllLocalNotifications '는 더 이상 사용되지 않습니다. iOS 10.0에서는 처음 사용되지 않습니다.”따라서 앱 버전이 iOS10.0보다 높으면이 UNUserNotificationCenter를 사용해야합니다. * center = [UNUserNotificationCenter currentNotificationCenter]; [center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
User18474728

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 2015

앱 내에서 이것을 어디라고 부르겠습니까?
Alex Zavatone 2016 년

Alex, 알림 센터에서 알림을 지워야 할 때마다 전화해야합니다. 내 AppDelegate applicationDidBecomeActive:application:didReceiveLocalNotification:메서드 모두에서 호출합니다 .
ospr 16.01.15

3

Swift에서는 AppDelegate에서 다음 코드를 사용하고 있습니다.

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

3

당신이 (내가 그랬던 것처럼) 그 반대를 궁금해 여기에 오 셨다면, 포스트가 당신을위한 것일 수 있습니다.

배지를 지 웠을 때 알림이 지워지는 이유를 알 수 없었습니다 ... 배지를 수동으로 늘린 다음 사용자가 앱에 들어갈 때 지우고 싶습니다. 그렇다고 알림 센터를 정리할 이유가 없습니다. 여전히 이러한 알림을 보거나 조치를 취하기를 원할 수 있습니다.

운 좋게도 음수 1은 트릭을 수행합니다.

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
iOS9에서 작동합니까? 나는 배지를 0 또는 -1로 설정하는 것과 어떤 차이도 느끼지 못했습니다. 제 경우에는 여전히 모든 원격 알림을 지 웁니다.
AlexeyVMP

Ya, 나는 실제로 내 앱에서 그것을 다시 알아 차리기 시작했다. 나는 무엇이 바뀌 었는지 전혀 모른다.
TahoeWolverine

내가 애플 때문에 포기하는거야 어떻게 든없는 배지 번호와 응용 프로그램이 더 알림이 있어야하지 않는다 결정
AlexeyVMP

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.