diff --git a/packages/network_info_plus/network_info_plus/CHANGELOG.md b/packages/network_info_plus/network_info_plus/CHANGELOG.md index 80622b95a9..9de2bdb2b4 100644 --- a/packages/network_info_plus/network_info_plus/CHANGELOG.md +++ b/packages/network_info_plus/network_info_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.0 + +- IOS: Use `NEHotspotNetwork` on iOS 14+ to get SSID/BSSID. + ## 1.2.1 - IOS: Fix issue failed to build on iOS emulator diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTCaptiveNetworkInfoProvider.h b/packages/network_info_plus/network_info_plus/ios/Classes/FLTCaptiveNetworkInfoProvider.h new file mode 100644 index 0000000000..fa46e4e1f2 --- /dev/null +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTCaptiveNetworkInfoProvider.h @@ -0,0 +1,5 @@ +#import +#import "FLTNetworkInfoProvider.h" + +@interface FLTCaptiveNetworkInfoProvider : NSObject +@end diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTCaptiveNetworkInfoProvider.m b/packages/network_info_plus/network_info_plus/ios/Classes/FLTCaptiveNetworkInfoProvider.m new file mode 100644 index 0000000000..485d668a25 --- /dev/null +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTCaptiveNetworkInfoProvider.m @@ -0,0 +1,23 @@ +#import "FLTCaptiveNetworkInfoProvider.h" +#import + +@implementation FLTCaptiveNetworkInfoProvider + +- (void)fetchNetworkInfoWithCompletionHandler:(void (^)(FLTNetworkInfo *network))completionHandler { + dispatch_async(dispatch_get_main_queue(), ^{ + NSArray *interfaceNames = (__bridge_transfer id)CNCopySupportedInterfaces(); + for (NSString *interfaceName in interfaceNames) { + NSDictionary *networkInfo = + (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName); + if (networkInfo) { + NSString *ssid = networkInfo[(NSString *)kCNNetworkInfoKeySSID]; + NSString *bssid = networkInfo[(NSString *)kCNNetworkInfoKeyBSSID]; + completionHandler([[FLTNetworkInfo alloc] initWithSSID:ssid BSSID:bssid]); + return; + } + } + completionHandler(nil); + }); +} + +@end diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTHotspotNetworkInfoProvider.h b/packages/network_info_plus/network_info_plus/ios/Classes/FLTHotspotNetworkInfoProvider.h new file mode 100644 index 0000000000..c23e67e344 --- /dev/null +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTHotspotNetworkInfoProvider.h @@ -0,0 +1,5 @@ +#import +#import "FLTNetworkInfoProvider.h" + +@interface FLTHotspotNetworkInfoProvider : NSObject +@end diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTHotspotNetworkInfoProvider.m b/packages/network_info_plus/network_info_plus/ios/Classes/FLTHotspotNetworkInfoProvider.m new file mode 100644 index 0000000000..495a072001 --- /dev/null +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTHotspotNetworkInfoProvider.m @@ -0,0 +1,19 @@ +#import "FLTHotspotNetworkInfoProvider.h" +#import + +@implementation FLTHotspotNetworkInfoProvider + +- (void)fetchNetworkInfoWithCompletionHandler:(void (^)(FLTNetworkInfo *network))completionHandler + API_AVAILABLE(ios(14)) { + [NEHotspotNetwork fetchCurrentWithCompletionHandler:^(NEHotspotNetwork *network) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (network) { + completionHandler([[FLTNetworkInfo alloc] initWithSSID:network.SSID BSSID:network.BSSID]); + return; + } + completionHandler(nil); + }); + }]; +} + +@end diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfo.h b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfo.h new file mode 100644 index 0000000000..7711fd00a8 --- /dev/null +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfo.h @@ -0,0 +1,10 @@ +#import + +@interface FLTNetworkInfo : NSObject + +@property(nonatomic, readonly) NSString *SSID; +@property(nonatomic, readonly) NSString *BSSID; + +- (instancetype)initWithSSID:(NSString *)SSID BSSID:(NSString *)BSSID; + +@end diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfo.m b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfo.m new file mode 100644 index 0000000000..995eeb8cb0 --- /dev/null +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfo.m @@ -0,0 +1,13 @@ +#import "FLTNetworkInfo.h" + +@implementation FLTNetworkInfo + +- (instancetype)initWithSSID:(NSString *)SSID BSSID:(NSString *)BSSID { + if ((self = [super init])) { + _SSID = [SSID copy]; + _BSSID = [BSSID copy]; + } + return self; +} + +@end diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfoPlusPlugin.m b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfoPlusPlugin.m index 46d4d88ee9..d8282f04ad 100644 --- a/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfoPlusPlugin.m +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfoPlusPlugin.m @@ -5,7 +5,11 @@ #import "FLTNetworkInfoPlusPlugin.h" #import +#import "FLTCaptiveNetworkInfoProvider.h" +#import "FLTHotspotNetworkInfoProvider.h" +#import "FLTNetworkInfo.h" #import "FLTNetworkInfoLocationPlusHandler.h" +#import "FLTNetworkInfoProvider.h" #import "SystemConfiguration/CaptiveNetwork.h" #import "getgateway.h" @@ -16,6 +20,9 @@ @interface FLTNetworkInfoPlusPlugin () @property(strong, nonatomic) FLTNetworkInfoLocationPlusHandler* locationHandler; +@property(strong, nonatomic) id networkInfoProvider; + +- (instancetype)initWithNetworkInfoProvider:(id)networkInfoProvider; @end @@ -23,7 +30,14 @@ @implementation FLTNetworkInfoPlusPlugin { } + (void)registerWithRegistrar:(NSObject*)registrar { - FLTNetworkInfoPlusPlugin* instance = [[FLTNetworkInfoPlusPlugin alloc] init]; + id networkInfoProvider; + if (@available(iOS 14, *)) { + networkInfoProvider = [[FLTHotspotNetworkInfoProvider alloc] init]; + } else { + networkInfoProvider = [[FLTCaptiveNetworkInfoProvider alloc] init]; + } + FLTNetworkInfoPlusPlugin* instance = + [[FLTNetworkInfoPlusPlugin alloc] initWithNetworkInfoProvider:networkInfoProvider]; FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"dev.fluttercommunity.plus/network_info" @@ -31,15 +45,14 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [registrar addMethodCallDelegate:instance channel:channel]; } -#pragma mark - Callbacks - -- (NSString*)getWifiName { - return [self findNetworkInfo:@"SSID"]; +- (instancetype)initWithNetworkInfoProvider:(id)networkInfoProvider { + if ((self = [super init])) { + self.networkInfoProvider = networkInfoProvider; + } + return self; } -- (NSString*)getBSSID { - return [self findNetworkInfo:@"BSSID"]; -} +#pragma mark - Callbacks - (NSString*)getGatewayIP { struct in_addr gatewayAddr; @@ -118,9 +131,13 @@ - (NSString*)convertCLAuthorizationStatusToString:(CLAuthorizationStatus)status - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { if ([call.method isEqualToString:@"wifiName"]) { - result([self getWifiName]); + [self.networkInfoProvider fetchNetworkInfoWithCompletionHandler:^(FLTNetworkInfo* networkInfo) { + result(networkInfo.SSID); + }]; } else if ([call.method isEqualToString:@"wifiBSSID"]) { - result([self getBSSID]); + [self.networkInfoProvider fetchNetworkInfoWithCompletionHandler:^(FLTNetworkInfo* networkInfo) { + result(networkInfo.BSSID); + }]; } else if ([call.method isEqualToString:@"wifiIPAddress"]) { result([self getWifiIP]); } else if ([call.method isEqualToString:@"wifiIPv6Address"]) { @@ -157,19 +174,6 @@ - (FLTNetworkInfoLocationPlusHandler*)locationHandler { #pragma mark - Utils -- (NSString*)findNetworkInfo:(NSString*)key { - NSString* info = nil; - NSArray* interfaceNames = (__bridge_transfer id)CNCopySupportedInterfaces(); - for (NSString* interfaceName in interfaceNames) { - NSDictionary* networkInfo = - (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName); - if (networkInfo[key]) { - info = networkInfo[key]; - } - } - return info; -} - - (struct ifaddrs*)getWifiInterfaceIPv4 { return [self getWifiInterface:AF_INET]; } diff --git a/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfoProvider.h b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfoProvider.h new file mode 100644 index 0000000000..1bdfcc18e5 --- /dev/null +++ b/packages/network_info_plus/network_info_plus/ios/Classes/FLTNetworkInfoProvider.h @@ -0,0 +1,9 @@ +#import +#import "FLTNetworkInfo.h" + +@protocol FLTNetworkInfoProvider + +- (void)fetchNetworkInfoWithCompletionHandler: + (void (^)(FLTNetworkInfo *networkInfo))completionHandler; + +@end diff --git a/packages/network_info_plus/network_info_plus/pubspec.yaml b/packages/network_info_plus/network_info_plus/pubspec.yaml index 0d57c2336a..33ddf0b9f3 100644 --- a/packages/network_info_plus/network_info_plus/pubspec.yaml +++ b/packages/network_info_plus/network_info_plus/pubspec.yaml @@ -1,6 +1,6 @@ name: network_info_plus description: Flutter plugin for discovering information (e.g. WiFi details) of the network. -version: 1.2.1 +version: 1.3.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/