0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Giám sát kết nối KMP nhỏ gọn cho Android và iOS

Đăng vào 5 ngày trước

• 4 phút đọc

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 Copy
// 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 Copy
// 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 Copy
<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 Copy
<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 Copy
// 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 Copy
// 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 Copy
@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 Copy
// 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 INTERNETACCESS_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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào