Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. iOS
Code

Giới thiệu framework UserNotifications

by
Difficulty:IntermediateLength:LongLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Giới thiệu

Với iOS 10, tvOS 10 và watchOS 3, Apple giới thiệu một framework mới được gọi là UserNotifications. Bộ API mới này cung cấp một cách thống nhất, theo hướng đối tượng để làm việc với các thông báo cục bộ và từ xa trên các nền tảng này. Điều này là đặc biệt hữu ích khi, so với các API hiện có, các thông báo cục bộ và từ xa bây giờ được xử lý rất giống nhau, và truy cập vào nội dung thông báo được thực hiện không chỉ thông qua các dictionary.

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

Hướng dẫn này đòi hỏi rằng bạn đang chạy Xcode 8 với SDK mới nhất cho iOS, tvOS và watchOS.

1. Dăng ký thông báo

Bước đầu tiên cho bất kỳ ứng dụng hỗ trợ thông báo là yêu cầu sự cho phép của người dùng. Như với các phiên bản iOS trước, khi sử dụng framework UserNotifications, cách làm thông thường làm thực hiện điều này ngay khi chạy ứng dụng.

Trước khi sử dụng bất kỳ hàm API của UserNotifications, bạn sẽ cần phải thêm các câu lệnh import sau vào bất kỳ tập tin Swift nào truy cập vào framework:

Tiếp theo, để đăng ký ứng dụng của bạn cho các thông báo, bạn sẽ cần phải thêm code sau đây vào phương thức application(_:didFinishLaunchingWithOptions:) trong AppDelegate của bạn:

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

Sử dụng cả hai đối tượng này, sau đó chúng ta yêu cầu sự cho phép cho ứng dụng của chúng ta để hiển thị thông báo bằng cách gọi phương thức requestAuthorization(options:completionHandler:) trên đối tượng UNUserNotificationCenter của chúng ta. Khối code handler hoàn chỉnh có hai tham số được truyền qua nó:

  • Một giá trị Bool biểu thị có hoặc không được cấp quyền bởi người dùng.
  • Một đối tượng tùy chọn Error sẽ chứa thông tin nếu vì một số lý do, hệ thống đã không thể để yêu cầu được cấp phép thông báo cho ứng dụng của bạn.

Bạn sẽ thấy điều đó trong đoạn code ở trên, nếu được cấp quyền bởi người dùng, thì chúng ta đăng ký cho các thông báo từ xa. Nếu bạn muốn cài đặt các thông báo đẩy, thì dòng code này là cần phải có. Bạn cũng sẽ phải thực hiện một số thiết lập phụ cho dự án của bạn, chi tiết như trong hướng dẫn này:

Xin lưu ý rằng việc đăng ký cho các thông báo từ xa sẽ gọi phương thức callback UIApplication tương tự như trong phiên bản iOS trước đây. Khi thành công, application(_:didRegisterForRemoteNotificationsWithDeviceToken:), sẽ được gọi và application(_:didFailToRegisterForRemoteNotificationsWithError:) sẽ được gọi khi thất bại.

2. Lên lịch thông báo

Đối với phần này của hướng dẫn, chúng ta sẽ tập trung hoàn toàn vào việc lên lịch thông báo cục bộ bằng cách sử dụng framework UserNotifications. Việc gửi các thông báo đẩy từ xa đã vẫn chưa có gì thay đổi kể từ khi giới thiệu của framework này.

Một thông báo cục bộ, trước khi được lên lịch, được đại diện bởi một đối tượng của lớp UNNotificationRequest. Các kiểu đối tượng này được tạo thành từ các thành phần sau:

  • Identifier: một String duy nhất cho phép bạn phân biệt từng thông báo với mỗi cái khác.
  • Content: một đối tượng UNNotificationContent chứa tất cả các thông tin cần thiết để hiển thị các thông báo của bạn, bao gồm cả tiêu đề, phụ đề và biểu tượng ứng dụng.
  • Trigger: một đối tượng UNNotificationTrigger được sử dụng bởi hệ thống để xác định khi nào thông báo của bạn nên được "gửi" đến ứng dụng của bạn.

