Giới thiệu về UserNotifications Framework trong iOS 10

27

Với iOS 10, tvOS 10 và watchOS 3, Apple đã giới thiệu tới cộng đồng devs một framework mới được gọi là UserNotifications framework. Framework mới này thiết lập các APIs cung cấp một cái hợp nhất, theo cách hướng đối tượng khi làm việc với cả local và remote notifications trên những nền tảng này. Điều này đặc biệt hữu ích khi so với các APIs đang tồn tại, local và remote notifications hiện tại đều được xử lý một cách tương tự và truy cập vào nội dung của notification không còn được thực hiện thông qua các dictionaries.

Trong bài hướng dẫn này, chúng ta sẽ cùng đi qua các vấn đề cơ bản của framework mới này và xem làm thế nào mà bạn có thể dễ dàng tận dụng điểm mạnh của nó để hỗ trợ thông báo cho ứng dụng của bạn.

Bài hướng dẫn này bắt buộc phải sử dụng bằng Xcode 8 với những phiên bản SDK mới nhất của iOS, tvOS và watchOS.

1. Registering for Notifications

Bước đầu tiên cho bất kỳ ứng dụng nào có hỗ trợ thông báo là phải gửi yêu cầu cho phép từ user. Như những phiên bản iOS trước đó, khi sử dụng UserNotifications framework, điều đó trở thành thông lệ để thực hiện việc này ngay sau khi ứng dụng được khởi động xong.

Trước khi sử dụng bất kỳ APIs nào của UserNotifications, bạn sẽ cần thêm dòng lệnh import cho bất kỳ files Swift nào mà file đó truy cập tới framework:

Tiếp theo, để đăng ký notifications cho app của bạn, bạn sẽ cần thêm đoạn code sau vào trong method application(_:didFinishLaunchingWithOptions:) của Appdelegate:

Bước đầu với đoạn code này, chúng ta có một tham chiếu tới current của đối tượng UNUserNotificationCenter. Tiếp theo, chúng ta sẽ cấu hình UNAuthorizationOptions với các tính năng thông báo mà chúng ta muốn app có. Xin hãy lưu ý rằng bạn có thể có bất kỳ sự kết hợp nào của những tuỳ chọn ở đây—cho ví dụ, chỉ có alert hoặc cả badge và sound.

Sử dụng tất cả tuỳ chọn ở đây, sau đó chúng ta sẽ yêu cầu cho phép để app hiển thị notifications bằng cách gọi method requestAuthorization(options:completionHandler:) của đối tượng UNUserNotificationCenter. Block completion handler có hai tham số truyền vào:

  • Một giá trị Bool nghĩa là có cho phép hay không được cấp từ user.
  • Một đối tượng Error với kiểu optional, cái mà chứa thông tin nếu, vì lý do nào đó, hệ thống không thể gửi yêu cầu xin phép báo notification cho app.

Bạn sẽ thấy rằng trong đoạn code ở trên, nếu được cho phép từ user, sau đó chúng ta sẽ đăng ký cho remote notifications (thông báo từ xa). Nếu bạn muốn thực hiện việc push notifications, đoạn code này là cần thiết. Bạn cũng sẽ phải thiết lập thêm một vài thứ trong project, như chi thiết trong bài hướng dẫn này: Setting Up Push Notifications on iOS

Xin lưu ý rằng việc đăng ký cho remote notifications sẽ gọi lại các hàm callback của UIApplication như những phiên bản iOS trước đó. Nếu thành công, application(_:didRegisterForRemoteNotificationsWithDeviceToken:) sẽ được gọi và application(_:didFailToRegisterForRemoteNotificationsWithError:) sẽ được gọi nếu thất bại.

2. Scheduling Notifications

Trong phần này, chúng ta sẽ tập trung hoàn toàn vào cho việc scheduled (lên lịch, sắp xếp thời gian) cho local notifications bằng việc sử dụng UserNotifications framework. Việc gửi thông báo đẩy từ xa (remote push notifications) vẫn không thay đổi trong framework mới này.

