IOS Local Notifications

có 2 loại là Local và Push Notification.

-Push Notifications (Apple Push Notification Service – APNS): Loại notification thông qua server của Apple đẩy đến thiết bị của người dùng.Thường thấy ở những ứng dụng có tương tác với server API.

-Local Notifications: Loại không cần thông qua server, không cần kết nối internet.Thường thấy ở những ứng dụng kiểu như những ứng dụng nhắc nhở...

Tạo Project và thiết kế UI cơ bản

Tạo Project và đặt tên Project VD: “SimpleReminder”. Trong storyboard, thiết kế giao diện đởn giản như sau.

Screen Shot 2015-08-31 at 09.21.21.png

Xử lí code

Đăng ký quyền gửi Notification cho ứng dụng

Để ứng dụng có quyền truy cập và gửi thông báo,cần phải phải request permission ở AppDelegate. Mở AppDelegate.m và thêm đoạn code sau vào hàm “didFinishLaunchingWithOptions:”

//Register Notification
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

Ở NotificationType trong đoạn code trên có khai báo 3 loại:

  • UIUserNotificationTypeBadge: Số notification sẽ hiện ở trên icon app.
  • UIUserNotificationTypeSound: Play âm thanh khi có thông báo
  • UIUserNotificationTypeAlert: thông báo dạng alert

Xử lí sự kiện(event) thêm mới

Mở file CreateScheduleViewController.m và sửa action “createASchedule:” như sau:

[_txtNoiDung resignFirstResponder];
// Lấy ngày hiện tại
NSDate *pickerDate = [self.datePicker date];
// Schedule the notification
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = pickerDate;
localNotification.alertBody = self.txtNoiDung.text;
localNotification.alertAction = @"Show item";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
// load lại data
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];
// Dismiss the view controller
[self.navigationController popViewControllerAnimated:YES];

Fill dữ liệu đã tạo vào tableview

Mở ViewController.m và thêm đoạn code sau

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSArray *localNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
return localNotifications.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell =  [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; //[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Get text notifications
NSArray *localNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
UILocalNotification *localNotification = [localNotifications objectAtIndex:indexPath.row];

// Hiện thông tin notification
[cell.textLabel setText:localNotification.alertBody];
[cell.detailTextLabel setText:[localNotification.fireDate description]];

return cell;
}

Xử lí Notifications Ứng dụng đang không chạy

– Hiện phía trên khi đến giờ thông báo (dạng banner thiết lập trong settings của device), sau đó có thể xem thông báo ở Notification Center.

– Hiện icon số thông báo (badge) ở trên icon ứng dụng trên màn hình.

– Play âm thanh khi có thông báo.

Khi người dùng bấm vào thông báo, app sẽ được mở ra. Hàm “application:didFinishLaunchingWithOptions:” sẽ được gọi ở AppDelegate.

Tiếp theo thêm đoạn code sau vào hàm này để xóa badge ở trên icon:

// Handle launching from a notification
UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (locationNotification) {
    // Set icon badge number to zero
    application.applicationIconBadgeNumber = 0;
}

code đầy đủ của hàm này sẽ như sau

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//Register Notification
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

// Handle launching from a notification
UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (locationNotification) {
    // Set icon badge number to zero
    application.applicationIconBadgeNumber = 0;
}
return YES;
}

Khi ứng dụng đang chạy Foreground

Khi ứng dụng đang bật mà có thông báo nó sẽ gọi hàm “application:didReceiveLocalNotification:” . Ở đây ta sẽ thông báo ra cho người dùng ngay tại màn hình ứng dụng. Sửa hàm “application:didReceiveLocalNotification:” như sau:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateActive) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notification"
                                                    message:notification.alertBody
                                                   delegate:self cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}

// Set icon badge number to zero
application.applicationIconBadgeNumber = 0;
}

Khi ứng dụng chạy Background

Khi ứng dụng đang chạy nhưng người dùng bấm Home ẩn đi, hoặc chuyển sang ứng dụng khác. Khi có thông báo sẽ hiện dạng banner, người dùng bấm vào thông báo sẽ mở app và chuyển sang dạng foreground. Hiển nhiên nó sẽ tự gọi hàm “application:didReceiveLocalNotification:”

Test App

Thêm nội dung và thời gian.

Screen Shot 2015-08-31 at 09.56.35.png

Notifications

Screen Shot 2015-08-31 at 09.54.27.png

download source code


All Rights Reserved