2012-05-18 40 views
9

Có thể thực hiện việc này không? UIApplication'sscheduledLocalNotifications dường như không trả lại các thông báo đã được gửi đến trung tâm thông báo của người dùng, vì vậy tôi nghĩ điều này có thể do thiết kế, nhưng tôi không thể tìm thấy bất kỳ bằng chứng nào được ghi nhận về điều này.Loại bỏ UILocalNotification đã được phân phối?

Có ai biết không?

Cảm ơn!

EDIT: Tìm thấy này:

Bạn có thể hủy bỏ một thông báo lịch trình cụ thể bằng cách gọi cancelLocalNotification: trên đối tượng ứng dụng, và bạn có thể hủy tất cả thông báo kế hoạch bằng cách gọi cancelAllLocalNotifications. Cả hai phương pháp này cũng lập trình miễn nhiệm một hiện

đây: http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

Tuy nhiên, làm thế nào để tôi nhận được một tham chiếu đến một thông báo đã giao tận, nếu scheduledLocalNotifications không cho tôi thông báo rằng đã được đã giao hàng?

EDIT 2:

Dưới đây là những gì tôi đang cố gắng để làm, sau khi tôi đã đăng ký một số thông báo:

UIApplication *app = [UIApplication sharedApplication]; 

for (UILocalNotification *localNotification in app.scheduledLocalNotifications) 
{ 
    if (someCondition) { 
      [app cancelLocalNotification:localNotification]; 
     } 
    } 
} 

Vấn đề là một khi họ đang cung cấp, họ không còn trong 'scheduledLocalNotifications'.

+0

bạn có thể hiển thị một số mã, cách bạn đang sử dụng không? – rishi

+0

Chắc chắn, chỉ cần cập nhật câu hỏi với một số mã. – elsurudo

Trả lời

9

bạn có thể giải quyết điều này bằng cách bổ sung thêm các thông báo mới được tạo vào riêng NSMutableArray lại thông báo và kiểm tra mảng thay vì app.scheduledLocalNotifications. Một cái gì đó như thế này:

Thêm NSMutableArray vào Viewcontrollers của bạn.h file:

NSMutableArray *currentNotifications; 

Tiến hành nó khi khởi ViewController bạn

currentNotifications = [[NSMutableArray alloc] init]; 

Khi bắt đầu một thông báo, cũng thêm nó vào mảng của bạn:

UILocalNotification *notification = [[UILocalNotification alloc] init]; 
... 
[currentNotifications addObject:notification]; 
[[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 

Sau này khi bạn muốn hủy bỏ thông báo rằng , hãy tìm nó trong mảng của bạn để thay thế. Đồng thời xóa nó khỏi mảng của bạn:

for (UILocalNotification *notification in currentNotifications) { 
    if (someCondition) { 
     [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
     [currentNotifications removeObject:notification]; 
    } 
} 
+1

Thao tác này sẽ hoạt động miễn là ứng dụng của bạn vẫn tồn tại. Ngay khi nó từ chức, 'currentNotifications' sẽ là bánh mì nướng. Tôi muốn có một cách để liệt kê các thông báo đã gửi, @elsurudo. – steveluscher

+0

Đây chỉ là một tác phẩm xung quanh –

+0

điều này không hoạt động đối với tôi với ios 9.3.5, thông báo vẫn nằm trong trung tâm thông báo –

1

Hãy thử liên kết này:

Apple doc

Some tutorial

Và địa phương thông báo được đăng ký trung tâm thông báo thiết bị, không phải trong ứng dụng của bạn.

Nhưng, nếu ứng dụng của bạn đang chạy, và là thời điểm thông báo, sau đó bạn có thể nhận được các thông số thông báo trong trò chơi trong:

-(void) application:(UIApplication*)app didReceiveLocalNotification:(UILocalNotification*) notification 
{ 
// local notification is geted 
} 
+0

Yup, tôi đã đọc chúng rồi. Nhưng những gì tôi muốn làm là xóa một thông báo cụ thể sau một thời gian (tùy ý), không chỉ khi nó được nhận lần đầu tiên. – elsurudo

0

Sau khi nhìn thấy mã được cập nhật, có vẻ như bạn đang quan tâm đến việc hủy bỏ tất cả các thông báo với trong vòng lặp for, vì vậy bạn có thể sử dụng -

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 
+0

Ồ, oops. Trong mã thực tế của tôi, tôi có một điều kiện xung quanh [app cancelLocalNotification: localNotification], vì vậy cancelAllLocalNotifications sẽ không thực hiện thủ thuật. Tôi sẽ cập nhật đoạn mã của mình để khớp với đoạn mã này. – elsurudo

2

Tôi cũng đang tìm kiếm câu trả lời cho điều này. Vấn đề của tôi là tôi muốn 'dọn dẹp' tất cả các thông báo liên quan đến ứng dụng nằm trong trung tâm thông báo chỉ trong trường hợp người dùng mở ứng dụng từ biểu tượng bến tàu của nó (do đó không có gì cho các thông báo đã kích hoạt trước đó ...)

May mắn thay, có vẻ như cancelAllNotifications không chỉ hủy bỏ những lịch biểu đã được lên lịch mà còn CẢNH BÁO. Vì vậy, tôi chỉ đơn giản là tổ chức vào một tài liệu tham khảo các thông báo kế hoạch hiện có trước khi nổ mìn họ, và sau đó dời lại chúng cho phù hợp:

UIApplication *app = [UIApplication sharedApplication]; 

NSLog(@"\nScheduled notif count (prior) = %d", app.scheduledLocalNotifications.count); 

NSArray *scheduledNotifs = app.scheduledLocalNotifications; // hold on to a reference 

[[UIApplication sharedApplication] cancelAllLocalNotifications]; // blast everything 

NSLog(@"\nScheduled notif count (post-wipeout) = %d", app.scheduledLocalNotifications.count); 

for (UILocalNotification *notif in scheduledNotifs) { 
    [app scheduleLocalNotification:notif]; // put them back 
} 

NSLog(@"\nScheduled notif count (post-repopulation) = %d", app.scheduledLocalNotifications.count); 

Không chắc rằng sẽ giúp bất cứ ai nhưng điều này làm việc tuyệt vời cho hoàn cảnh của tôi.

1

Bạn có thể làm điều đó khi bạn lên lịch thông báo nếu bạn cũng lưu nó trong NSUserDefaults, sử dụng NSKeyedArchiver để chuyển đổi nó thành NSData.

Để lấy lại nó là UILocalNotification bạn sử dụng NSKeyedUnarchiver. Sau đó, bạn có thể xóa nó bằng phương thức cancelLocalNotification.

Hoàn toàn giải thích here (Swift phiên bản + liên kết đến gốc giải pháp obj-C)

3

Kể từ iOS10 hiện nay là hỗ trợ cho điều này nếu bạn đã chuyển sang sử dụng UNUserNotificationCenter.

Apple docs nhà nước:

func getDeliveredNotifications(completionHandler: @escaping ([UNNotification]) -> Void)

Cung cấp cho bạn một danh sách các thông báo của ứng dụng đó vẫn được hiển thị trong Notification Center.

func removeDeliveredNotifications(withIdentifiers: [String])

Loại bỏ các thông báo cụ thể từ Notification Center.

func removeAllDeliveredNotifications()

Loại bỏ tất cả thông báo của ứng dụng từ Notification Center.

Các vấn đề liên quan