Một local notification, trước khi được scheduled, được đại diện bởi một biến của class UNNotificationRequest. Những đối tượng của kiểu này sẽ được tạo thành từ những thành phần sau:

  • Identifier: một chuỗi String duy nhất mà cho phép bạn phân biệt được những notifications khác nhau.
  • Content: một đối tượng UNNotificationContent chứa tất cả những thông tin cần thiết để hiển thị trong notification của bạn, bao gồm title, subtitle và số badge.
  • Trigger: một đối tượng UNNotificationTrigger được sử dụng bởi hệ thống để xác định khi nào notification của bạn sẽ được “gửi” tới app.

Để bắt đầu, chúng ta sẽ tìm hiểu các kiểu triggers khác nhau mà bạn có thể thiết lập cho các local notifications. Class UNNotificationTrigger là một class trừu tượng, nghĩa là bạn sẽ không bao giờ tạo được một biến kế thừa nó trực tiếp. Thay vào đó, bạn sẽ sử dụng các subclass có sẵn. Hiện tại, UserNotifications framework cung cấp 3 class cho bạn:

  • UNTimeIntervalNotificationTrigger, cái cho phép một notification được gửi sau một khoảng thời gian scheduled notification đó.
  • UNCalendarNotificationTrigger, cái cho phéo một notification được gửi với cột mốc thời gian xác định, bất kể khi nó đã được scheduled.
  • UNLocationNotificationTrigger, cái cho phép một notification được gửi khi user đi vào hoặc rời đi một khu vực địa lý đã được chỉ định.

Đoạn code sau sẽ cho biết làm thế nào để tạo ra một trigger với từng loại:

Với đoạn mã trên, các kiểu trigger sau đã được tạo ra:

  • timeTrigger sẽ kích hoạt sau một giờ đồng hồ từ lúc notification đã scheduled. Tham số truyền vào bên trong hàm khởi tạo của UNTimeIntervalNotificationTrigger được đo bằng giây.
  • calendarTrigger sẽ kích hoạt mỗi ngày vào lúc 10:00 PM. Ngày và giờ xác định trigger có thể dễ dàng thay đổi bằng cách thay đổi thuộc tính còn lại của đối tượng DateComponents mà bạn truyền vào trong hàm khởi tạo của UNCalendarNotificationTrigger.
  • locationTrigger sẽ kích hoạt khi người dùng đi vào trong phạm vi 500m của vị trí được chỉ định, trong trường hợp này là 40°N 120°E. Như bạn có thể thấy từ đoạn code, kiểu trigger này có thể được sử dụng cho bất kỳ vị trí nào cùng với diện tích khu vực và cũng có thể kích hoạt một notification dựa trên cả việc đi vào và đi ra khỏi khu vực đó.

Tiếp theo, chúng ta cần khởi tạo nội dung cho notification. Điều này được thực hiện bằng cách tạo một biến của class UNMutableNotificationContent. Class này phải được sử dụng như là class chính UNNotificationContent chỉ có quyền đọc (read-only access) cho các thuộc tính của nội dung thông báo khác nhau.

Đoạn code sau cho thấy cách nội dung của một notification cơ bản được tạo:

Nếu bạn muốn xem đầy đủ danh sách các thuộc tính có sẵn, hãy xem thêm ở đây: UNMutableNotificationContentclass reference.

Cuối cùng, bây giờ chúng ta chỉ cần tạo một đối tượng UNNotificationRequest và schedule nó. Điều này được thực hiện với đoạn code sau:

Đoạn đầu của đoạn code trên, chúng ta khởi tạo một đối tượng request bằng cách truyền một identifier, content và trigger vào trong hàm khởi tạo. Sau đó chúng ta gọi hàm add(_:completionHandler:) bằng đối tượng UNUserNotificationCenter hiện hành và dùng completion handler để thực hiện phần logic bên trong nó dựa trên việc notification được scheduled phù hợp hay không.

3. Receiving Notifications

Khi sử dụng UserNotifications framework, tiến trình xử lý khi notifications đến được thực hiện bởi một đối tượng mà bạn chỉ định nó conform tới protocol UNUserNotificationCenterDelegate. Đối tượng này có thể là bất kỳ cái gì mà các bạn muốn và không phải là app delegate như những phiên bản iOS trước đó.

Một điều quan trọng để lưu ý, đó là bạn phải thiết lập delegate của bạn trước khi ứng dụng khởi động xong hoàn toàn. Đối với một iOS app, điều này có nghĩa là bạn phải gán delegate bên trong hàm application(_:willFinishLaunchingWithOptions:) hoặc là application(_:didFinishLaunchingWithOptions:) của app delegate. Việc thiết lập delegate cho notifications được thực hiện rất dễ dàng với đoạn code sau:

Bây giờ với delegate được thiết lập, khi một notification được nhận bởi app, chỉ có 2 methods bạn cần quan tâm. Cả 2 methods đều thông qua một đối tượng UNNotification, cái mà đại diện cho notification được nhận. Đối tượng này chứa một thuộc tính date, cái mà cho bạn biết chính xác khi notification được gửi và một request , cái mà là một kế thừa của class UNNotificationRequest đã được nhắc trước đó. Từ đối tượng request này, bạn có thể truy cập nội dung của notification cũng như (nếu cần thiết) trigger của notification đó. Đối tượng trigger này sẽ là một trong những subclass UNNotificationTrigger đã nhắc trước đó hoặc, trong trường hợp của push notifications, là một kế thừa của class UNPushNotificationTrigger.

Method đầu tiên được xác định bởi protocol UNUserNotificationCenterDelegate  đó là userNotificationCenter(_:willPresent:withCompletionHandler:). Cái này chỉ được gọi khi app của bạn đang chạy trong chế độ foreground và nhận một notification. Từ đây, bạn có thể truy cập vào nội dung của notification và hiển thị giao diện riêng tuỳ biến bên trong app nếu cần thiết. Ngoài ra, bạn có thể nói với hệ thống để hiển trị lên notification với một vài lựa chọn, vì nó thường như vậy nếu app của bạn đang không chạy. Các lựa chọn có sẵn như thế này:

  • Alert để hiển thị giao diện hệ thống tạo ra cho các notification
  • Sound để play âm thanh kết hợp với notification
  • Badge để chỉnh sửa badge của app trên màn hình home.

Đoạn code sau cho thấy một ví dụ khi thực hiện method userNotificationCenter(_:willPresent:withCompletionHandler:):

Method còn lại được xác định bởi protocol UNUserNotificationCenterDelegate đó là userNotificationCenter(_:didReceive:withCompletionHandler:). Method này được gọi khi user tương tác với một notification cho app của bạn trong bất kỳ cách nào, bao gồm dismiss nó hoặc open app của bạn từ nó.

Thay vì một đối tượng UNNotification, method này có một đối tượng UNNotificationResponse được truyền vào trong nó như một tham số. Đối tượng này chứa một đối tượng UNNotification đại diện cho notification đã gửi. Nó cũng bao gồm một thuộc tính actionIdentifier để quyết định cách mà user tương tác với notification. Trong trường hợp mà notification đang được dismiss hoặc app của bạn đang được open, UserNotifications framework cung cấp một hằng số action identifiers để bạn so sánh you.

Đoạn code sau cho thấy một ví dụ khi thực hiện method userNotificationCenter(_:didReceive:withCompletionHandler:):

Lưu ý rằng cả hai delegate methods, đó là điều quan trọng mà bạn gọi completion handler ngay sau khi bạn hoàn thành tiến trình xử lý notification. Mỗi lần bạn làm như vậy, hệ thống sau đó biết bạn đã làm xong với notification và có thể thực hiện bất tiến trình cần thiết nào, như việc đặt notification trong Notification Centre.

4. Managing Notifications

Thỉnh thoảng một user của app các bạn có thể nhận nhiều notifications trong khi app của bạn không chạy. Họ có thể cũng mở app của bạn trực tiếp từ home screen và không thông qua notification. Trong những trường hợp này, UNUserNotificationCenterDelegate protocol methods sẽ không được gọi tới. Khi làm việc với local notifications, thỉnh thoảng bạn muốn loại bỏ một notification đã scheduled trước khi nó hiển thị cho the user.

Bởi vì điều này, UserNotifications framework cung cấp những method sau cho current UNUserNotificationCenter để làm việc với những local notifications chưa xử lý và những  notifications đã gửi mà chưa hoàn thành tiến độ xử lý:

  • getPendingNotificationRequests(completionHandler:) cung cấp cho bạn với một mảng của đối tượng UNNotificationRequest trong completion handler. Mảng này sẽ chứa tất cả những local notifications mà bạn đã scheduled nhưng chưa được kích hoạt.
  • removePendingNotificationRequests(withIdentifiers:) loại bỏ tất cả những local notifications đã scheduled với các identifiers chứa trong mảng String bạn truyền vào như một parameter.
  • removeAllPendingNotificationRequests loại bỏ tất cả các local notifications đã scheduled cho app của bạn.
  • getDeliveredNotifications(completionHandler:) cung cấp cho bạn một mảng của đối tượng UNNotification trong completion handler. Mảng này sẽ chứa tất cả các notifications đã gửi cho app các bạn mà chúng vẫn được nhìn thấy trong Notification Centre.
  • removeDeliveredNotifications(withIdentifiers:) loại bỏ tất cả các notifications đã gửi với các identifiers được chứa trong một mảng String mà bạn truyền vào trong từ Notification Centre.
  • removeAllDeliveredNotifications loại bỏ tất cả notifications đã gửi trong app.

5. Custom Action Notifications

UserNotifications framework cũng làm cho nó dễ dàng hơn cho app các bạn tận dụng những lợi ích của việc tuỳ biến thể loại và hoạt động notification được giới thiệu trong iOS 8.

Điều đầu tiên, bạn cần xác định hoạt động và thể loại tuỳ biến mà app của bạn hỗ trợ bằng việc sử dụng class UNNotificationAction và UNNotificationCategory tương ứng. Đối với hoạt động mà bạn muốn user có thể nhập text vào, bạn có thể sử dụng clas UNTextInputNotificationAction, cái mà là một subclass của UNNotificationAction. Mỗi lần hoạt động và thể loại của bạn được xác định, sau đó bạn chỉ cần gọi method setNotificationCategories(_:) trong UNUserNotificationCenter hiện hành. Đoạn code sau cho thấy cách mà bạn có thể dễ dàng đăng ký trả lời và xoá các notification với thể loại message trong app:

Tiếp theo, khi một user sử dụng một trong những hoạt động notification tuỳ biến, một method userNotificationCenter(_:didReceive:withCompletionHandler:) đã đề cập trước đó sẽ được gọi. Trong trường hợp này, identifier action của đối tượng UNNotificationResponse truyền vào trong sẽ giống như cái mà bạn định nghĩa cho hoạt động tuỳ biến của bạn. Nó cũng quan trọng để lưu ý rằng, nếu user tương tác với một đoạn text nhập vào trong hoạt động notification, sau đó đối tượng nhận response được truyền vào trong method này sẽ là kiểu UNTextInputNotificationResponse.

Đoạn code sau cho thấy một ví dụ thực hiện của method này, bao gồm logic đối với các hoạt động được tạo trước đó:

Ngoài ra, nếu bạn muốn tận dụng lợi ích của việc tuỳ biến hoạt động cho local notifications của bạn, sau đó bạn có thể chỉ đơn giản là thiết lập thuộc tính categoryIdentifier trong đối tượng UNMutableNotificationContent của bạn khi tạo notifications.

Conclusion

UserNotifications framework cung cấp các tính năng đầy đủ và dễ sử dụng, các APIs hướng đối tượng để làm việc với local và remote notifications trong iOS, watchOS và tvOS. Điều đó làm cho nó rất dễ schedule local notifications cho nhiều trường hợp cũng như đơn giản hoá toàn bộ tiến trình đưa thông báo và tuỳ biến hành động.

 

Nguồn IDE Academy via code.tutplus