Giám sát Kết nối KMP Nhỏ gọn cho Android và iOS
Giới thiệu
Trong thế giới phát triển ứng dụng di động hiện đại, việc giám sát trạng thái kết nối mạng là rất quan trọng. Các ứng dụng cần phải phản hồi nhanh chóng với việc thay đổi kết nối của người dùng. Bài viết này giới thiệu một giám sát kết nối nhỏ gọn dựa trên Kotlin Multiplatform mà không yêu cầu sử dụng CocoaPods trên iOS. Dưới đây là các thông tin chi tiết và hướng dẫn cách sử dụng.
Tại sao tôi xây dựng điều này
Hầu hết các ứng dụng cần phải phản hồi với kết nối mạng. Tôi muốn một cách tiếp cận nhẹ nhàng và dễ sử dụng cho Compose Multiplatform mà vẫn giữ được:
- Một API trong
commonMain
- Các triển khai gốc cho từng nền tảng
- Không yêu cầu CocoaPods trên iOS
- Dễ dàng sử dụng từ Compose
Vì vậy, tôi đã xây dựng KMP Connectivity Monitor.
API nhỏ gọn (commonMain)
Chúng ta sẽ bắt đầu với việc định nghĩa API trong commonMain
. Dưới đây là mã nguồn cho giám sát kết nối:
kotlin
// com.qandil.kmpconnectivity.connectivity.Connectivity.kt
package com.qandil.kmpconnectivity.connectivity
import kotlinx.coroutines.flow.StateFlow
enum class ConnectivityStatus { Online, Offline, Unavailable }
interface ConnectivityMonitor {
val status: StateFlow<ConnectivityStatus>
fun start()
fun stop()
}
expect class ConnectivityMonitorFactory {
fun create(): ConnectivityMonitor
}
Cách hoạt động trên Android - ConnectivityManager
Trên Android, chúng ta sử dụng ConnectivityManager
để lắng nghe các callback và cập nhật MutableStateFlow
:
kotlin
// shared/src/androidMain/.../connectivity/Connectivity.android.kt (trích đoạn)
private fun updateNow() {
val caps = cm.getNetworkCapabilities(cm.activeNetwork)
val online = caps?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true &&
caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
scope.launch {
_status.value = if (online) ConnectivityStatus.Online else ConnectivityStatus.Offline
}
}
override fun start() {
updateNow()
val req = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
cm.registerNetworkCallback(req, callback)
}
Cấu hình Manifest Android (module ứng dụng)
Để đảm bảo ứng dụng có quyền truy cập mạng, bạn cần thêm các quyền sau vào file AndroidManifest.xml:
xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Mẹo (đối với lint thư viện): shared/src/androidMain/AndroidManifest.xml
xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
Cách hoạt động trên iOS - SCNetworkReachability
Trên iOS, chúng ta sử dụng SCNetworkReachability
để theo dõi kết nối:
kotlin
// shared/src/iosMain/.../connectivity/Connectivity.ios.kt (trích đoạn)
@file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class)
private fun update(flags: SCNetworkReachabilityFlags) {
val reachable = flags.toInt() and kSCNetworkReachabilityFlagsReachable.toInt() != 0
val needsConn = flags.toInt() and kSCNetworkReachabilityFlagsConnectionRequired.toInt() != 0
val online = reachable && !needsConn
scope.launch {
_status.value = if (online) ConnectivityStatus.Online else ConnectivityStatus.Offline
}
}
Liên kết Gradle (SystemConfiguration)
Khi sử dụng iOS, bạn cần liên kết với SystemConfiguration
trong file Gradle:
kotlin
// shared/build.gradle.kts
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
kotlin {
targets.withType<KotlinNativeTarget>().configureEach {
binaries.all { linkerOpts("-framework", "SystemConfiguration") }
}
}
Thay thế NWPathMonitor
Nếu bạn muốn sử dụng NWPathMonitor
, có thể chuyển đổi triển khai iOS sang Network.framework
và liên kết thay thế.
Sử dụng trong Compose
Để sử dụng ConnectivityMonitor
trong ứng dụng Compose, bạn có thể làm như sau:
kotlin
@Composable
fun Main(factory: ConnectivityMonitorFactory) {
val monitor = remember(factory) { factory.create() }
val status by monitor.status.collectAsState(ConnectivityStatus.Unavailable)
LaunchedEffect(Unit) { monitor.start() }
DisposableEffect(Unit) { onDispose { monitor.stop() } }
// render UI của bạn (ví dụ, một thẻ trạng thái với Online / Offline / …)
}
Điểm vào nền tảng:
kotlin
// Android
setContent { Main(factory = com.qandil.kmpconnectivity.connectivity.ConnectivityMonitorFactory(this)) }
// iOS
Main(factory = com.qandil.kmpconnectivity.connectivity.ConnectivityMonitorFactory())
Cách chạy
Android: Sử dụng lệnh ./gradlew :androidApp:assembleDebug
(hoặc chạy từ Android Studio).
iOS: Chạy từ cấu hình iOS của Android Studio hoặc từ dự án Xcode của bạn (Simulator/Device).
Lộ trình / giúp đỡ cần thiết
- Thêm chức năng
Flow.retryWhenOnline(monitor)
- Xuất loại mạng (Wi-Fi/Cellular)
Kiểm tra với stub
Nếu bạn thấy điều này hữu ích, một ⭐ hoặc PR sẽ có ý nghĩa rất nhiều:
Repo: KMP-Connectivity-Monitor
Giấy phép
Giấy phép MIT (trong repo).
Các thực tiễn tốt nhất
- Đảm bảo bạn luôn kiểm tra trạng thái kết nối trước khi thực hiện các tác vụ phụ thuộc vào mạng.
- Sử dụng các callback để cập nhật giao diện người dùng một cách hiệu quả.
Những cạm bẫy phổ biến
- Không xử lý các tình huống ngoại lệ khi không có kết nối mạng.
- Đảm bảo không gây rò rỉ bộ nhớ bằng cách dừng giám sát khi không cần thiết.
Mẹo hiệu suất
- Sử dụng
StateFlow
để quản lý trạng thái kết nối một cách hiệu quả. - Tối ưu hóa mã để giảm thiểu tác động đến hiệu suất ứng dụng.
Câu hỏi thường gặp (FAQ)
1. Tôi có thể sử dụng giám sát kết nối này trên các nền tảng khác không?
Hiện tại, nó chỉ hỗ trợ Android và iOS.
2. Cần phải có quyền nào để sử dụng giám sát kết nối?
Cần có quyền INTERNET
và ACCESS_NETWORK_STATE
trên Android.
3. Có thể tùy chỉnh giám sát kết nối không?
Có, bạn có thể mở rộng và tùy chỉnh theo nhu cầu của mình.
Kết luận
Giám sát kết nối KMP là một công cụ hữu ích cho các nhà phát triển ứng dụng di động, giúp bạn dễ dàng quản lý trạng thái kết nối của người dùng. Hãy thử nghiệm và đóng góp ý kiến để cải thiện công cụ này!
Hãy khám phá kho mã nguồn tại KMP-Connectivity-Monitor và tham gia cùng chúng tôi trong việc phát triển công cụ này!