Thêm thông báo đẩy vào ứng dụng iOS

1. Giới thiệu

Lần cập nhật gần đây nhất: ngày 6 tháng 1 năm 2020

Giải pháp gửi thông báo qua đám mây của Firebase (FCM) là một giải pháp nhắn tin đa nền tảng giúp bạn gửi thông báo một cách đáng tin cậy mà không tốn phí.

Khi sử dụng FCM, bạn có thể thông báo cho một ứng dụng khách rằng có email mới hoặc dữ liệu khác cần đồng bộ hoá. Bạn có thể gửi thông báo để thúc đẩy người dùng tương tác lại và giữ chân người dùng. Đối với các trường hợp sử dụng như nhắn tin tức thời, một thông báo có thể chuyển tải trọng lên đến 4 KB đến một ứng dụng khách.

Tính năng này hoạt động ra sao?

Việc triển khai FCM bao gồm 2 thành phần chính để gửi và nhận:

  1. Một môi trường đáng tin cậy như Cloud Functions cho Firebase hoặc một máy chủ ứng dụng để tạo, nhắm mục tiêu và gửi thông báo.
  2. Một ứng dụng khách iOS, Android hoặc web (JavaScript) nhận thông báo thông qua dịch vụ truyền tải dành riêng cho nền tảng tương ứng.

Tổng quan về cấu trúc FCM

dc54f5190ee8926a.png

FCM dựa vào nhóm các thành phần sau đây để tạo, truyền tải và nhận thông báo:

  1. Công cụ để soạn hoặc tạo yêu cầu nhắn tin. Trình soạn thảo Thông báo cung cấp một lựa chọn dựa trên GUI để tạo yêu cầu thông báo. Để tự động hoá hoàn toàn và hỗ trợ tất cả các loại thông báo, bạn phải tạo yêu cầu thông báo trong một môi trường máy chủ đáng tin cậy hỗ trợ Firebase Admin SDK hoặc các giao thức máy chủ FCM. Môi trường này có thể là Cloud Functions cho Firebase, Google App Engine hoặc máy chủ ứng dụng của riêng bạn.
  2. Phần phụ trợ FCM (trong số các chức năng khác) chấp nhận yêu cầu về thông báo, thực hiện gửi thông báo hàng loạt thông qua các chủ đề và tạo siêu dữ liệu thông báo, chẳng hạn như mã thông báo.
  3. Một lớp truyền tải ở cấp nền tảng, có chức năng định tuyến thông báo đến thiết bị mục tiêu, xử lý việc gửi thông báo và áp dụng cấu hình dành riêng cho nền tảng khi thích hợp. Lớp truyền tải này bao gồm:
  • Lớp truyền tải Android (ATL) cho các thiết bị Android có Dịch vụ Google Play
  • Dịch vụ thông báo đẩy của Apple (APNs) cho thiết bị iOS
  • Giao thức thông báo đẩy trên web cho ứng dụng web
  1. FCM SDK trên thiết bị của người dùng, nơi thông báo được hiển thị hoặc thông báo được xử lý theo trạng thái nền trước/nền sau của ứng dụng và mọi logic ứng dụng có liên quan.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ thêm thông báo đẩy vào một ứng dụng iOS mẫu bằng FCM.

Kiến thức bạn sẽ học được

  • Cách đăng ký và huỷ đăng ký người dùng nhận thông báo đẩy
  • Cách xử lý thông báo đẩy đến
  • Cách hiển thị thông báo
  • Cách phản hồi lượt nhấp vào thông báo

Bạn cần có

  • Xcode 11.0 trở lên
  • CocoaPods 1.9.0 trở lên
  • Tài khoản nhà phát triển của Apple
  • Một thiết bị iOS thực để chạy ứng dụng
  • Kiến thức cơ bản về Swift

2. Thiết lập

Tải mã mẫu xuống

