12/08/2018, 10:29

Xây dựng app nhắc nhở công việc với Notifications

Trong bài tìm hiểu này chúng ta sẽ xây dựng 1 ứng dụng nhắc nhở công việc sử dụng Notifications. Ứng dụng cho phép người dùng đặt các công việc cần phải làm và cài đặt một lời nhắc nhở. Tại một thời điểm cụ thể, thì một cái thông báo để nhắc nhở người dùng làm cái cái công việc đã được ghi chú ...

Trong bài tìm hiểu này chúng ta sẽ xây dựng 1 ứng dụng nhắc nhở công việc sử dụng Notifications. Ứng dụng cho phép người dùng đặt các công việc cần phải làm và cài đặt một lời nhắc nhở. Tại một thời điểm cụ thể, thì một cái thông báo để nhắc nhở người dùng làm cái cái công việc đã được ghi chú trong ứng dụng. Tạo một project trong là template của Xcode với Single View. Phần code để khởi tạo một local Notification khá là đơn giản bằng cách sử dụng lớp UILocalNotification như sau

UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
localNotification.alertBody = @"Your alert message";
localNotification.timeZone = [NSTimeZone dèaultTimeZone];
[[UIApplication shareApplication] sheduleLocalNotification:localNotification];

Khi khởi tạo một LocalNotification bạn cần đặc tả những thuộc tính cần thiết. Thuộc tính fireDate là thuộc tính quan trọng. Ngoài ra có một số thuộc tính là setTimeZone và hiển thị một đoạn tin nhắn thông báo. Quay trở lại với ứng dụng mà chúng ta đang xây dựng. Đầu tiên chúng ta sẽ xây dựng màn hình để có thể thêm các công việc vào ứng dụng là lớp "AddToDoViewController.m".Lớp này cho phép người dùng có thể thêm các item vào ứng dụng và thời gian gửi lời nhắc nhở sử dụng data picker. Khi người dùng bấm vào nút "save". Phương thức save: của lớp AddToDoViewController sẽ được gọi. Ta thêm đoạn code sau vào phương thức save

[self.itemText resignFirstResponder];
//get the current date
NSDate* pickerDate = [self.datePicker date];

//Schedule the no tification
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = pickerDate;
localNotification.alertBody = self.itemText.text;
localNotification.alertAction = @"show me the item";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
//Request to reload table view data
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" objec:self];

//Dismiss the view controller
[self dismissViewControllerAnimated:YES completion:nil];

Nhìn đoạn mã trên khá dễ hiểu. Đọc code là chúng ta có thể hiểu chúng thực hiện những việc gì. Tiếp đó chúng ta thực hiện việc hiển thị danh sách các công việc mình cần làm. Ở màn hình chính của ứng dụng chúng ta sẽ hiển thị danh sách các công việc mình phải làm trên 1 table View. Chúng ta cần hiện thực các phương thức của tableView như sau

[[UIApplication sharedApplication] sheduleLocalNotifications];

Hiện thực các hàm của tableViewDelegate -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathindexPath

{
	static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier fromIndexPath:indexPath];

    //get list of local notifications
    NSArray *localNotifications = [[UIApplication sharedApplication] schedulescheduledLocalNotifications];
    UILocalNotification *localNotification = [localNotifications objecAtIndex:indexPath.row];

    //Display notification info
    [cell.textLabel setText:localNotification.alertBody];
    [cell.detailTextLabel setText:[localNotification.fireDate description]];
}

tiếp theo chúng ta tiến hành xử lý Notifications. Sau khi khởi tạo và cài đặt các thuộc tính cho Notification. Chúng ta cần xử lý các notification khi nó được bật lên. Khi một notification được bật lên, ứng dụng có thể chạy ở foreground hoặc ở background. Trường hợp xấu nhất là, ứng dụng không chạy. Chúng ta cần phải sử lý các tình huống trên.

  1. Ứng dụng không chạy

    Khi ứng dụng không chạy, người dùng có thể nhìn thấy notifications theo cách sau đây phụ thuộc vào việc cài đặt notification:

     * Hiển thị thông báo hoặc banner
    
     * Badging trên app icon
    
     * Chạy 1 đoạn âm thanh
    

    Bằng viêc tap vào nút action của notification, người dùng có thể chạy ứng dụng. Trong trường hợp này, phương thức application:didFinishLaunchingWithOptions: của application delegate sẽ được gọi

- (BOOL)application:(UIApplication*)application didFinishLauchingWithOptions:(NSDictionary *)lauchOptions {
 		//Override point for customization after application

        //Handle lauching form a notification
        UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
        if (localNotification) {
        	application.applicationIconBadbdeNumber = 0;
        }
        Return YES;
    }
Ở phần trên chúng ta kiểm tra xem trong launchOptions có chứa đối tượng localNotification không. Để đơn giản chúng ta chỉ cần thiết lập lại chỉ số badge khi có một localNotification.
  1. Ứng dung chạy trên Foreground khi ứng dụng chạy trong khi notification đã được gửi thì sẽ không có thông báo nào hiển thị trên màn hình. Như thế ứng dụng sẽ tự động gọi đến phương thức application:didReceiveLocalNotification: của delegate. Trong file AppDelegate.m ta sẽ hiện thực phương thức ấy như sau
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotificationUILocalNotification*)notificationnotification
    	UIApplicationState state = [application applicationState];
        if (state == UIApplicationStateActive) {
        	UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Thông báo"
            												message:notification.alertBody
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
           [alert show];
        }

        //request to reload table view data
        [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self];

        //set icon badge number to zero
        application.applicationIconBadgeNumber = 0;
 }
  1. Ứng dụng chạy trong background Khi ưng dụng chạy trước đó nhưng người dùng chuyển qua 1 ứng dụng khác. Khi notification được gửi, người dùng bình thường nhìn thấy thông báo ở phía trên cùng của màn hình.Khi tap vào thông báo đó thì ứng dụng sẽ được gọi để chạy ở foreground.

Tổng kết

Ở bài viết này chỉ giới thiệu cơ bản về localNotification và một số thuộc tính. Khi phát triển các ứng dụng phức tạp hơn chúng ta cần phải thêm một số tính năng mới của notification. Notification thường sử dụng trong các ứng dụng để nhắc nhở người dùng khi có thời gian dài chưa sử dụng app của bạn. Đây là kĩ thuật khá phổ biến sử dụng nhiều trong các ứng dụng.

0