แอปพลิเคชัน iOS: จะล้างการแจ้งเตือนได้อย่างไร


109

ฉันมีแอปพลิเคชัน iOS ที่มีการส่ง Push Notification ไปที่ ปัญหาของฉันคือข้อความ / การแจ้งเตือนยังคงอยู่ในศูนย์การแจ้งเตือนใน 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];

ซึ่งจะไม่ล้มเหลวในการล้างการแจ้งเตือนทั้งหมดของแอพจากศูนย์การแจ้งเตือน


ยกเลิก AllLocalNotifications เลิกใช้งาน - 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];

ฉันคิดว่าไม่จำเป็นต้องใช้การแจ้งเตือนยกเลิก AllLocalNotifications ทำงานให้ฉันโดยไม่มีบรรทัดนั้น
Murali

@ มูราลีจะขึ้นอยู่กับคุณใช้การแจ้งเตือนในพื้นที่หรือไม่ ... ?
Alejandro Iván

1
อัปเดต :: "ยกเลิก AllLocalNotifications" เลิกใช้แล้ว: เลิกใช้ครั้งแรกใน iOS 10.0 "ดังนั้นหากเวอร์ชันแอปของคุณสูงกว่า iOS10.0 คุณควรใช้ UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [ศูนย์ removeAllDeliveryNotifications]; [ศูนย์ removeAllPendingNotificationRequests];
User18474728

21

นอกจากนี้ยังอาจเหมาะสมที่จะเพิ่มการโทรเพื่อ clearNotifications ใน applicationDidBecomeActive เพื่อที่ว่าในกรณีที่แอปพลิเคชันอยู่ในพื้นหลังและกลับมาการแจ้งเตือนจะเป็นการล้างการแจ้งเตือนด้วย

- (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 UserNotificationsใช้รหัส iOS 10.x


9

หากคุณมีการแจ้งเตือนในพื้นที่ที่รอดำเนินการอยู่และไม่ต้องการใช้cancelAllLocalNotificationsเพื่อล้างข้อมูลเก่าในศูนย์การแจ้งเตือนคุณสามารถทำสิ่งต่อไปนี้ได้:

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

ดูเหมือนว่าถ้าคุณตั้งค่าscheduledLocalNotificationsมันจะล้างข้อมูลเก่าในศูนย์การแจ้งเตือนและด้วยการตั้งค่าเป็นตัวเองคุณจะยังคงมีการแจ้งเตือนในเครื่องที่รอดำเนินการอยู่


1
สิ่งนี้เป็นเสน่ห์สำหรับฉันใน iOS 9 ฉันไม่ต้องการยกเลิกการแจ้งเตือนทั้งหมดเพราะการแจ้งเตือนซ้ำในเวลา (รายวันหรือรายสัปดาห์) และด้วยวิธีนี้ฉันจะล้างข้อมูลทั้งหมดโดยไม่ต้องลบออก
superpuccio

1
ทางออกที่ดีที่สุดที่ฉันเคยเห็นมา ใครทราบว่ามันทำงานบน iOS 8 ได้หรือไม่?
duncanc4

@ duncanc4 ครั้งสุดท้ายที่ฉันทดสอบบน iOS 8 มันใช้งานได้
ospr

คุณจะเรียกสิ่งนี้ว่าในแอปนี้ที่ไหน
Alex Zavatone

อเล็กซ์คุณควรโทรหาทุกครั้งที่ต้องการล้างการแจ้งเตือนในศูนย์การแจ้งเตือน ฉันเรียกมันทั้งใน AppDelegate applicationDidBecomeActive:และapplication:didReceiveLocalNotification:วิธีการของฉัน
ospr

3

ใน Swift ฉันใช้รหัสต่อไปนี้ใน AppDelegate ของฉัน:

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

3

หากคุณมาที่นี่แล้วสงสัยว่าตรงกันข้าม (เหมือนที่ฉันเคยเป็น) โพสต์นี้อาจเหมาะกับคุณ

ฉันคิดไม่ออกว่าเหตุใดการแจ้งเตือนของฉันจึงถูกล้างเมื่อฉันล้างป้าย ... ฉันเพิ่มตราด้วยตนเองจากนั้นจึงต้องการล้างเมื่อผู้ใช้เข้าสู่แอป นั่นไม่ใช่เหตุผลที่จะต้องเคลียร์ศูนย์การแจ้งเตือน พวกเขาอาจยังต้องการดูหรือดำเนินการกับการแจ้งเตือนเหล่านั้น

Negative 1 ทำเคล็ดลับโชคดี:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
มันใช้ได้กับคุณใน iOS9 หรือไม่? ฉันไม่สังเกตเห็นความแตกต่างใด ๆ กับการตั้งค่าป้ายเป็น 0 หรือถึง -1 มันยังคงล้างการแจ้งเตือนระยะไกลทั้งหมดในกรณีของฉัน
AlexeyVMP

ฉันเริ่มสังเกตเห็นสิ่งนั้นกับแอปของฉันอีกครั้ง ฉันไม่รู้ว่ามีอะไรเปลี่ยนแปลง
TahoeWolverine

ฉันยอมแพ้ตั้งแต่ Apple ตัดสินใจว่าแอปที่ไม่มีหมายเลขตราไม่ควรมีการแจ้งเตือนใด ๆ
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

คุณต้องเพิ่มโค้ดด้านล่างในapplicationDidBecomeActiveเมธอดAppDelegate ของคุณ

[[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.