Trong lớp học lập trình này, bạn sẽ tạo ứng dụng kiểm thử của riêng mình. Tuy nhiên, nếu muốn xem và chạy ứng dụng mẫu hiện có, bạn có thể tải mã mẫu bắt đầu nhanh xuống.

Có hai cách để lấy mẫu:

  • Sao chép kho lưu trữ Git:
$ git clone https://github.com/firebase/quickstart-ios.git
  • Tải tệp ZIP xuống:

Nếu bạn tải nguồn xuống dưới dạng tệp ZIP, thì việc giải nén sẽ tạo ra một thư mục gốc quickstart-ios.

Tạo ứng dụng mới

Tạo ứng dụng kiểm thử của riêng bạn theo các bước sau (các bước dưới đây là trong XCode 12.3):

  1. Mở XCode rồi chọn Create a new Xcode project (Tạo một dự án Xcode mới).
  2. Chọn Ứng dụng rồi nhấp vào Tiếp theo.

d6a3fc16ba7d4f72.png

  1. Nhập Tên sản phẩm (ví dụ: MessagingExample)
  2. Chọn Nhóm (Nếu bạn chưa tạo Nhóm, hãy định cấu hình Nhóm trong Tài khoản nhà phát triển của Apple).
  3. Nhập Giá trị nhận dạng tổ chức (ví dụ: com.your-name)
  4. Nhập Mã nhận dạng gói (ví dụ: com.your-name.MessagingExample, mã này phải là mã nhận dạng riêng biệt trong số tất cả các ứng dụng iOS).
  5. Chọn Storyboard trong trình đơn kéo xuống Interface (Giao diện).
  6. Chọn UIKit App Delegate trong trình đơn kéo xuống Life Cycle (Vòng đời).
  7. Chọn Swift trong phần Ngôn ngữ.
  8. Nhấp vào Tiếp theo.

a07d72459f65dcc1.png

Bạn sẽ cần Mã nhận dạng gói khi tạo khoá APN và đăng ký ứng dụng vào dự án Firebase.

3. Định cấu hình APN

Tạo khoá xác thực

Phần này mô tả cách tạo khoá xác thực cho một Mã ứng dụng được bật cho Thông báo đẩy. Nếu đã có khoá, bạn có thể dùng khoá đó thay vì tạo khoá mới.

Cách tạo khoá xác thực:

  1. Trong tài khoản nhà phát triển, hãy chuyển đến phần Certificates, Identifiers & Profiles (Chứng chỉ, mã nhận dạng và hồ sơ) rồi chuyển đến phần Keys (Khoá).

708ac6e36366b11f.png

  1. Nhấp vào nút Thêm (+) ở góc trên bên phải.

e71849c7e6e4e714.png

  1. Nhập nội dung mô tả cho Khoá uỷ quyền APNs
  2. Trong phần Key Services (Dịch vụ chính), hãy chọn hộp đánh dấu APNs rồi nhấp vào Continue (Tiếp tục).

65c9930dc2d8bf1c.png

  1. Nhấp vào Đăng ký rồi nhấp vào Tải xuống. Lưu khoá ở một nơi an toàn. Đây là lần tải xuống duy nhất và bạn không thể truy xuất khoá sau này.

bda45effb420b7c2.png

Tạo mã nhận dạng ứng dụng

Mã ứng dụng là một giá trị nhận dạng duy nhất xác định một ứng dụng. Theo quy ước, mã này được biểu thị bằng một miền đảo ngược.

  1. Truy cập vào Apple Developer Member Center rồi đăng nhập.
  2. Chuyển đến phần Certificates, Identifiers and Profiles (Chứng chỉ, mã nhận dạng và hồ sơ).
  3. Chuyển đến phần Giá trị nhận dạng.
  4. Nhấp vào nút + để tạo một Mã ứng dụng mới. 2a325a323b652124.png
  5. Chọn nút chọn Mã ứng dụng rồi nhấp vào Tiếp tục.

fb24e3374de047a3.png

  1. Chọn Ứng dụng rồi nhấp vào Tiếp tục.

cca5eb32736f947.png

  1. Cách tạo mã ứng dụng mới:
  2. Nhập Tên cho Mã ứng dụng.
  3. Nhập Mã nhóm. Giá trị này phải khớp với Mã nhóm trong thẻ Thành viên.
  4. Trong mục Hậu tố mã ứng dụng, hãy chọn Mã ứng dụng rõ ràng, rồi nhập Mã nhận dạng gói. 7363c4d1962b486d.png
  5. Trong phần App Services (Dịch vụ ứng dụng), hãy nhớ chọn Push Notifications (Thông báo đẩy). 8e158017bc31fd46.png
  6. Nhấp vào Tiếp tục và kiểm tra để đảm bảo thông tin bạn nhập là chính xác:
  7. Giá trị của Identifier phải khớp với chuỗi nối các giá trị của Team ID và Bundle ID
  8. Thông báo đẩy phải Có thể định cấu hình
  9. Nhấp vào Register (Đăng ký) để tạo App ID.

Tạo hồ sơ

Để kiểm thử ứng dụng trong quá trình phát triển, bạn cần có một Hồ sơ phát triển để uỷ quyền cho các thiết bị chạy một ứng dụng chưa được xuất bản trên App Store.

  1. Truy cập vào Apple Developer Member Center rồi đăng nhập.
  2. Chuyển đến phần Certificates, Identifiers and Profiles (Chứng chỉ, mã nhận dạng và hồ sơ).
  3. Trong trình đơn thả xuống ở góc trên cùng bên trái, hãy chọn iOS, tvOS, watchOS nếu chưa chọn, sau đó chuyển đến Hồ sơ.
  4. Nhấp vào nút + để tạo một Hồ sơ mới. 100604ffceac6a1d.png
  5. Chọn Phát triển ứng dụng iOS làm loại hồ sơ cung cấp, rồi nhấp vào Tiếp tục.

7d4d20883a4c4142.png

  1. Trong trình đơn thả xuống, hãy chọn Mã ứng dụng bạn muốn sử dụng, rồi nhấp vào Tiếp tục.
  2. Chọn chứng chỉ Phát triển iOS của Mã ứng dụng mà bạn đã chọn ở bước trước, sau đó nhấp vào Tiếp tục.
  3. Chọn các thiết bị iOS mà bạn muốn đưa vào Hồ sơ cung cấp, sau đó nhấp vào Tiếp tục. Hãy nhớ chọn tất cả các thiết bị mà bạn muốn dùng để kiểm thử.
  4. Nhập tên cho hồ sơ cung cấp này (ví dụ: MessagingExampleProfile), sau đó nhấp vào Tạo.

7346087f5a0179f2.png

  1. Nhấp vào Tải xuống để lưu Cấu hình cấp phép vào máy Mac.

548c8c27f3ce5bca.png

  1. Nhấp đúp vào tệp Provisioning Profile (Hồ sơ cung cấp) để cài đặt tệp đó.

4. Thêm Firebase vào dự án iOS

Tạo dự án Firebase

Trước khi có thể thêm Firebase vào ứng dụng iOS, bạn cần tạo một dự án Firebase để kết nối với ứng dụng iOS của mình. Hãy truy cập vào trang Tìm hiểu về các dự án Firebase để tìm hiểu thêm về các dự án Firebase.

  1. Trong bảng điều khiển của Firebase, hãy nhấp vào Thêm dự án, sau đó chọn hoặc nhập Tên dự án. caf43df5174a530e.png

Nếu đang có một dự án trên Google Cloud Platform (GCP), bạn có thể chọn dự án đó trong trình đơn thả xuống để thêm tài nguyên Firebase vào dự án.

  1. (Không bắt buộc) Nếu đang tạo dự án mới, bạn có thể chỉnh sửa Mã dự án.

