-
-
Save zmnv/1af9628f0563c74cd644d82f11a58d8c 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() | |
) | |
const wifiSettingsURL = IOSWifiManager.settingsURL |
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); | |
} | |
- (NSDictionary*)constantsToExport { | |
// Officially better to use UIApplicationOpenSettingsURLString | |
return @{ | |
@"settingsURL": @"App-Prefs:root=WIFI" | |
}; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment