Bắt đầu sử dụng Giải pháp gửi thông báo qua đám mây của Firebase


Hướng dẫn bắt đầu nhanh này mô tả cách thiết lập Firebase Cloud Messaging trong các ứng dụng web và ứng dụng di động của bạn để có thể gửi tin nhắn một cách đáng tin cậy. Đối với môi trường máy chủ, hãy xem phần Môi trường máy chủ và FCM.

Thiết lập một ứng dụng khách Giải pháp gửi thông báo qua đám mây của Firebase trên Flutter

Tuỳ thuộc vào nền tảng mà bạn đang nhắm đến, bạn sẽ cần thực hiện thêm một số bước thiết lập bắt buộc.

iOS+

Thay đổi phương thức

Để sử dụng trình bổ trợ FCM Flutter trên các thiết bị Apple, bạn cần phải sử dụng phương thức thay thế. Nếu không có thư viện này, các tính năng chính của Firebase như xử lý mã thông báo FCM sẽ không hoạt động đúng cách.

Android

Dịch vụ Google Play

Các ứng dụng FCM yêu cầu thiết bị chạy Android 4.4 trở lên, đồng thời đã cài đặt Dịch vụ Google Play hoặc trình mô phỏng chạy Android 4.4 có API của Google. Xin lưu ý rằng bạn không bị giới hạn trong việc triển khai các ứng dụng Android thông qua Cửa hàng Google Play.

Những ứng dụng dựa vào Play Services SDK phải luôn kiểm tra thiết bị để tìm APK Dịch vụ Google Play tương thích trước khi truy cập vào các tính năng của Dịch vụ Google Play. Bạn nên thực hiện việc này ở hai nơi: trong phương thức onCreate() của hoạt động chính và trong phương thức onResume() của hoạt động đó. Hoạt động kiểm tra onCreate() đảm bảo rằng ứng dụng không thể được dùng nếu không kiểm tra thành công. Thao tác kiểm tra trong onResume() đảm bảo rằng nếu người dùng quay lại ứng dụng đang chạy thông qua một số phương tiện khác, chẳng hạn như thông qua nút quay lại, thì thao tác kiểm tra vẫn được thực hiện.

Nếu thiết bị không có phiên bản Dịch vụ Google Play tương thích, ứng dụng của bạn có thể gọi GoogleApiAvailability.makeGooglePlayServicesAvailable() để cho phép người dùng tải Dịch vụ Google Play xuống từ Cửa hàng Play.

Web

Định cấu hình Thông tin đăng nhập trên web bằng FCM

Giao diện web FCM sử dụng thông tin đăng nhập trên web (còn gọi là khoá Nhận dạng máy chủ ứng dụng tự nguyện hoặc "VAPID") để uỷ quyền cho các yêu cầu gửi đến các dịch vụ thông báo đẩy trên web được hỗ trợ. Để đăng ký nhận thông báo đẩy cho ứng dụng, bạn cần liên kết một cặp khoá với dự án Firebase. Bạn có thể tạo một cặp khoá mới hoặc nhập cặp khoá hiện có thông qua bảng điều khiển Firebase.

Cài đặt trình bổ trợ FCM

  1. Cài đặt và khởi chạy các trình bổ trợ Firebase cho Flutter nếu bạn chưa làm.

  2. Từ gốc của dự án Flutter, hãy chạy lệnh sau để cài đặt trình bổ trợ:

    flutter pub add firebase_messaging
    
  3. Sau khi hoàn tất, hãy tạo lại ứng dụng Flutter:

    flutter run
    

Truy cập vào mã thông báo đăng ký

Để gửi thông báo đến một thiết bị cụ thể, bạn cần biết mã thông báo đăng ký của thiết bị đó. Để truy xuất mã thông báo đăng ký cho một phiên bản ứng dụng, hãy gọi getToken(). Nếu bạn chưa cấp quyền gửi thông báo, phương thức này sẽ yêu cầu người dùng cấp quyền gửi thông báo. Nếu không, phương thức này sẽ trả về một mã thông báo hoặc từ chối yêu cầu trong tương lai do lỗi.

// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);

// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
 // APNS token is available, make FCM plugin API requests...
}

Trên các nền tảng web, hãy truyền khoá công khai VAPID đến getToken():

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

Để nhận thông báo bất cứ khi nào mã thông báo được cập nhật, hãy đăng ký luồng onTokenRefresh:

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

Ngăn quá trình khởi chạy tự động

Khi mã thông báo đăng ký FCM được tạo, thư viện sẽ tải giá trị nhận dạng và dữ liệu cấu hình lên Firebase. Nếu bạn muốn ngăn chặn việc tự động tạo mã thông báo, hãy tắt tính năng tự động khởi tạo tại thời điểm tạo bản dựng.

