Skip to content

Instantly share code, notes, and snippets.

@zmnv
Forked from douglasjunior/IOSWifiManager.h
Created March 26, 2020 14:11
Show Gist options
  • Save zmnv/1af9628f0563c74cd644d82f11a58d8c to your computer and use it in GitHub Desktop.
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
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
// 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
#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