Firebase tự động chỉ định một mã nhận dạng duy nhất cho dự án Firebase của bạn. Hãy truy cập vào trang Tìm hiểu về các dự án Firebase để tìm hiểu về cách Firebase sử dụng mã dự án.

  1. Nhấp vào Tiếp tục.
  2. Thiết lập Google Analytics cho dự án của bạn để có trải nghiệm tối ưu khi sử dụng bất kỳ sản phẩm nào sau đây của Firebase:
  • Firebase Crashlytics
  • Dự đoán Firebase
  • Giải pháp gửi thông báo qua đám mây của Firebase
  • Tính năng gửi thông báo trong ứng dụng của Firebase
  • Cấu hình từ xa Firebase
  • Thử nghiệm A/B trong Firebase

Khi được nhắc, hãy chọn sử dụng tài khoản Google Analytics hiện có hoặc tạo tài khoản mới. Nếu bạn chọn tạo tài khoản mới, hãy chọn vị trí báo cáo Analytics, sau đó chấp nhận chế độ cài đặt chia sẻ dữ liệu và điều khoản của Google Analytics cho dự án của bạn.

ffbcd801d08078b2.png

473c89d0a404f066.png

  1. Nhấp vào Tạo dự án (hoặc Thêm Firebase nếu bạn đang sử dụng một dự án GCP hiện có).

Firebase tự động cung cấp tài nguyên cho dự án Firebase của bạn. Khi quy trình hoàn tất, bạn sẽ được chuyển đến trang tổng quan về dự án Firebase của mình trong bảng điều khiển của Firebase.

Đăng ký ứng dụng của bạn với Firebase

Khi có một dự án trên Firebase, bạn có thể thêm ứng dụng dành cho iOS của mình vào dự án đó.

Hãy truy cập vào trang Tìm hiểu về các dự án Firebase để tìm hiểu thêm về các phương pháp hay nhất và những điều cần cân nhắc khi thêm ứng dụng vào một dự án Firebase, bao gồm cả cách xử lý nhiều biến thể bản dựng.

  1. Truy cập vào bảng điều khiển của Firebase.
  2. Ở giữa trang tổng quan của dự án, hãy nhấp vào biểu tượng iOS để chạy quy trình thiết lập.

Nếu bạn đã thêm một ứng dụng vào dự án Firebase, hãy nhấp vào Thêm ứng dụng để hiển thị các lựa chọn về nền tảng.

549e710c09b601ea.png

  1. Nhập mã nhận dạng gói của ứng dụng vào trường Mã nhận dạng gói iOS.
  2. (Không bắt buộc) Nhập thông tin khác về ứng dụng: Biệt hiệu của ứng dụngMã App Store.
  3. Nhấp vào Đăng ký ứng dụng.

7a2bd11d13365c.png

Thêm tệp cấu hình Firebase

  1. Nhấp vào Tải GoogleService-Info.plist xuống để lấy tệp cấu hình Firebase iOS (GoogleService-Info.plist). 625594126a8943bf.png
  2. Di chuyển tệp cấu hình vào thư mục gốc của dự án Xcode. Nếu được nhắc, hãy chọn thêm tệp cấu hình vào tất cả các mục tiêu.

aa100af06c7a74e5.png

Nếu có nhiều mã nhận dạng gói trong dự án, bạn phải liên kết từng mã nhận dạng gói với một ứng dụng đã đăng ký trong bảng điều khiển của Firebase để mỗi ứng dụng có thể có tệp GoogleService-Info.plist riêng.

Đóng XCode.

Thêm SDK Firebase vào ứng dụng

Bạn nên sử dụng CocoaPods để cài đặt các thư viện Firebase. Tuy nhiên, nếu không muốn sử dụng CocoaPods, bạn có thể tích hợp trực tiếp các khung SDK hoặc sử dụng phiên bản beta của Trình quản lý gói Swift.

  1. Tạo Podfile nếu bạn chưa có. Nếu bạn đang sử dụng mẫu khởi động nhanh, thì dự án Xcode và Podfile (có các pod) đã có sẵn.
$ cd MessagingExample
$ pod init
  1. Vào Podfile, hãy thêm các nhóm Firebase mà bạn muốn dùng trong ứng dụng của mình.

Bạn có thể thêm bất kỳ sản phẩm nào được Firebase hỗ trợ vào ứng dụng iOS của mình.

Trong mẫu khởi động nhanh, SDK Google Analytics và SDK Giải pháp gửi thông báo qua đám mây của Firebase đã được thêm.

# Add the Firebase pod for Google Analytics
pod 'Firebase/Analytics'

# Add the pod for Firebase Cloud Messaging
pod 'Firebase/Messaging'
  1. Cài đặt các pod, sau đó mở tệp .xcworkspace để xem dự án trong Xcode:
$ pod install
  1. Mở MessagingExample.xcworkspace rồi nhấp vào Tiếp theo trong bảng điều khiển của Firebase. 1c5adae5b6e81655.png

Khởi động Firebase trong ứng dụng của bạn

Bạn cần thêm mã khởi chạy Firebase vào ứng dụng của mình.

Nhập mô-đun Firebase và định cấu hình một phiên bản dùng chung (Trong mẫu bắt đầu nhanh, mô-đun Firebase đã được nhập).

  1. Nhập mô-đun Firebase trong UIApplicationDelegate:

AppDelegate.swift

import UIKit
import Firebase // Add this line
  1. Định cấu hình một phiên bản dùng chung FirebaseApp, thường là trong phương thức application:didFinishLaunchingWithOptions: của ứng dụng:

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure() // Add this line
  return true
}
  1. Nhấp vào Tiếp theo trong bảng điều khiển của Firebase. df93274c5922fd55.png
  2. SDK Firebase sẽ được thêm vào ứng dụng của bạn. Nhấp vào Tiếp tục truy cập bảng điều khiển. 21b24098a470aa40.png

5. Định cấu hình ứng dụng FCM

Tải khoá xác thực APNs lên

Tải khoá xác thực APNs lên Firebase.

  1. Trong dự án của bạn trên bảng điều khiển của Firebase, hãy chọn biểu tượng bánh răng, chọn Project Settings (Cài đặt dự án), rồi chọn thẻ Cloud Messaging (Nhắn tin trên đám mây).

e1fcc1f1ace520e9.png

  1. Trong Khoá xác thực APNs trong mục Cấu hình ứng dụng Apple, hãy nhấp vào nút Tải lên để tải khoá xác thực phát triển, khoá xác thực sản xuất hoặc cả hai lên. Bạn phải cung cấp ít nhất một giá trị.

87ee87266eab43c4.png

  1. Duyệt đến vị trí mà bạn đã lưu khoá, chọn khoá đó rồi nhấp vào Mở. Thêm mã khoá cho khoá (có trong phần Certificates, Identifiers & Profiles (Chứng chỉ, mã nhận dạng và hồ sơ) trong Apple Developer Member Center) rồi nhấp vào Upload (Tải lên). 1491c513285d06e0.png

Đăng ký nhận thông báo từ xa

Khi khởi động hoặc tại điểm mong muốn trong quy trình ứng dụng, hãy đăng ký ứng dụng của bạn để nhận thông báo từ xa.

Trong mẫu hướng dẫn nhanh, registerForRemoteNotifications đã được thêm.

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  // [START register for remote notifications]
  if #available(iOS 10.0, *) {
    // For iOS 10 display notification (sent via APNS)
    UNUserNotificationCenter.current().delegate = self
        
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in })
  } else {
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
  }

  application.registerForRemoteNotifications()
  // [END register for remote notifications]
  return true
}

Chỉ định thuộc tính uỷ quyền của UNUserNotificationCenter bằng cách thêm các dòng sau vào cuối AppDelegate.swift.

AppDelegate.swift

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

Đặt uỷ quyền nhắn tin

Để nhận mã thông báo đăng ký, hãy triển khai giao thức uỷ quyền nhắn tin và đặt thuộc tính delegate của FIRMessaging sau khi gọi [FIRApp configure]. Ví dụ: nếu uỷ quyền ứng dụng của bạn tuân thủ giao thức uỷ quyền nhắn tin, thì bạn có thể đặt uỷ quyền trên application:didFinishLaunchingWithOptions: thành chính nó (Trong mẫu hướng dẫn nhanh, uỷ quyền đã được đặt).

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  Messaging.messaging().delegate = self // Add this line
  // [START register for remote notifications]
  if #available(iOS 10.0, *) {
    // For iOS 10 display notification (sent via APNS)
    UNUserNotificationCenter.current().delegate = self
        
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in })
  } else {
    let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
    application.registerUserNotificationSettings(settings)
  }

  application.registerForRemoteNotifications()
  // [END register for remote notifications]
  return true
}

Chỉ định thuộc tính uỷ quyền của FIRMessaging bằng cách thêm các dòng sau vào cuối AppDelegate.swift.

AppDelegate.swift

extension AppDelegate : MessagingDelegate {
  func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
    print("Firebase registration token: \(String(describing: fcmToken))")
    
    let dataDict:[String: String] = ["token": fcmToken ?? ""]
    NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
  }
}

Thêm các chức năng

Bạn đã thêm chức năng Thông báo đẩy trong phần Tạo mã nhận dạng ứng dụng, nhưng bạn cũng phải thêm chức năng này trên XCode bằng các bước sau (các bước bên dưới là trong XCode 12.3):

  1. Nhấp vào tên dự án trong Vùng điều hướng.
  2. Nhấp vào Ký và chức năng.
  3. Nhấp vào + Capability (Tính năng).

7207dce45aaa0fa.png

  1. Nhấp đúp vào Background Modes (Chế độ nền).
  2. Nhấp lại vào + Capability (Khả năng).
  3. Nhấp đúp vào Thông báo đẩy.
  4. Kiểm tra Thông báo từ xa trong phần Chế độ nền.

11a0a4f8a409fe44.png

6. Gửi thông báo

Bạn có thể gửi một tin nhắn kiểm thử bằng cách làm theo các bước sau:

  1. Cài đặt và chạy ứng dụng trên thiết bị mục tiêu. Bạn cần chấp nhận yêu cầu cấp quyền nhận thông báo từ xa.
  2. Lấy mã thông báo đăng ký trong nhật ký XCode.

b9383e848d00ab04.png

  1. Đảm bảo ứng dụng đang chạy ở chế độ nền trên thiết bị.
  2. Mở Trình soạn thông báo rồi chọn Thông báo mới.
  3. Nhập nội dung tin nhắn. 8f57ae055ce64321.png
  4. Chọn Gửi tin nhắn thử nghiệm.
  5. Trong trường có nhãn Thêm mã thông báo đăng ký FCM, hãy nhập mã thông báo đăng ký mà bạn nhận được ở bước 2.
  6. Nhấp vào Kiểm tra.

Sau khi bạn nhấp vào Kiểm thử, thiết bị ứng dụng khách mục tiêu (có ứng dụng ở chế độ nền) sẽ nhận được thông báo trong trung tâm thông báo.

Để biết thông tin chi tiết về việc gửi thông báo đến ứng dụng của bạn, hãy xem trang tổng quan báo cáo FCM. Trang tổng quan này ghi lại số lượng thông báo đã gửi và đã mở trên thiết bị iOS và Android.

b790de9a3e0dc1ef.png

7. Xin chúc mừng

Xin chúc mừng, bạn đã gửi thành công một tin nhắn kiểm thử!

FCM còn có nhiều chức năng và cấu hình khác, chẳng hạn như đăng ký theo chủ đề.

Hãy xem tài liệu chính thức dành cho nhà phát triển nếu bạn quan tâm đến các tính năng này.

Tiếp theo là gì?

Hãy xem một số lớp học lập trình này.

Tài liệu đọc thêm