@onekeyfe/react-native-network-info 1.1.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,20 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "NetworkInfo"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => min_ios_version_supported }
14
+ s.source = { :git => "https://github.com/OneKeyHQ/app-modules/react-native-network-info.git", :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift,c}"
17
+ s.frameworks = 'CoreLocation', 'SystemConfiguration', 'NetworkExtension'
18
+
19
+ install_modules_dependencies(s)
20
+ end
@@ -0,0 +1,77 @@
1
+ buildscript {
2
+ ext.getExtOrDefault = {name ->
3
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['NetworkInfo_' + name]
4
+ }
5
+
6
+ repositories {
7
+ google()
8
+ mavenCentral()
9
+ }
10
+
11
+ dependencies {
12
+ classpath "com.android.tools.build:gradle:8.7.2"
13
+ // noinspection DifferentKotlinGradleVersion
14
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}"
15
+ }
16
+ }
17
+
18
+
19
+ apply plugin: "com.android.library"
20
+ apply plugin: "kotlin-android"
21
+
22
+ apply plugin: "com.facebook.react"
23
+
24
+ def getExtOrIntegerDefault(name) {
25
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["NetworkInfo_" + name]).toInteger()
26
+ }
27
+
28
+ android {
29
+ namespace "com.rnnetworkinfo"
30
+
31
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
32
+
33
+ defaultConfig {
34
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
35
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
36
+ }
37
+
38
+ buildFeatures {
39
+ buildConfig true
40
+ }
41
+
42
+ buildTypes {
43
+ release {
44
+ minifyEnabled false
45
+ }
46
+ }
47
+
48
+ lintOptions {
49
+ disable "GradleCompatible"
50
+ }
51
+
52
+ compileOptions {
53
+ sourceCompatibility JavaVersion.VERSION_1_8
54
+ targetCompatibility JavaVersion.VERSION_1_8
55
+ }
56
+
57
+ sourceSets {
58
+ main {
59
+ java.srcDirs += [
60
+ "generated/java",
61
+ "generated/jni"
62
+ ]
63
+ }
64
+ }
65
+ }
66
+
67
+ repositories {
68
+ mavenCentral()
69
+ google()
70
+ }
71
+
72
+ def kotlin_version = getExtOrDefault("kotlinVersion")
73
+
74
+ dependencies {
75
+ implementation "com.facebook.react:react-android"
76
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
77
+ }
@@ -0,0 +1,265 @@
1
+ package com.rnnetworkinfo
2
+
3
+ import android.content.Context
4
+ import android.net.ConnectivityManager
5
+ import android.net.NetworkCapabilities
6
+ import android.net.wifi.WifiInfo
7
+ import android.net.wifi.WifiManager
8
+ import android.os.Build
9
+ import com.facebook.react.bridge.Promise
10
+ import com.facebook.react.bridge.ReactApplicationContext
11
+ import com.facebook.react.module.annotations.ReactModule
12
+ import java.net.Inet4Address
13
+ import java.net.Inet6Address
14
+ import java.net.InetAddress
15
+ import java.net.NetworkInterface
16
+
17
+ @ReactModule(name = NetworkInfoModule.NAME)
18
+ class NetworkInfoModule(reactContext: ReactApplicationContext) :
19
+ NativeRNNetworkInfoSpec(reactContext) {
20
+
21
+ companion object {
22
+ const val NAME = "RNNetworkInfo"
23
+ }
24
+
25
+ override fun getName(): String = NAME
26
+
27
+ // MARK: - getSSID
28
+
29
+ override fun getSSID(promise: Promise) {
30
+ Thread {
31
+ try {
32
+ val ssid = getWifiSSID()
33
+ promise.resolve(ssid)
34
+ } catch (e: Exception) {
35
+ promise.resolve(null)
36
+ }
37
+ }.start()
38
+ }
39
+
40
+ private fun getWifiSSID(): String? {
41
+ val context = reactApplicationContext
42
+ val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager
43
+ ?: return null
44
+ @Suppress("DEPRECATION")
45
+ val wifiInfo: WifiInfo = wifiManager.connectionInfo ?: return null
46
+ @Suppress("DEPRECATION")
47
+ val ssid = wifiInfo.ssid
48
+ if (ssid == null || ssid == "<unknown ssid>") return null
49
+ return if (ssid.startsWith("\"") && ssid.endsWith("\"")) {
50
+ ssid.substring(1, ssid.length - 1)
51
+ } else {
52
+ ssid
53
+ }
54
+ }
55
+
56
+ // MARK: - getBSSID
57
+
58
+ override fun getBSSID(promise: Promise) {
59
+ Thread {
60
+ try {
61
+ val context = reactApplicationContext
62
+ val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager
63
+ @Suppress("DEPRECATION")
64
+ val bssid = wifiManager?.connectionInfo?.bssid
65
+ promise.resolve(bssid)
66
+ } catch (e: Exception) {
67
+ promise.resolve(null)
68
+ }
69
+ }.start()
70
+ }
71
+
72
+ // MARK: - getBroadcast
73
+
74
+ override fun getBroadcast(promise: Promise) {
75
+ Thread {
76
+ try {
77
+ var broadcast: String? = null
78
+ val interfaces = NetworkInterface.getNetworkInterfaces()
79
+ while (interfaces.hasMoreElements()) {
80
+ val iface = interfaces.nextElement()
81
+ if (iface.name == "wlan0" || iface.name == "eth0") {
82
+ for (ia in iface.interfaceAddresses) {
83
+ val broadcastAddr = ia.broadcast
84
+ if (broadcastAddr != null) {
85
+ broadcast = broadcastAddr.hostAddress
86
+ break
87
+ }
88
+ }
89
+ }
90
+ if (broadcast != null) break
91
+ }
92
+ promise.resolve(broadcast)
93
+ } catch (e: Exception) {
94
+ promise.resolve(null)
95
+ }
96
+ }.start()
97
+ }
98
+
99
+ // MARK: - getIPAddress
100
+
101
+ override fun getIPAddress(promise: Promise) {
102
+ Thread {
103
+ try {
104
+ val address = getIPv4Address()
105
+ promise.resolve(address ?: "")
106
+ } catch (e: Exception) {
107
+ promise.resolve("")
108
+ }
109
+ }.start()
110
+ }
111
+
112
+ // MARK: - getIPV6Address
113
+
114
+ override fun getIPV6Address(promise: Promise) {
115
+ Thread {
116
+ try {
117
+ var address: String? = null
118
+ val interfaces = NetworkInterface.getNetworkInterfaces()
119
+ loop@ while (interfaces.hasMoreElements()) {
120
+ val iface = interfaces.nextElement()
121
+ if (!iface.isUp || iface.isLoopback) continue
122
+ val addrs = iface.inetAddresses
123
+ while (addrs.hasMoreElements()) {
124
+ val addr = addrs.nextElement()
125
+ if (addr is Inet6Address && !addr.isLoopbackAddress && !addr.isLinkLocalAddress) {
126
+ address = addr.hostAddress
127
+ break@loop
128
+ }
129
+ }
130
+ }
131
+ promise.resolve(address ?: "")
132
+ } catch (e: Exception) {
133
+ promise.resolve("")
134
+ }
135
+ }.start()
136
+ }
137
+
138
+ // MARK: - getGatewayIPAddress
139
+
140
+ override fun getGatewayIPAddress(promise: Promise) {
141
+ Thread {
142
+ try {
143
+ val context = reactApplicationContext
144
+ val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager
145
+ @Suppress("DEPRECATION")
146
+ val dhcpInfo = wifiManager?.dhcpInfo
147
+ val gateway = if (dhcpInfo != null && dhcpInfo.gateway != 0) {
148
+ formatIpAddress(dhcpInfo.gateway)
149
+ } else {
150
+ null
151
+ }
152
+ promise.resolve(gateway ?: "")
153
+ } catch (e: Exception) {
154
+ promise.resolve("")
155
+ }
156
+ }.start()
157
+ }
158
+
159
+ // MARK: - getIPV4Address
160
+
161
+ override fun getIPV4Address(promise: Promise) {
162
+ Thread {
163
+ try {
164
+ val address = getIPv4Address()
165
+ promise.resolve(address ?: "0.0.0.0")
166
+ } catch (e: Exception) {
167
+ promise.resolve("0.0.0.0")
168
+ }
169
+ }.start()
170
+ }
171
+
172
+ // MARK: - getWIFIIPV4Address
173
+
174
+ override fun getWIFIIPV4Address(promise: Promise) {
175
+ Thread {
176
+ try {
177
+ var address: String? = null
178
+ val interfaces = NetworkInterface.getNetworkInterfaces()
179
+ loop@ while (interfaces.hasMoreElements()) {
180
+ val iface = interfaces.nextElement()
181
+ if (iface.name == "wlan0") {
182
+ val addrs = iface.inetAddresses
183
+ while (addrs.hasMoreElements()) {
184
+ val addr = addrs.nextElement()
185
+ if (addr is Inet4Address && !addr.isLoopbackAddress) {
186
+ address = addr.hostAddress
187
+ break@loop
188
+ }
189
+ }
190
+ }
191
+ }
192
+ promise.resolve(address ?: "0.0.0.0")
193
+ } catch (e: Exception) {
194
+ promise.resolve("0.0.0.0")
195
+ }
196
+ }.start()
197
+ }
198
+
199
+ // MARK: - getSubnet
200
+
201
+ override fun getSubnet(promise: Promise) {
202
+ Thread {
203
+ try {
204
+ var subnet: String? = null
205
+ val interfaces = NetworkInterface.getNetworkInterfaces()
206
+ loop@ while (interfaces.hasMoreElements()) {
207
+ val iface = interfaces.nextElement()
208
+ if (!iface.isUp || iface.isLoopback) continue
209
+ for (ia in iface.interfaceAddresses) {
210
+ val addr = ia.address
211
+ if (addr is Inet4Address && !addr.isLoopbackAddress) {
212
+ val prefixLen = ia.networkPrefixLength.toInt()
213
+ val mask = prefixLengthToSubnetMask(prefixLen)
214
+ subnet = mask
215
+ break@loop
216
+ }
217
+ }
218
+ }
219
+ promise.resolve(subnet ?: "0.0.0.0")
220
+ } catch (e: Exception) {
221
+ promise.resolve("0.0.0.0")
222
+ }
223
+ }.start()
224
+ }
225
+
226
+ // MARK: - Helpers
227
+
228
+ private fun getIPv4Address(): String? {
229
+ val interfaces = NetworkInterface.getNetworkInterfaces()
230
+ while (interfaces.hasMoreElements()) {
231
+ val iface = interfaces.nextElement()
232
+ if (!iface.isUp || iface.isLoopback) continue
233
+ val addrs = iface.inetAddresses
234
+ while (addrs.hasMoreElements()) {
235
+ val addr = addrs.nextElement()
236
+ if (addr is Inet4Address && !addr.isLoopbackAddress) {
237
+ return addr.hostAddress
238
+ }
239
+ }
240
+ }
241
+ return null
242
+ }
243
+
244
+ @Suppress("DEPRECATION")
245
+ private fun formatIpAddress(ip: Int): String {
246
+ return String.format(
247
+ "%d.%d.%d.%d",
248
+ ip and 0xff,
249
+ ip shr 8 and 0xff,
250
+ ip shr 16 and 0xff,
251
+ ip shr 24 and 0xff
252
+ )
253
+ }
254
+
255
+ private fun prefixLengthToSubnetMask(prefixLength: Int): String {
256
+ val mask = if (prefixLength == 0) 0 else (-1 shl (32 - prefixLength))
257
+ return String.format(
258
+ "%d.%d.%d.%d",
259
+ mask shr 24 and 0xff,
260
+ mask shr 16 and 0xff,
261
+ mask shr 8 and 0xff,
262
+ mask and 0xff
263
+ )
264
+ }
265
+ }
@@ -0,0 +1,33 @@
1
+ package com.rnnetworkinfo
2
+
3
+ import com.facebook.react.BaseReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.model.ReactModuleInfo
7
+ import com.facebook.react.module.model.ReactModuleInfoProvider
8
+ import java.util.HashMap
9
+
10
+ class NetworkInfoPackage : BaseReactPackage() {
11
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
12
+ return if (name == NetworkInfoModule.NAME) {
13
+ NetworkInfoModule(reactContext)
14
+ } else {
15
+ null
16
+ }
17
+ }
18
+
19
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
20
+ return ReactModuleInfoProvider {
21
+ val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
22
+ moduleInfos[NetworkInfoModule.NAME] = ReactModuleInfo(
23
+ NetworkInfoModule.NAME,
24
+ NetworkInfoModule.NAME,
25
+ false, // canOverrideExistingModule
26
+ false, // needsEagerInit
27
+ false, // isCxxModule
28
+ true // isTurboModule
29
+ )
30
+ moduleInfos
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,24 @@
1
+ #import <RNNetworkInfoSpec/RNNetworkInfoSpec.h>
2
+
3
+ @interface NetworkInfo : NativeRNNetworkInfoSpecBase <NativeRNNetworkInfoSpec>
4
+
5
+ - (void)getSSID:(RCTPromiseResolveBlock)resolve
6
+ reject:(RCTPromiseRejectBlock)reject;
7
+ - (void)getBSSID:(RCTPromiseResolveBlock)resolve
8
+ reject:(RCTPromiseRejectBlock)reject;
9
+ - (void)getBroadcast:(RCTPromiseResolveBlock)resolve
10
+ reject:(RCTPromiseRejectBlock)reject;
11
+ - (void)getIPAddress:(RCTPromiseResolveBlock)resolve
12
+ reject:(RCTPromiseRejectBlock)reject;
13
+ - (void)getIPV6Address:(RCTPromiseResolveBlock)resolve
14
+ reject:(RCTPromiseRejectBlock)reject;
15
+ - (void)getGatewayIPAddress:(RCTPromiseResolveBlock)resolve
16
+ reject:(RCTPromiseRejectBlock)reject;
17
+ - (void)getIPV4Address:(RCTPromiseResolveBlock)resolve
18
+ reject:(RCTPromiseRejectBlock)reject;
19
+ - (void)getWIFIIPV4Address:(RCTPromiseResolveBlock)resolve
20
+ reject:(RCTPromiseRejectBlock)reject;
21
+ - (void)getSubnet:(RCTPromiseResolveBlock)resolve
22
+ reject:(RCTPromiseRejectBlock)reject;
23
+
24
+ @end
@@ -0,0 +1,347 @@
1
+ #import "NetworkInfo.h"
2
+ #import "getgateway.h"
3
+
4
+ #import <ifaddrs.h>
5
+ #import <arpa/inet.h>
6
+ #include <net/if.h>
7
+ #include <sys/types.h>
8
+ #include <netinet/in.h>
9
+ #include <TargetConditionals.h>
10
+ #import <NetworkExtension/NetworkExtension.h>
11
+
12
+ #define IOS_CELLULAR @"pdp_ip0"
13
+ #define IOS_WIFI @"en0"
14
+ #define IP_ADDR_IPv4 @"ipv4"
15
+ #define IP_ADDR_IPv6 @"ipv6"
16
+
17
+ @import SystemConfiguration.CaptiveNetwork;
18
+
19
+ @implementation NetworkInfo
20
+
21
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
22
+ (const facebook::react::ObjCTurboModule::InitParams &)params
23
+ {
24
+ return std::make_shared<facebook::react::NativeRNNetworkInfoSpecJSI>(params);
25
+ }
26
+
27
+ + (NSString *)moduleName
28
+ {
29
+ return @"RNNetworkInfo";
30
+ }
31
+
32
+ + (BOOL)requiresMainQueueSetup
33
+ {
34
+ return NO;
35
+ }
36
+
37
+ // MARK: - getSSID
38
+
39
+ - (void)getSSID:(RCTPromiseResolveBlock)resolve
40
+ reject:(RCTPromiseRejectBlock)reject
41
+ {
42
+ #if TARGET_OS_IOS
43
+ if (@available(iOS 14.0, *)) {
44
+ [NEHotspotNetwork fetchCurrentWithCompletionHandler:^(NEHotspotNetwork * _Nullable currentNetwork) {
45
+ resolve(currentNetwork.SSID);
46
+ }];
47
+ return;
48
+ }
49
+
50
+ @try {
51
+ NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
52
+ NSDictionary *SSIDInfo;
53
+ NSString *SSID = nil;
54
+
55
+ for (NSString *interfaceName in interfaceNames) {
56
+ SSIDInfo = CFBridgingRelease(CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName));
57
+ if (SSIDInfo.count > 0) {
58
+ SSID = SSIDInfo[@"SSID"];
59
+ break;
60
+ }
61
+ }
62
+ resolve(SSID);
63
+ } @catch (NSException *exception) {
64
+ resolve(nil);
65
+ }
66
+ #else
67
+ resolve(nil);
68
+ #endif
69
+ }
70
+
71
+ // MARK: - getBSSID
72
+
73
+ - (void)getBSSID:(RCTPromiseResolveBlock)resolve
74
+ reject:(RCTPromiseRejectBlock)reject
75
+ {
76
+ #if TARGET_OS_IOS
77
+ if (@available(iOS 14.0, *)) {
78
+ [NEHotspotNetwork fetchCurrentWithCompletionHandler:^(NEHotspotNetwork * _Nullable currentNetwork) {
79
+ resolve(currentNetwork.BSSID);
80
+ }];
81
+ return;
82
+ }
83
+
84
+ @try {
85
+ NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
86
+ NSString *BSSID = nil;
87
+
88
+ for (NSString *interface in interfaceNames) {
89
+ CFDictionaryRef networkDetails = CNCopyCurrentNetworkInfo((CFStringRef)interface);
90
+ if (networkDetails) {
91
+ BSSID = (NSString *)CFDictionaryGetValue(networkDetails, kCNNetworkInfoKeyBSSID);
92
+ CFRelease(networkDetails);
93
+ }
94
+ }
95
+ resolve(BSSID);
96
+ } @catch (NSException *exception) {
97
+ resolve(nil);
98
+ }
99
+ #else
100
+ resolve(nil);
101
+ #endif
102
+ }
103
+
104
+ // MARK: - getBroadcast
105
+
106
+ - (void)getBroadcast:(RCTPromiseResolveBlock)resolve
107
+ reject:(RCTPromiseRejectBlock)reject
108
+ {
109
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
110
+ @try {
111
+ NSString *address = nil;
112
+
113
+ struct ifaddrs *interfaces = NULL;
114
+ struct ifaddrs *temp_addr = NULL;
115
+ int success = getifaddrs(&interfaces);
116
+
117
+ if (success == 0) {
118
+ temp_addr = interfaces;
119
+ while (temp_addr != NULL) {
120
+ if (temp_addr->ifa_addr->sa_family == AF_INET) {
121
+ if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
122
+ NSString *localAddr = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
123
+ NSString *netmask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)];
124
+
125
+ struct in_addr local_addr;
126
+ struct in_addr netmask_addr;
127
+ inet_aton([localAddr UTF8String], &local_addr);
128
+ inet_aton([netmask UTF8String], &netmask_addr);
129
+
130
+ local_addr.s_addr |= ~(netmask_addr.s_addr);
131
+ address = [NSString stringWithUTF8String:inet_ntoa(local_addr)];
132
+ }
133
+ }
134
+ temp_addr = temp_addr->ifa_next;
135
+ }
136
+ }
137
+ freeifaddrs(interfaces);
138
+ resolve(address);
139
+ } @catch (NSException *exception) {
140
+ resolve(nil);
141
+ }
142
+ });
143
+ }
144
+
145
+ // MARK: - getIPAddress
146
+
147
+ - (void)getIPAddress:(RCTPromiseResolveBlock)resolve
148
+ reject:(RCTPromiseRejectBlock)reject
149
+ {
150
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
151
+ @try {
152
+ NSString *address = nil;
153
+
154
+ struct ifaddrs *interfaces = NULL;
155
+ struct ifaddrs *temp_addr = NULL;
156
+ int success = getifaddrs(&interfaces);
157
+
158
+ if (success == 0) {
159
+ temp_addr = interfaces;
160
+ while (temp_addr != NULL) {
161
+ if (temp_addr->ifa_addr->sa_family == AF_INET) {
162
+ if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
163
+ address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
164
+ }
165
+ }
166
+ temp_addr = temp_addr->ifa_next;
167
+ }
168
+ }
169
+ freeifaddrs(interfaces);
170
+ resolve(address ?: @"");
171
+ } @catch (NSException *exception) {
172
+ resolve(@"");
173
+ }
174
+ });
175
+ }
176
+
177
+ // MARK: - getIPV6Address
178
+
179
+ - (void)getIPV6Address:(RCTPromiseResolveBlock)resolve
180
+ reject:(RCTPromiseRejectBlock)reject
181
+ {
182
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
183
+ @try {
184
+ NSString *address = nil;
185
+
186
+ struct ifaddrs *interfaces = NULL;
187
+ struct ifaddrs *temp_addr = NULL;
188
+ int success = getifaddrs(&interfaces);
189
+
190
+ if (success == 0) {
191
+ temp_addr = interfaces;
192
+ while (temp_addr != NULL) {
193
+ if (temp_addr->ifa_addr->sa_family == AF_INET6) {
194
+ if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
195
+ char ipAddress[INET6_ADDRSTRLEN];
196
+ struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)temp_addr->ifa_addr;
197
+ if (inet_ntop(AF_INET6, &addr6->sin6_addr, ipAddress, INET6_ADDRSTRLEN)) {
198
+ address = [NSString stringWithUTF8String:ipAddress];
199
+ }
200
+ }
201
+ }
202
+ temp_addr = temp_addr->ifa_next;
203
+ }
204
+ }
205
+ freeifaddrs(interfaces);
206
+ resolve(address ?: @"");
207
+ } @catch (NSException *exception) {
208
+ resolve(@"");
209
+ }
210
+ });
211
+ }
212
+
213
+ // MARK: - getGatewayIPAddress
214
+
215
+ - (void)getGatewayIPAddress:(RCTPromiseResolveBlock)resolve
216
+ reject:(RCTPromiseRejectBlock)reject
217
+ {
218
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
219
+ @try {
220
+ NSString *ipString = nil;
221
+ struct in_addr gatewayaddr;
222
+ int r = getdefaultgateway(&(gatewayaddr.s_addr));
223
+ if (r >= 0) {
224
+ ipString = [NSString stringWithFormat:@"%s", inet_ntoa(gatewayaddr)];
225
+ }
226
+ resolve(ipString ?: @"");
227
+ } @catch (NSException *exception) {
228
+ resolve(@"");
229
+ }
230
+ });
231
+ }
232
+
233
+ // MARK: - getIPV4Address
234
+
235
+ - (void)getIPV4Address:(RCTPromiseResolveBlock)resolve
236
+ reject:(RCTPromiseRejectBlock)reject
237
+ {
238
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
239
+ @try {
240
+ NSArray *searchArray = @[IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv4];
241
+ NSDictionary *addresses = [self getAllIPAddresses];
242
+
243
+ __block NSString *address = nil;
244
+ [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) {
245
+ address = addresses[key];
246
+ if (address) *stop = YES;
247
+ }];
248
+ resolve(address ?: @"0.0.0.0");
249
+ } @catch (NSException *exception) {
250
+ resolve(@"0.0.0.0");
251
+ }
252
+ });
253
+ }
254
+
255
+ // MARK: - getWIFIIPV4Address
256
+
257
+ - (void)getWIFIIPV4Address:(RCTPromiseResolveBlock)resolve
258
+ reject:(RCTPromiseRejectBlock)reject
259
+ {
260
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
261
+ @try {
262
+ NSArray *searchArray = @[IOS_WIFI @"/" IP_ADDR_IPv4];
263
+ NSDictionary *addresses = [self getAllIPAddresses];
264
+
265
+ __block NSString *address = nil;
266
+ [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) {
267
+ address = addresses[key];
268
+ if (address) *stop = YES;
269
+ }];
270
+ resolve(address ?: @"0.0.0.0");
271
+ } @catch (NSException *exception) {
272
+ resolve(@"0.0.0.0");
273
+ }
274
+ });
275
+ }
276
+
277
+ // MARK: - getSubnet
278
+
279
+ - (void)getSubnet:(RCTPromiseResolveBlock)resolve
280
+ reject:(RCTPromiseRejectBlock)reject
281
+ {
282
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
283
+ @try {
284
+ NSString *netmask = nil;
285
+ struct ifaddrs *interfaces = NULL;
286
+ struct ifaddrs *temp_addr = NULL;
287
+
288
+ int success = getifaddrs(&interfaces);
289
+ if (success == 0) {
290
+ temp_addr = interfaces;
291
+ while (temp_addr != NULL) {
292
+ if (temp_addr->ifa_addr->sa_family == AF_INET) {
293
+ if ([@(temp_addr->ifa_name) isEqualToString:@"en0"]) {
294
+ netmask = @(inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr));
295
+ }
296
+ }
297
+ temp_addr = temp_addr->ifa_next;
298
+ }
299
+ }
300
+ freeifaddrs(interfaces);
301
+ resolve(netmask ?: @"0.0.0.0");
302
+ } @catch (NSException *exception) {
303
+ resolve(@"0.0.0.0");
304
+ }
305
+ });
306
+ }
307
+
308
+ // MARK: - getAllIPAddresses helper
309
+
310
+ - (NSDictionary *)getAllIPAddresses
311
+ {
312
+ NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
313
+
314
+ struct ifaddrs *interfaces;
315
+ if (!getifaddrs(&interfaces)) {
316
+ struct ifaddrs *interface;
317
+ for (interface = interfaces; interface; interface = interface->ifa_next) {
318
+ if (!(interface->ifa_flags & IFF_UP)) {
319
+ continue;
320
+ }
321
+ const struct sockaddr_in *addr = (const struct sockaddr_in *)interface->ifa_addr;
322
+ char addrBuf[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
323
+ if (addr && (addr->sin_family == AF_INET || addr->sin_family == AF_INET6)) {
324
+ NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
325
+ NSString *type = nil;
326
+ if (addr->sin_family == AF_INET) {
327
+ if (inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
328
+ type = IP_ADDR_IPv4;
329
+ }
330
+ } else {
331
+ const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)interface->ifa_addr;
332
+ if (inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
333
+ type = IP_ADDR_IPv6;
334
+ }
335
+ }
336
+ if (type) {
337
+ NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
338
+ addresses[key] = [NSString stringWithUTF8String:addrBuf];
339
+ }
340
+ }
341
+ }
342
+ freeifaddrs(interfaces);
343
+ }
344
+ return [addresses count] ? addresses : @{};
345
+ }
346
+
347
+ @end
@@ -0,0 +1,83 @@
1
+ //
2
+ // getgateway.c
3
+ //
4
+ // This is pulled directly from https://stackoverflow.com/a/29440193/1120802
5
+ //
6
+
7
+ #include <stdio.h>
8
+ #include <netinet/in.h>
9
+ #include <stdlib.h>
10
+ #include <sys/sysctl.h>
11
+ #include "getgateway.h"
12
+
13
+ #include "TargetConditionals.h"
14
+ #if TARGET_IPHONE_SIMULATOR
15
+ #include <net/route.h>
16
+ #define TypeEN "en1"
17
+ #else
18
+ #include <net/route.h>
19
+ #define TypeEN "en0"
20
+ #endif
21
+
22
+ #include <net/if.h>
23
+ #include <string.h>
24
+
25
+ #define CTL_NET 4 /* network, see socket.h */
26
+
27
+ #if defined(BSD) || defined(__APPLE__)
28
+
29
+ #define ROUNDUP(a) \
30
+ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
31
+
32
+ int getdefaultgateway(in_addr_t *addr)
33
+ {
34
+ int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET,
35
+ NET_RT_FLAGS, RTF_GATEWAY};
36
+ size_t l;
37
+ char *buf, *p;
38
+ struct rt_msghdr *rt;
39
+ struct sockaddr *sa;
40
+ struct sockaddr *sa_tab[RTAX_MAX];
41
+ int i;
42
+ int r = -1;
43
+ if (sysctl(mib, sizeof(mib) / sizeof(int), 0, &l, 0, 0) < 0) {
44
+ return -1;
45
+ }
46
+ if (l > 0) {
47
+ buf = malloc(l);
48
+ if (sysctl(mib, sizeof(mib) / sizeof(int), buf, &l, 0, 0) < 0) {
49
+ free(buf);
50
+ return -1;
51
+ }
52
+ for (p = buf; p < buf + l; p += rt->rtm_msglen) {
53
+ rt = (struct rt_msghdr *)p;
54
+ sa = (struct sockaddr *)(rt + 1);
55
+ for (i = 0; i < RTAX_MAX; i++) {
56
+ if (rt->rtm_addrs & (1 << i)) {
57
+ sa_tab[i] = sa;
58
+ sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len));
59
+ } else {
60
+ sa_tab[i] = NULL;
61
+ }
62
+ }
63
+
64
+ if (((rt->rtm_addrs & (RTA_DST | RTA_GATEWAY)) == (RTA_DST | RTA_GATEWAY))
65
+ && sa_tab[RTAX_DST]->sa_family == AF_INET
66
+ && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) {
67
+
68
+ if (((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) {
69
+ char ifName[128];
70
+ if_indextoname(rt->rtm_index, ifName);
71
+ if (strcmp(TypeEN, ifName) == 0) {
72
+ *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr;
73
+ r = 0;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ free(buf);
79
+ }
80
+ return r;
81
+ }
82
+
83
+ #endif
@@ -0,0 +1,15 @@
1
+ //
2
+ // getgateway.h
3
+ //
4
+ // This is pulled directly from https://stackoverflow.com/a/29440193/1120802
5
+ //
6
+
7
+ #ifndef getgateway_h
8
+ #define getgateway_h
9
+
10
+ #include <stdio.h>
11
+ #include <netinet/in.h>
12
+
13
+ int getdefaultgateway(in_addr_t *addr);
14
+
15
+ #endif /* getgateway_h */
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+ export default TurboModuleRegistry.getEnforcing('RNNetworkInfo');
5
+ //# sourceMappingURL=NativeNetworkInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeNetworkInfo.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAAQ,cAAc;AAelD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,eAAe,CAAC","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ import NativeNetworkInfo from "./NativeNetworkInfo.js";
4
+ export const NetworkInfo = NativeNetworkInfo;
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeNetworkInfo","NetworkInfo"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,iBAAiB,MAAM,wBAAqB;AAEnD,OAAO,MAAMC,WAAW,GAAGD,iBAAiB","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,15 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ getSSID(): Promise<string | null>;
4
+ getBSSID(): Promise<string | null>;
5
+ getBroadcast(): Promise<string | null>;
6
+ getIPAddress(): Promise<string>;
7
+ getIPV6Address(): Promise<string>;
8
+ getGatewayIPAddress(): Promise<string>;
9
+ getIPV4Address(): Promise<string>;
10
+ getWIFIIPV4Address(): Promise<string>;
11
+ getSubnet(): Promise<string>;
12
+ }
13
+ declare const _default: Spec;
14
+ export default _default;
15
+ //# sourceMappingURL=NativeNetworkInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeNetworkInfo.d.ts","sourceRoot":"","sources":["../../../src/NativeNetworkInfo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B;;AAED,wBAAuE"}
@@ -0,0 +1,3 @@
1
+ export declare const NetworkInfo: import("./NativeNetworkInfo").Spec;
2
+ export type { Spec as NetworkInfoSpec } from './NativeNetworkInfo';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,oCAAoB,CAAC;AAC7C,YAAY,EAAE,IAAI,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,162 @@
1
+ {
2
+ "name": "@onekeyfe/react-native-network-info",
3
+ "version": "1.1.55",
4
+ "description": "react-native-network-info",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.tsx",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "lib",
18
+ "android",
19
+ "ios",
20
+ "*.podspec",
21
+ "!ios/build",
22
+ "!android/build",
23
+ "!android/gradle",
24
+ "!android/gradlew",
25
+ "!android/gradlew.bat",
26
+ "!android/local.properties",
27
+ "!**/__tests__",
28
+ "!**/__fixtures__",
29
+ "!**/__mocks__",
30
+ "!**/.*"
31
+ ],
32
+ "scripts": {
33
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
34
+ "prepare": "bob build",
35
+ "typecheck": "tsc",
36
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
37
+ "test": "jest",
38
+ "release": "yarn prepare && npm whoami && npm publish --access public"
39
+ },
40
+ "keywords": [
41
+ "react-native",
42
+ "ios",
43
+ "android"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/OneKeyHQ/app-modules/react-native-network-info.git"
48
+ },
49
+ "author": "@onekeyhq <huanming@onekey.so> (https://github.com/OneKeyHQ/app-modules)",
50
+ "license": "MIT",
51
+ "bugs": {
52
+ "url": "https://github.com/OneKeyHQ/app-modules/react-native-network-info/issues"
53
+ },
54
+ "homepage": "https://github.com/OneKeyHQ/app-modules/react-native-network-info#readme",
55
+ "publishConfig": {
56
+ "registry": "https://registry.npmjs.org/"
57
+ },
58
+ "devDependencies": {
59
+ "@commitlint/config-conventional": "^19.8.1",
60
+ "@eslint/compat": "^1.3.2",
61
+ "@eslint/eslintrc": "^3.3.1",
62
+ "@eslint/js": "^9.35.0",
63
+ "@react-native/babel-preset": "0.83.0",
64
+ "@react-native/eslint-config": "0.83.0",
65
+ "@release-it/conventional-changelog": "^10.0.1",
66
+ "@types/jest": "^29.5.14",
67
+ "@types/react": "^19.2.0",
68
+ "commitlint": "^19.8.1",
69
+ "del-cli": "^6.0.0",
70
+ "eslint": "^9.35.0",
71
+ "eslint-config-prettier": "^10.1.8",
72
+ "eslint-plugin-prettier": "^5.5.4",
73
+ "jest": "^29.7.0",
74
+ "lefthook": "^2.0.3",
75
+ "prettier": "^2.8.8",
76
+ "react": "19.2.0",
77
+ "react-native": "patch:react-native@npm%3A0.83.0#~/.yarn/patches/react-native-npm-0.83.0-577d0f2d83.patch",
78
+ "react-native-builder-bob": "^0.40.17",
79
+ "release-it": "^19.0.4",
80
+ "turbo": "^2.5.6",
81
+ "typescript": "^5.9.2"
82
+ },
83
+ "peerDependencies": {
84
+ "react": "*",
85
+ "react-native": "*"
86
+ },
87
+ "react-native-builder-bob": {
88
+ "source": "src",
89
+ "output": "lib",
90
+ "targets": [
91
+ [
92
+ "module",
93
+ {
94
+ "esm": true
95
+ }
96
+ ],
97
+ [
98
+ "typescript",
99
+ {
100
+ "project": "tsconfig.build.json"
101
+ }
102
+ ]
103
+ ]
104
+ },
105
+ "codegenConfig": {
106
+ "name": "RNNetworkInfoSpec",
107
+ "type": "modules",
108
+ "jsSrcsDir": "src",
109
+ "android": {
110
+ "javaPackageName": "com.rnnetworkinfo"
111
+ }
112
+ },
113
+ "prettier": {
114
+ "quoteProps": "consistent",
115
+ "singleQuote": true,
116
+ "tabWidth": 2,
117
+ "trailingComma": "es5",
118
+ "useTabs": false
119
+ },
120
+ "jest": {
121
+ "preset": "react-native",
122
+ "modulePathIgnorePatterns": [
123
+ "<rootDir>/example/node_modules",
124
+ "<rootDir>/lib/"
125
+ ]
126
+ },
127
+ "commitlint": {
128
+ "extends": [
129
+ "@commitlint/config-conventional"
130
+ ]
131
+ },
132
+ "release-it": {
133
+ "git": {
134
+ "commitMessage": "chore: release ${version}",
135
+ "tagName": "v${version}"
136
+ },
137
+ "npm": {
138
+ "publish": true
139
+ },
140
+ "github": {
141
+ "release": true
142
+ },
143
+ "plugins": {
144
+ "@release-it/conventional-changelog": {
145
+ "preset": {
146
+ "name": "angular"
147
+ }
148
+ }
149
+ }
150
+ },
151
+ "create-react-native-library": {
152
+ "type": "turbo-module",
153
+ "languages": "kotlin-objc",
154
+ "tools": [
155
+ "eslint",
156
+ "jest",
157
+ "lefthook",
158
+ "release-it"
159
+ ],
160
+ "version": "0.56.0"
161
+ }
162
+ }
@@ -0,0 +1,16 @@
1
+ import { TurboModuleRegistry } from 'react-native';
2
+ import type { TurboModule } from 'react-native';
3
+
4
+ export interface Spec extends TurboModule {
5
+ getSSID(): Promise<string | null>;
6
+ getBSSID(): Promise<string | null>;
7
+ getBroadcast(): Promise<string | null>;
8
+ getIPAddress(): Promise<string>;
9
+ getIPV6Address(): Promise<string>;
10
+ getGatewayIPAddress(): Promise<string>;
11
+ getIPV4Address(): Promise<string>;
12
+ getWIFIIPV4Address(): Promise<string>;
13
+ getSubnet(): Promise<string>;
14
+ }
15
+
16
+ export default TurboModuleRegistry.getEnforcing<Spec>('RNNetworkInfo');
package/src/index.tsx ADDED
@@ -0,0 +1,4 @@
1
+ import NativeNetworkInfo from './NativeNetworkInfo';
2
+
3
+ export const NetworkInfo = NativeNetworkInfo;
4
+ export type { Spec as NetworkInfoSpec } from './NativeNetworkInfo';