Để bắt đầu, chúng ta sẽ xem xét các kiểu trigger khác nhau mà bạn có thể thiết lập cho các thông báo cục bộ. Lớp UNNotificationTrigger là một lớp trừu tượng, có nghĩa là bạn sẽ không bao giờ trực tiếp tạo ra đối tượng của nó. Thay vào đó, bạn sẽ sử dụng các lớp con có sẵn. Hiện tại, framework UserNotifications cung cấp ba lớp con cho bạn:

  • UNTimeIntervalNotificationTrigger, cho phép một thông báo được gửi đi một khoảng thời gian sau khi lên lịch nó.
  • UNCalendarNotificationTrigger, cho phép một thông báo sẽ được gửi tại một thời điểm cụ thể, bất kể nó đã được lên lịch khi nào.
  • UNLocationNotificationTrigger, cho phép một thông báo được gửi khi người dùng vào hoặc rời khỏi một khu vực địa lý đã định.

Code sau đây cho bạn thấy cách làm thế nào bạn có thể kích hoạt mỗi kiểu:

Với code ở trên, các điều kiện kích hoạt sau đây đã được tạo ra:

  • TimeTrigger sẽ được kích hoạt một giờ sau khi thông báo được lên lịch. Tham số timeInterval được truyền vào UNTimeIntervalNotificationTrigger được xác định trong vài giây.
  • calendarTrigger sẽ liên tục được kích hoạt hàng ngày lúc 10:00. Thời điểm chính xác của việc kích hoạt dễ dàng có thể được thay đổi bằng cách sửa đổi các thược tính khác của đối tượng DateComponents mà bạn truyền vào UNCalendarNotificationTrigger.
  • locationTrigger sẽ được kích hoạt khi người dùng đến cách 500m tọa độ cho trước, trong trường hợp này 40°N 120°E. Như bạn có thể thấy từ code, kiểu kích hoạt này có thể được sử dụng cho bất kỳ kích thước toạ độ và/hoặc khu vực và cũng có thể kích hoạt các thông báo sau khi cả vào và ra khỏi khu vực.

Tiếp theo, chúng ta cần tạo ra nội dung thông báo. Điều này được thực hiện bằng cách tạo ra một đối tượng của lớp UNMutableNotificationContent. Lớp này phải được sử dụng như lớp UNNotificationContent thông thường có quyền truy cập chỉ đọc đối với các thuộc tính nội dung thông báo khác nhau.

Code sau đây cho thấy cách nội dung của một thông báo cơ bản có thể được tạo ra:

Nếu bạn muốn một danh sách đầy đủ các thuộc tính có sẵn, hãy xem tài liệu tham khảo lớp UNMutableNotificationContent.

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

Bắt đầu với code này, chúng ta tạo ra đối tượng yêu cầu bằng cách truyền qua một identifier, đối tượng nội dung và kích hoạt vào trong phương thức khởi tạo. Sau đó chúng ta gọi phương thức add(_:completionHandler:) trên đối tượng UNUserNotificationCenter hiện tại và sử dụng bộ xử lý hoàn thiện để thực hiện logic dựa trên điều kiện có hoặc không có thông báo được lên lịch đúng cách.

3. Nhận thông báo

Khi sử dụng framework UserNotifications, các thông báo đến được xử lý bởi một đối tượng mà bạn chỉ định phù hợp với giao thức UNUserNotificationCenterDelegate. Đối tượng này có thể là bất cứ điều gì bạn muốn và không cần phải là delegate của ứng dụng như trong các phiên bản iOS trước đây.

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

