Ứng dụng FCM yêu cầu thiết bị chạy Android 4.4 hoặc cao hơn và có cài đặt ứng dụng Cửa hàng Google Play hoặc một trình mô phỏng chạy Android 4.4 với các API của Google. Xin lưu ý rằng bạn không bị giới hạn ở việc triển khai các ứng dụng Android thông qua Cửa hàng Google Play.
Thiết lập SDK
Phần này đề cập đến những việc bạn có thể đã hoàn thành nếu bạn đã bật tính năng này các tính năng khác của Firebase cho ứng dụng của bạn. Thêm Firebase vào dự án Android của bạn nếu bạn chưa thực hiện việc này
Chỉnh sửa tệp kê khai ứng dụng
Thêm đoạn mã sau vào tệp kê khai của ứng dụng:
- Dịch vụ mở rộng
FirebaseMessagingService
. Đây là yêu cầu bắt buộc nếu bạn muốn thực hiện bất kỳ việc xử lý tin nhắn nào ngoài việc nhận thông báo trên ứng dụng nền. Để nhận thông báo trong các ứng dụng chạy trên nền trước, hãy nhận để gửi thông báo ngược dòng, v.v., bạn phải mở rộng . - (Không bắt buộc) Trong thành phần ứng dụng, các phần tử siêu dữ liệu để đặt thông báo mặc định biểu tượng và màu sắc. Android sử dụng các giá trị này bất cứ khi nào các thông báo không được đặt biểu tượng hoặc màu sắc rõ ràng.
- (Không bắt buộc) Từ Android 8.0 (API cấp 26) trở lên,
kênh thông báo được hỗ trợ và khuyên dùng. FCM cung cấp giá trị mặc định
kênh thông báo bằng các chế độ cài đặt cơ bản. Nếu bạn muốn
tạo và sử dụng kênh mặc định của riêng bạn,
đặt
default_notification_channel_id
thành mã nhận dạng của đối tượng kênh thông báo như hình; FCM sẽ sử dụng thông tin này bất cứ khi nào tin nhắn đến không đặt thông báo rõ ràng của bạn. Để tìm hiểu thêm, hãy xem Quản lý kênh thông báo.
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" />
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
Yêu cầu quyền gửi thông báo khi bắt đầu chạy trên Android 13 trở lên
Android 13 giới thiệu một quyền mới khi bắt đầu chạy để hiện thông báo. Chiến dịch này ảnh hưởng đến tất cả ứng dụng chạy trên Android 13 trở lên sử dụng FCM thông báo.
Theo mặc định, SDK FCM (phiên bản 23.0.6 trở lên) bao gồm
POST_NOTIFICATIONS
quyền được xác định trong tệp kê khai.
Tuy nhiên, ứng dụng của bạn cũng sẽ cần yêu cầu phiên bản thời gian chạy của
thông qua hằng số, android.permission.POST_NOTIFICATIONS
.
Ứng dụng của bạn sẽ không được phép hiện thông báo cho đến
người dùng đã cấp quyền này.
Cách yêu cầu quyền khi bắt đầu chạy mới:
Kotlin+KTX
// Declare the launcher at the top of your Activity/Fragment: private val requestPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission(), ) { isGranted: Boolean -> if (isGranted) { // FCM SDK (and your app) can post notifications. } else { // TODO: Inform user that that your app will not show notifications. } } private fun askNotificationPermission() { // This is only necessary for API level >= 33 (TIRAMISU) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED ) { // FCM SDK (and your app) can post notifications. } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) { // TODO: display an educational UI explaining to the user the features that will be enabled // by them granting the POST_NOTIFICATION permission. This UI should provide the user // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission. // If the user selects "No thanks," allow the user to continue without notifications. } else { // Directly ask for the permission requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) } } }
Java
// Declare the launcher at the top of your Activity/Fragment: private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { // FCM SDK (and your app) can post notifications. } else { // TODO: Inform user that that your app will not show notifications. } }); private void askNotificationPermission() { // This is only necessary for API level >= 33 (TIRAMISU) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { // FCM SDK (and your app) can post notifications. } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) { // TODO: display an educational UI explaining to the user the features that will be enabled // by them granting the POST_NOTIFICATION permission. This UI should provide the user // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission. // If the user selects "No thanks," allow the user to continue without notifications. } else { // Directly ask for the permission requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS); } } }
Nói chung, bạn nên hiển thị giao diện người dùng giải thích cho người dùng được bật nếu cấp quyền cho để đăng thông báo. Giao diện người dùng này sẽ cung cấp cho người dùng các tuỳ chọn để đồng ý hay từ chối, chẳng hạn như OK và Không, cảm ơn các nút. Nếu người dùng chọn OK, hãy trực tiếp yêu cầu cấp quyền. Nếu người dùng chọn Không, cảm ơn, hãy cho phép để người dùng tiếp tục mà không nhận thông báo.
Xem bài viết Quyền khi bắt đầu chạy thông báo
để biết thêm các phương pháp hay nhất về thời điểm ứng dụng của bạn nên yêu cầu
POST_NOTIFICATIONS
từ người dùng.
Quyền gửi thông báo đối với ứng dụng nhắm đến Android 12L (API cấp 32) trở xuống
Android tự động yêu cầu người dùng cấp quyền trong lần đầu ứng dụng của bạn sẽ tạo một kênh thông báo miễn là ứng dụng chạy trên nền trước. Tuy nhiên, có một số điều quan trọng cần lưu ý về thời điểm tạo kênh và yêu cầu quyền:
- Nếu ứng dụng của bạn tạo kênh thông báo đầu tiên khi đang chạy trong nền (SDK FCM sẽ thực hiện khi nhận được một FCM), thì Android sẽ không cho phép đặt thông báo này và sẽ không nhắc người dùng cấp quyền gửi thông báo cho đến vào lần tiếp theo ứng dụng của bạn được mở. Điều này có nghĩa là mọi thông báo nhận được trước khi ứng dụng được mở và người dùng cho rằng quyền sẽ bị mất.
- Bạn nên cập nhật ứng dụng để nhắm đến Android 13 trở lên tận dụng API của nền tảng để yêu cầu quyền. Nếu không có thể, ứng dụng của bạn nên tạo các kênh thông báo trước khi gửi bất kỳ thông báo cho ứng dụng để kích hoạt quyền gửi thông báo và đảm bảo không có thông báo nào bị mất. Xem các phương pháp hay nhất về quyền gửi thông báo để biết thêm thông tin.
Không bắt buộc: xoá quyền POST_NOTIFICATIONS
Theo mặc định, SDK FCM bao gồm quyền POST_NOTIFICATIONS
.
Nếu ứng dụng của bạn không sử dụng nội dung thông báo (cho dù thông qua FCM
thông báo, thông qua SDK khác hoặc do ứng dụng của bạn đăng trực tiếp) và bạn
không muốn ứng dụng của bạn bao gồm quyền này, bạn có thể loại bỏ quyền đó bằng cách sử dụng
công cụ hợp nhất tệp kê khai
Điểm đánh dấu remove
. Xin lưu ý rằng khi bạn xoá quyền này, màn hình sẽ không hiển thị
của tất cả thông báo, chứ không chỉ FCM thông báo. Thêm đoạn mã sau vào
tệp kê khai của ứng dụng:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>
Truy cập vào mã thông báo đăng ký thiết bị
Khi khởi động ứng dụng lần đầu tiên, SDK FCM sẽ tạo một đăng ký
mã thông báo cho phiên bản ứng dụng khách. Nếu bạn muốn nhắm đến một thiết bị hoặc
tạo nhóm thiết bị, bạn sẽ cần truy cập vào mã thông báo này bằng cách mở rộng
FirebaseMessagingService
và ghi đè onNewToken
.
Phần này mô tả cách truy xuất mã thông báo và cách theo dõi các thay đổi vào mã thông báo. Vì mã thông báo có thể bị xoay vòng sau lần đầu bạn nên truy xuất thông tin đăng ký mới nhất được cập nhật mã thông báo.
Mã thông báo đăng ký có thể thay đổi khi:
- Ứng dụng đó được khôi phục trên một thiết bị mới
- Người dùng gỡ cài đặt/cài đặt lại ứng dụng
- Người dùng xoá dữ liệu ứng dụng.
Truy xuất mã thông báo đăng ký hiện tại
Khi bạn cần truy xuất mã thông báo hiện tại, hãy gọi
FirebaseMessaging.getInstance().getToken()
:
Kotlin+KTX
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> if (!task.isSuccessful) { Log.w(TAG, "Fetching FCM registration token failed", task.exception) return@OnCompleteListener } // Get new FCM registration token val token = task.result // Log and toast val msg = getString(R.string.msg_token_fmt, token) Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() })
Java
FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Log.w(TAG, "Fetching FCM registration token failed", task.getException()); return; } // Get new FCM registration token String token = task.getResult(); // Log and toast String msg = getString(R.string.msg_token_fmt, token); Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
Giám sát quá trình tạo mã thông báo
Lệnh gọi lại onNewToken
sẽ kích hoạt bất cứ khi nào mã thông báo mới được tạo.
Kotlin+KTX
/** * Called if the FCM registration token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the * FCM registration token is initially generated so this is where you would retrieve the token. */ override fun onNewToken(token: String) { Log.d(TAG, "Refreshed token: $token") // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendRegistrationToServer(token) }
Java
/** * There are two scenarios when onNewToken is called: * 1) When a new token is generated on initial app startup * 2) Whenever an existing token is changed * Under #2, there are three scenarios when the existing token is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ @Override public void onNewToken(@NonNull String token) { Log.d(TAG, "Refreshed token: " + token); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendRegistrationToServer(token); }
Sau khi nhận được mã thông báo, bạn có thể gửi mã đó đến máy chủ ứng dụng của mình và lưu trữ bằng cách dùng phương thức bạn ưa dùng.
Kiểm tra Dịch vụ Google Play
Ứng dụng dựa vào SDK Dịch vụ Google Play
phải luôn kiểm tra xem thiết bị có APK dịch vụ Google Play tương thích hay không 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 trong
hai vị trí: trong phương thức onCreate()
của hoạt động chính và trong
onResume()
. Quy trình xác nhận có mặt onCreate()
đảm bảo rằng ứng dụng
không thể sử dụng nếu không kiểm tra thành công. Việc xác nhận có mặt tại onResume()
sẽ đảm bảo
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, quá trình 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.
Ngăn việc khởi chạy tự động
Khi mã thông báo đăng ký FCM được tạo, thư viện sẽ tải lên
giá trị nhận dạng và dữ liệu cấu hình
Firebase. Nếu bạn muốn ngăn việc tự động tạo mã thông báo, hãy tắt tính năng thu thập Analytics và
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 này 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 động FCM, hãy thực hiện lệnh gọi trong thời gian chạy:
Kotlin+KTX
Firebase.messaging.isAutoInitEnabled = true
Java
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
Để bật lại tính năng thu thập Analytics, hãy gọi phương thức
setAnalyticsCollectionEnabled()
của lớp FirebaseAnalytics
. Ví dụ:
setAnalyticsCollectionEnabled(true);
Các giá trị này sẽ vẫn tồn tại khi ứng dụng khởi động lại sau khi đặt.
Các bước tiếp theo
Sau khi thiết lập ứng dụng, bạn đã có thể bắt đầu gửi thông báo xuôi bằng Trình soạn thông báo. Chức năng này được minh hoạ trong mẫu bắt đầu nhanh, mà bạn có thể tải xuống, chạy và xem lại.
Để thêm hành vi khác, nâng cao hơn vào ứng dụng của mình, bạn có thể khai báo bộ lọc ý định và triển khai một hoạt động để phản hồi thư đến tin nhắn. Để biết thông tin chi tiết, hãy xem hướng dẫn gửi thông báo từ máy chủ ứng dụng:
Lưu ý để tận dụng các tính năng này, bạn sẽ cần có triển khai máy chủ và các procotol máy chủ (HTTP hoặc XMPP) hoặc triển khai SDK dành cho quản trị viên.