Trong quá trình lập trình iOS application, nhiều khi chúng ta sẽ gặp phải những vấn đề như phải thêm, sửa, xóa notification cho phù hợp. Bài viết dưới đây sẽ hướng dẫn các bạn thực hiện các thao tác đó nhanh chóng, dễ dàng.

Phân biệt

Trước hết, cần phân biệt Local Notification và Push Notification

Có 2 loại Notification trong iOS là Local Notification và Push Notification

  • Push Notification là dạng thông báo ngoại tuyến, được gửi tới từ 1 server ở bên ngoài. Do vậy điều kiện tiên quyết của nó là máy phải được kết nối, có thể là qua mạng internet. Ví dụ của Push Notification là các thông báo từ Facebook hay Twitter.
  • Local Notification là dạng thông báo nội bộ. Máy không cần thiết phải đang kết nối mới nhận được dạng thông báo này. Ví dụ như những thông báo từ Calendar, được gửi khi đến một mốc thời gian nhất định.

Tạo một Local Notification đơn giản

Đầu tiên chúng ta sẽ đăng ký một Local Notification. Ví dụ dưới đây là tạo một thông báo sẽ xuất hiện sau 5 phút.

// Tạo instance
UILocalNotification *notification = [[UILocalNotification alloc] init];
// Tạo thông báo sau 5 phút (Đơn vị giây)
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:(60 * 5)];
// Thiết lập múi giờ
notification.timeZone = [NSTimeZone defaultTimeZone];
// Nội dung hiển thị khi thông báo
notification.alertBody = @"Hello VNLab";
// Thiết lập âm thanh chuông báo
notification.soundName = UILocalNotificationDefaultSoundName;

// Thiết lập thông báo
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

Xóa Local Notification

Sau đây ta sẽ thử xóa một thông báo đã được đăng ký. Một chú ý nữa là các bạn sẽ không thể sửa một thông báo đã đăng ký, vì vậy nếu muốn sửa thì cách tốt nhất là xóa đi rồi đăng ký lại

// Trước hết, tìm thông báo cần xóa trong danh sách những thông báo đã được đăng ký
for(UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
// Tìm key của thông báo cần xóa
        if([[notification.userInfo objectForKey:@"id"] integerValue] == id) {
// Xóa thông báo có key phù hợp yêu cầu
            [[UIApplication sharedApplication] cancelLocalNotification:notification];
        }
}

// Xóa tất cả những thông báo của app
[[UIApplication sharedApplication] cancelAllLocalNotifications];

Trong hầu hết các trường hợp, chỉ có một trong 3 loại thông báo sau đây sẽ xảy ra khi chạy app từ notification:

- Trường hợp 1: nhận được thông báo khi app đang được kích hoạt (foreground)

  • Trường hợp 2: nhận được thông báo khi  app đang ở background
  • Trường hợp 3: nhận được thông báo khi app đã kết thúc

Đối với trường hợp 1 và 2:

Thiết lập application:didReceiveLocalNotification trong AppDelegate

(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// Trường hợp app đang ở foreground
    if(application.applicationState == UIApplicationStateActive) {
// Xử lý tại đây
    }

// Trường hợp app đang ở background
if(application.applicationState == UIApplicationStateInactive) {
// Xử lý tại đây
}

// Xóa thông báo
[[UIApplication sharedApplication] cancelLocalNotification:notification];
}

Một điểm đáng chú ý là, khi app đang ở foreground thì sẽ không hiển thị được thông báo, tức là bạn sẽ không thể biết được thông báo có tới hay không khi app đang chạy ở foreground. Để khắc phục tình trạng này, nên xuất ra một alert ở phần UIAlertView để thông báo được cho người dùng.

Đối với trường hợp 3, notification được gửi tới khi app đã ở trạng thái kết thúc, chúng ta cần xử ý ở hàm application:didFinishLaunchingWithOptions trong AppDelegate.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Lấy ra notification cần tìm bằng key
    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

// Nếu không nil thì lưu trữ thông tin của thông báo
    if(notification != nil) {
// Xử lý tại đây

// Xóa thông báo
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
    }
 
    return YES;
}

Kết luận

Như vậy, việc thêm, xóa Local Notification hoàn toàn không hề phức tạp. Vấn đề cần làm chỉ là chúng ta nên tính toán sử dụng Local Notification sao cho hợp lý, tiện lợi và không gây khó chịu cho người dùng. Chúc các bạn thành công!