op_wifi_utils 1.4.2
op_wifi_utils: ^1.4.2 copied to clipboard
A lightweight Flutter plugin using modern Android and iOS APIs to connect to Wi-Fi, disconnect, and retrieve the current SSID, based on OpResult for structured error handling.
Changelog #
1.4.2 – 2025-09-27 #
Changed #
-
Dart (
connectToWifi)- Increased default timeout from 15s → 30s to reduce spurious timeouts on slower devices.
- Platform-specific timeout behavior:
- iOS: still throws
READY_TIMEOUTon Dart-side timeout. - Android: on Dart-side timeout we now return
false(mapped toUNAVAILABLE) instead of throwing, making timeouts a retryable condition rather than an exception.
- iOS: still throws
- Clarified inline docs around
joinOnceand timeout semantics.
-
Android
- Proactively unregister any previous
NetworkCallbackbefore issuing a new request to avoid callback leaks. - Bind the process to the acquired Wi-Fi network on
onAvailable; unbind ononLostand during disconnect for clean routing. - On
onUnavailable, cleanly unregister the callback and reset internal state. disconnectFromWifi: reliably unbinds and unregisters the active callback; improved logging.
- Proactively unregister any previous
Notes #
- No breaking API changes.
- iOS native code unchanged in this release.
1.4.1 – 2025-09-13 #
Fixed #
- iOS:
- Reverted to the simpler and more reliable 1.2.2-style connection flow (
apply → short settle delay → optional SSID peek) for improved first-attempt stability. - Treats
alreadyAssociatedas a success case when the OS reports the SSID is already connected. - Added a single-call guard around
FlutterResultto prevent double completion. - Ensured
NEHotspotConfigurationManager.apply(...)always runs on the main thread, with a diagnostic log if invoked off-thread. - Expanded error mapping for clearer feedback:
INVALID_PASSWORDfor wrong passphrasesPERMISSION_REQUIREDwhen location/Wi-Fi permissions are missingUNAVAILABLEwhen Wi-Fi is off, OS is busy, or another join is pendingUNKNOWN_CURRENT_SSIDwhen the current network cannot be determinedNEHOTSPOT_UNKNOWNfor unmappedNEHotspotConfigurationErrorDomaincases- Fallback to
UNKNOWNfor unexpected system errors
- Reverted to the simpler and more reliable 1.2.2-style connection flow (
Notes #
- No API changes. Dart interface remains the same.
- Android side unchanged from 1.4.0.
- This patch focuses purely on improving reliability and diagnostics of iOS hotspot connections.
1.4.0 – 2025-09-11 #
Added #
- iOS:
connectToWifinow supports an optional readiness phase with new parameters:waitForReady,probeHost,probePort,totalTimeout,step
Improved #
- iOS:
- Treats
alreadyAssociatedas success when reconnecting to a known SSID. - Uses
NEHotspotNetwork.fetchCurrent+ TCP probe (Network framework) for robust readiness. - Single-call guard around
FlutterResultto prevent double completion. - Clearer error mapping (
INVALID_PASSWORD,PERMISSION_REQUIRED,UNAVAILABLE, etc.).
- Treats
- Android (API 29+):
- Added a timeout to
ConnectivityManager.requestNetwork(..., timeoutMs)to avoid rare indefinite waits when the OS can’t attach. - Unbind the process (
bindProcessToNetwork(null)) inonLostto cleanly release the hotspot route if the network disappears/roams. - Guard unbind against the last bound
Networkto avoid touching unrelated networks.
- Added a timeout to
Fixed #
- iOS: Resolved the race where
connectToWifireported success but the first HTTP command failed witherrno 51 (Network is unreachable).
Notes #
- No breaking API changes. Android changes only make failure/roam cases more deterministic.
1.3.0 - 2025-06-12 #
Fixed #
- Android: Prevented rare crash in
connectToWificaused by multiple invocations ofresult.success/errordue to network callback races. Now uses anAtomicBooleanguard to ensure only one result is returned. - iOS: Prevented potential crash in
connectToWifiby wrappingFlutterResultin a single-call-safe closure to avoid double invocation under race conditions.
Improved #
- Android: Finalized safe binding and callback cleanup during Wi-Fi connection flow, ensuring
bindProcessToNetworkandunregisterNetworkCallbackare used defensively. - iOS:
getCurrentSsidnow gracefully handles missing permissions, unavailable interfaces, and unsupported cases with informative errors. - Internal: Aligned native implementations for both platforms with consistent safeguards and cleaned up error handling.
1.2.2 - 2025-04-18 #
Fixed #
- Properly unregisters the network callback in
disconnectFromWifion Android 10+ to fully release temporary Wi-Fi connections established viaWifiNetworkSpecifier. - Prevents lingering connections and ensures the system cleans up the app-bound network reliably after disconnect.
Improved #
- Strengthened
disconnectFromWifibehavior on Android by combiningbindProcessToNetwork(null)withunregisterNetworkCallbackwhen applicable, as per platform requirements for Android 10+.
1.2.1 - 2025-04-17 #
Fixed #
- Fixed a critical issue introduced in
v1.2.0whereconnectToWifion Android incorrectly returnedINVALID_PASSWORDdue to unreliable SSID validation after connection. - The plugin now trusts the system connection callback (
onAvailable) on Android 10+ and does not rely onWifiManager.connectionInfo.ssid, which may return<unknown ssid>. - Ensures proper use of
UNAVAILABLEas a general error when the connection fails without specific cause.
Added #
- New
OpWifiUtilsError.unavailableerror type to represent general connection failures on Android (e.g., network out of range, wrong password, or timeout).
1.2.0 - 2025-04-15 #
Changed #
- All
result.successandresult.errorcalls in Android native code are now wrapped inHandler(Looper.getMainLooper()).post { ... }to ensure safe main thread return. - This change improves stability and avoids potential crashes or UI threading issues across different Android versions and manufacturers.
- Also avoids blocking the main thread while waiting for platform responses, improving compatibility with Flutter's MethodChannel behavior.
1.1.0 - 2025-04-14 #
- Improved
connectToWifibehavior on iOS:- Handles iOS error code 2 (invalid password format) and maps it to
INVALID_PASSWORD. - Verifies actual connection by comparing current SSID after a short delay.
- Distinguishes
SSID_NOT_FOUNDfrom other connection issues.
- Handles iOS error code 2 (invalid password format) and maps it to
- Improved
connectToWifibehavior on Android:- After
onAvailable, verifies the actual connected SSID. - If the SSID doesn't match the expected one, returns
INVALID_PASSWORDto indicate likely credential issues.
- After
1.0.1 - 2025-04-03 #
- README and pubspec wording improved for clarity and consistency
1.0.0 - 2025-04-03 #
- Initial release 🎉
- Connect to Wi-Fi with optional password (iOS and Android)
- Disconnect from Wi-Fi network
- Check current connected SSID
- Full OpResult-based error handling
- joinOnce option supported on iOS
- Example app included for both platforms