Bây giờ delegate đã được thiết lập, khi nhận được một thông báo bởi ứng dụng, chỉ có hai phương thức bạn cần phải quan tâm. Cả hai phương thức được truyền qua một đối tượng UNNotification, đại diện cho thông báo đang nhận được. Đối tượng này chứa một thuộc tính date, nói cho bạn chính xác khi nào thông báo được phát đi, và một thuộc tính request là một đối tượng của lớp UNNotificationRequest đã đề cập trước đó. Từ đối tượng yêu cầu này, bạn có thể truy cập nội dung của thông báo cũng như (nếu cần) kích hoạt cho thông báo. Đối tượng kích hoạt này sẽ là một đối tượng của một lớp con UNNotificationTrigger đã đề cập trước đó, hoặc trong trường hợp thông báo đẩy, một đối tượng của lớp UNPushNotificationTrigger.

Phương thức đầu tiên được định nghĩa bởi các giao thức UNUserNotificationCenterDelegate là phương thức userNotificationCenter(_:willPresent:withCompletionHandler:). Điều này chỉ được gọi là khi ứng dụng của bạn đang chạy ở foreground và nhận được một thông báo. Từ đây, bạn có thể truy cập nội dung thông báo và hiển thị giao diện tùy biến riêng của bạn bên trong ứng dụng của bạn nếu cần thiết. Ngoài ra, bạn có thể nói cho hệ thống để trình bày thông báo với một loạt các tùy chọn, vì nó thường xảy ra nếu ứng dụng của bạn không chạy. Các tùy chọn có sẵn là:

  • Cảnh báo để hiển thị giao diện hệ thống tạo ra cho thông báo
  • Âm thanh để chơi kết hợp với thông báo
  • Biểu tượng để chỉnh sửa biểu tượng của ứng dụng của bạn trên màn hình Home của người dùng

Các code sau đây cho thấy một ví dụ về cài đặt phương thức userNotificationCenter(_:willPresent:withCompletionHandler:):

Phương thức khác được định nghĩa bởi giao thức UNUserNotificationCenterDelegate là phương thức userNotificationCenter(_:didReceive:withCompletionHandler:). Phương thức này được gọi khi người dùng tương tác với một thông báo cho ứng dụng của bạn theo bất kỳ cách nào, bao gồm cả bỏ qua nó hoặc mở ứng dụng của bạn từ đó.

Thay vì một đối tượng UNNotification, phương thức này có một đối tượng UNNotificationResponse được truyền vào nó như là một tham số. Đối tượng này chứa đối tượng UNNotification đại diện cho thông báo được gửi. Nó cũng bao gồm một thuộc tính actionIdentifier để xác định cách người dùng tương tác với thông báo. Trong trường hợp thông báo bị bỏ qua hoặc ứng dụng của bạn đang được mở, framework UserNotifications cung cấp các từ định danh hành động hằng số để bạn có thể so sánh.

Code sau đây cho thấy một ví dụ cài đặt phương thức userNotificationCenter(_:didReceive:withCompletionHandler:):

Xin lưu ý rằng đối với cả hai phương thức delegate, điều cần thiết là bạn gọi handler hoàn chỉnh ngay khi bạn xử lý xong thông báo. Một khi bạn thực hiện, hệ thống sau đó biết bạn đang thực hiện xong với thông báo và có thể thực hiện bất kỳ quá trình cần thiết, chẳng hạn như đặt thông báo trong Notification Centre của người dùng.

4. Quản lý thông báo

Đôi khi một người dùng ứng dụng của bạn có thể nhận được nhiều thông báo khi ứng dụng của bạn không chạy. Họ cũng có thể mở ứng dụng của bạn trực tiếp từ màn hình chính và không thông qua một thông báo. Trong một trong những trường hợp này, không phải các phương thức giao thức UNUserNotificationCenterDelegate sẽ được gọi. Khi làm việc với các thông báo cục bộ, bạn đôi khi cũng có thể muốn loại bỏ thông báo được lên lịch trước khi nó được hiển thị cho người dùng.

Bởi vì điều này, framework UserNotifications cung cấp các phương thức sau đây trên đối tượng UNUserNotificationCenter để làm việc với các thông báo cục bộ đang chờ và đã được gửi mà chưa được xử lý:

  • getPendingNotificationRequests(completionHandler:) cung cấp cho bạn một mảng của các đối tượng UNNotificationRequest trong xử lý hoàn tất. Mảng này sẽ chứa tất cả các thông báo cục bộ, bạn lên lịch cái nào vẫn chưa được kích hoạt.
  • removePendingNotificationRequests(withIdentifiers:) loại bỏ tất cả thông báo cục bộ được lên lịch với các định danh chứa trong mảng String bạn truyền qua như là một tham số.
  • removeAllPendingNotificationRequests loại bỏ tất cả thông báo cục bộ được lên lịch cho ứng dụng của bạn.
  • getDeliveredNotifications(completionHandler:) cung cấp cho bạn một mảng của các đối tượng UNNotification trong xử lý hoàn tất. Mảng này sẽ chứa tất cả các thông báo được gửi cho ứng dụng của bạn mà vẫn có thể nhìn thấy trong Notification Centre của người dùng.
  • removeDeliveredNotifications(withIdentifiers:) loại bỏ tất cả các thông báo đã gởi với các định danh chứa trong mảng String mà bạn truyền vào từ Notification Centre của người dùng.
  • removeAllDeliveredNotifications loại bỏ tất cả các thông báo cho ứng dụng của bạn.

5. Hành động tuỳ biến cho các thông báo

Framework UserNotifications cũng giúp dễ dàng cho ứng dụng của bạn tận dụng lợi thế của thể loại thông báo và hành động tuỳ biến được giới thiệu trong iOS 8.

Trước hết, bạn cần phải xác định các hành động và các thể loại tuỳ biến mà ứng dụng của bạn hỗ trợ bằng cách sử dụng các lớp UNNotificationActionUNNotificationCategory tương ứng. Đối với các hành động mà bạn muốn người dùng có thể nhập văn bản, bạn có thể sử dụng lớp UNTextInputNotificationAction, là một lớp con của UNNotificationAction. Sau khi hành động và loại của bạn được xác định, sau đó bạn chỉ cần gọi phương thức setNotificationCategories(_:) trên đối tượng UNUserNotificationCenter hiện tại. Code sau đây cho thấy bạn có thể dễ dàng đăng ký trả lời và xoá các hành động như thế nào cho một thể loại thông báo trong ứng dụng của riêng bạn:

Tiếp theo, khi người dùng sử dụng một trong những hành động tùy biến của bạn, phương thức tương tự userNotificationCenter(_:didReceive:withCompletionHandler:) mà chúng ta đã khái quát trước đó được gọi. Trong trường hợp này, định danh hành động của đối tượng UNNotificationResponse được truyền vào sẽ giống như cái mà bạn đã định nghĩa cho hành động tùy biến của bạn. Điều quan trọng cần lưu ý là, nếu người dùng tương tác với một hành động nhập văn bản, thì đối tượng phản ứng được truyền qua phương thức này sẽ là kiểu của UNTextInputNotificationResponse.

Code sau đây cho thấy một ví dụ cài đặt phương thức này, bao gồm cả logic cho các hành động tạo ra trước đó:

Ngoài ra, nếu bạn muốn tận dụng lợi thế của các hành động tùy biến cho thông báo cục bộ của bạn, thì bạn có thể chỉ cần đặt thuộc tính categoryIdentifier trên đối tượng UNMutableNotificationContent của bạn khi tạo thông báo.

Tổng kết

Framework UserNotifications mới cung cấp đầy đủ chức năng và dễ dàng sử dụng các API hướng đối tượng để làm việc với các thông báo cục bộ và từ xa trên iOS, watchOS và tvOS. Nó giúp dễ dàng để lên lịch các thông báo cục bộ cho một loạt các tình huống cũng như đơn giản hóa toàn bộ quá trình xử lý các thông báo và hành động tuỳ biến.

Như mọi khi, xin vui lòng để lại ý kiến và phản hồi của bạn trong phần bình luận dưới đây. Và xem thêm một số bài viết và hướng dẫn về các tính năng mới trong iOS 10 và watchOS 3!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.