-
-
Save douglasjunior/c2b43cee378b5d8ce6935d928ba6caaa to your computer and use it in GitHub Desktop.
Programatically join Wi-Fi network on iOS with React Native wrapper for NEHotspotConfiguration
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Platform, NativeModules } from 'react-native' | |
const IOSWifiManager = NativeModules.IOSWifiManager | |
const wifiConnect = (ssid) => ( | |
IOSWifiManager.connectToSSID(ssid) | |
) | |
const wifiConnectProtected = (ssid, password, isWep) => ( | |
IOSWifiManager.connectToProtectedSSID(ssid, password, isWep) | |
) | |
const wifiDisconnect = (ssid) => ( | |
IOSWifiManager.disconnectFromSSID(ssid) | |
) | |
const wifiCurrentSSID = () => ( | |
IOSWifiManager.currentSSID() | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Created by Rutger Bresjer on 10/10/2017 | |
// Notes: | |
// - Be sure to enable "Hotspot Configuration" capability for the iOS target | |
// - Make sure the NetworkExtension framework is linked to the target | |
#import <Foundation/Foundation.h> | |
#import <React/RCTBridgeModule.h> | |
@interface IOSWifiManager : NSObject <RCTBridgeModule> | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "IOSWifiManager.h" | |
#import <NetworkExtension/NetworkExtension.h> | |
#import <SystemConfiguration/CaptiveNetwork.h> | |
// If using official settings URL | |
//#import <UIKit/UIKit.h> | |
@implementation IOSWifiManager | |
RCT_EXPORT_MODULE(); | |
RCT_EXPORT_METHOD(connectToSSID:(NSString*)ssid | |
resolver:(RCTPromiseResolveBlock)resolve | |
rejecter:(RCTPromiseRejectBlock)reject) { | |
if (TARGET_IPHONE_SIMULATOR == 0) { | |
if (@available(iOS 11.0, *)) { | |
NEHotspotConfiguration* configuration = [[NEHotspotConfiguration alloc] initWithSSID:ssid]; | |
configuration.joinOnce = true; | |
[[NEHotspotConfigurationManager sharedManager] applyConfiguration:configuration completionHandler:^(NSError * _Nullable error) { | |
if (error != nil) { | |
reject(@"nehotspot_error", @"Error while configuring WiFi", error); | |
} else { | |
resolve(nil); | |
} | |
}]; | |
} else { | |
reject(@"ios_error", @"Not supported in iOS<11.0", nil); | |
} | |
} else { | |
reject(@"ios_error", @"Not supported on Simulator", nil); | |
} | |
} | |
RCT_EXPORT_METHOD(connectToProtectedSSID:(NSString*)ssid | |
withPassphrase:(NSString*)passphrase | |
isWEP:(BOOL)isWEP | |
resolver:(RCTPromiseResolveBlock)resolve | |
rejecter:(RCTPromiseRejectBlock)reject) { | |
if (TARGET_IPHONE_SIMULATOR == 0) { | |
if (@available(iOS 11.0, *)) { | |
NEHotspotConfiguration* configuration = [[NEHotspotConfiguration alloc] initWithSSID:ssid passphrase:passphrase isWEP:isWEP]; | |
configuration.joinOnce = true; | |
[[NEHotspotConfigurationManager sharedManager] applyConfiguration:configuration completionHandler:^(NSError * _Nullable error) { | |
if (error != nil) { | |
reject(@"nehotspot_error", @"Error while configuring WiFi", error); | |
} else { | |
resolve(nil); | |
} | |
}]; | |
} else { | |
reject(@"ios_error", @"Not supported in iOS<11.0", nil); | |
} | |
} else { | |
reject(@"ios_error", @"Not supported on Simulator", nil); | |
} | |
} | |
RCT_EXPORT_METHOD(disconnectFromSSID:(NSString*)ssid | |
resolver:(RCTPromiseResolveBlock)resolve | |
rejecter:(RCTPromiseRejectBlock)reject) { | |
if (@available(iOS 11.0, *)) { | |
[[NEHotspotConfigurationManager sharedManager] getConfiguredSSIDsWithCompletionHandler:^(NSArray<NSString *> *ssids) { | |
if (ssids != nil && [ssids indexOfObject:ssid] != NSNotFound) { | |
[[NEHotspotConfigurationManager sharedManager] removeConfigurationForSSID:ssid]; | |
} | |
resolve(nil); | |
}]; | |
} else { | |
reject(@"ios_error", @"Not supported in iOS<11.0", nil); | |
} | |
} | |
RCT_REMAP_METHOD(currentSSID, | |
resolver:(RCTPromiseResolveBlock)resolve | |
rejecter:(RCTPromiseRejectBlock)reject) { | |
NSString *kSSID = (NSString*) kCNNetworkInfoKeySSID; | |
NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces(); | |
for (NSString *ifnam in ifs) { | |
NSDictionary *info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam); | |
if (info[kSSID]) { | |
resolve(info[kSSID]); | |
return; | |
} | |
} | |
reject(@"cannot_detect_ssid", @"Cannot detect SSID", nil); | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
did u already get the solution?