iOS

Trên iOS, hãy thêm một giá trị siêu dữ liệu vào Info.plist:

FirebaseMessagingAutoInitEnabled = NO

Android

Trên Android, hãy tắt tính năng thu thập dữ liệu Analytics và tính năng tự động khởi chạy FCM (bạn phải tắt cả hai) bằng cách thêm các giá trị siêu dữ liệu sau vào AndroidManifest.xml:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

Bật lại tính năng tự động khởi tạo FCM trong thời gian chạy

Để bật tính năng tự động khởi tạo cho một phiên bản ứng dụng cụ thể, hãy gọi setAutoInitEnabled():

await FirebaseMessaging.instance.setAutoInitEnabled(true);

Giá trị này vẫn giữ nguyên khi ứng dụng khởi động lại sau khi được đặt.

Gửi thông báo thử nghiệm

  1. Cài đặt và chạy ứng dụng trên thiết bị mục tiêu. Trên thiết bị Apple, 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. Đảm bảo ứng dụng đang chạy ở chế độ nền trên thiết bị.
  3. Trong bảng điều khiển của Firebase, hãy mở trang Nhắn tin.
  4. Nếu đây là thông báo đầu tiên của bạn, hãy chọn Tạo chiến dịch đầu tiên.
    1. Chọn Thông báo của Firebase rồi chọn Tạo.
  5. Nếu không, trên thẻ Chiến dịch, hãy chọn Chiến dịch mới rồi chọn Thông báo.
  6. Nhập nội dung tin nhắn.
  7. Chọn Gửi tin nhắn thử nghiệm trong ngăn bên phải.
  8. 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ý.
  9. Chọn Kiểm tra.

Sau khi bạn chọn Kiểm thử, thiết bị khách mục tiêu (với ứng dụng ở chế độ nền) sẽ nhận được 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ị Apple và Android, cùng với dữ liệu về lượt hiển thị cho ứng dụng Android.

Xử lý lượt tương tác

Khi người dùng nhấn vào một thông báo, hành vi mặc định trên cả Android và iOS là mở ứng dụng. Nếu ứng dụng bị chấm dứt, thì ứng dụng sẽ được khởi động và nếu đang ở chế độ nền, thì ứng dụng sẽ được đưa lên chế độ nền trước.

Tuỳ thuộc vào nội dung của thông báo, bạn có thể muốn xử lý hoạt động tương tác của người dùng khi ứng dụng mở. Ví dụ: nếu một tin nhắn trò chuyện mới được gửi bằng thông báo và người dùng chọn tin nhắn đó, thì bạn có thể muốn mở cuộc trò chuyện cụ thể khi ứng dụng mở.

Gói firebase-messaging cung cấp 2 cách để xử lý hoạt động tương tác này:

  1. getInitialMessage(): Nếu ứng dụng được mở ở trạng thái đã kết thúc, phương thức này sẽ trả về một Future chứa RemoteMessage. Sau khi được sử dụng, RemoteMessage sẽ bị xoá.
  2. onMessageOpenedApp: Một Stream đăng một RemoteMessage khi ứng dụng được mở từ trạng thái nền.

Để đảm bảo người dùng có trải nghiệm suôn sẻ, bạn nên xử lý cả hai trường hợp. Ví dụ về mã sau đây trình bày cách đạt được điều này:

class Application extends StatefulWidget {
  @override
  State createState() => _Application();
}

class _Application extends State {
  // In this example, suppose that all messages contain a data field with the key 'type'.
  Future setupInteractedMessage() async {
    // Get any messages which caused the application to open from
    // a terminated state.
    RemoteMessage? initialMessage =
        await FirebaseMessaging.instance.getInitialMessage();

    // If the message also contains a data property with a "type" of "chat",
    // navigate to a chat screen
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }

    // Also handle any interaction when the app is in the background using a
    // Stream listener
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    if (message.data['type'] == 'chat') {
      Navigator.pushNamed(context, '/chat',
        arguments: ChatArguments(message),
      );
    }
  }

  @override
  void initState() {
    super.initState();

    // Run code required to handle interacted messages in an async function
    // as initState() must not be async
    setupInteractedMessage();
  }

  @override
  Widget build(BuildContext context) {
    return Text("...");
  }
}

Cách bạn xử lý hoạt động tương tác tuỳ thuộc vào chế độ thiết lập của bạn. Ví dụ đã trình bày trước đó là một ví dụ cơ bản về cách sử dụng StatefulWidget.

Các bước tiếp theo

Sau khi hoàn tất các bước thiết lập, bạn có thể chọn một trong những cách sau để tiếp tục sử dụng FCM cho Flutter: