uni-app 自定义ios插件获取WiFi ssid并且云打包时ssid为空
uni-app 自定义ios插件获取WiFi ssid并且云打包时ssid为空
操作步骤:
- 请看我的bug描述
预期结果:
- 请看我的bug描述
实际结果:
- 请看我的bug描述
bug描述:
我自己写了一个获取iOS手机WiFi ssid的插件,我的证书已经包含了access Wi-Fi information,并且APP已经申请了定位权限,使用的云端打包,但是ssid为空;然后我无意间将官方插件uni-wifi导入工程,并且调用了uni.getConnectedWifi(OBJECT),然后我的插件就正常返回ssid了(uni.getConnectedWifi接口没有成功,失败了);然后我将uni-wifi从工程里去掉,我的插件又不能返回ssid了。请问这是怎么回事呢?
信息类别 | 信息内容 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | win10 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.15 |
手机系统 | iOS |
手机系统版本号 | iOS 16 |
手机厂商 | 苹果 |
手机机型 | iPhoneX |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
1 回复
在处理uni-app自定义iOS插件以获取WiFi SSID时,确保在云打包环境中SSID不为空的问题,关键在于理解iOS系统的权限管理和插件的实现细节。由于iOS对获取WiFi网络信息的权限限制非常严格,特别是在iOS 13及以后版本,获取SSID需要在设备已连接到该WiFi网络并且应用具有相应的位置权限。
以下是一个简化的uni-app自定义iOS插件示例,用于尝试获取当前连接的WiFi SSID。请注意,此代码仅用于演示目的,并可能需要根据实际开发环境和iOS版本进行调整。
iOS插件代码(Objective-C)
首先,创建一个新的Objective-C类作为插件的主要实现。
// MyWiFiPlugin.h
#import <Foundation/Foundation.h>
@interface MyWiFiPlugin : NSObject
- (void)getSSID:(NSInvocation *)invocation;
@end
// MyWiFiPlugin.m
#import "MyWiFiPlugin.h"
#import <CoreLocation/CoreLocation.h>
#import <NetworkExtension/NetworkExtension.h>
@implementation MyWiFiPlugin
- (void)getSSID:(NSInvocation *)invocation {
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways) {
NSArray *interfaces = CNCopySupportedInterfaces();
for (NSString *interfaceName in interfaces) {
NSDictionary *info = CNCopyCurrentNetworkInfo(interfaceName);
NSString *ssid = info[@"SSID"];
[invocation setReturnValue:&ssid];
return;
}
} else {
NSError *error = [NSError errorWithDomain:@"MyWiFiPlugin" code:-1 userInfo:@{NSLocalizedDescriptionKey:@"Location services not authorized"}];
[invocation setReturnValue:nil];
[invocation setSelector:@selector(failedWithError:)];
[invocation setArgument:&error atIndex:2];
}
}
@end
uni-app调用插件
在uni-app项目中,通过plus.bridge.exec
方法调用自定义插件。
plus.bridge.exec('MyWiFiPlugin', 'getSSID', [], function(e) {
if (e && e.SSID) {
console.log('SSID:', e.SSID);
} else {
console.error('Failed to get SSID:', e);
}
});
注意事项
- 权限处理:确保在iOS项目中正确配置
Info.plist
以请求位置权限。 - iOS版本差异:不同iOS版本对获取SSID的限制可能不同,特别是iOS 13及以上版本。
- 云打包问题:云打包环境可能无法模拟设备的真实状态,如位置权限的授权状态,这可能导致SSID获取失败。在实际设备上进行测试是验证插件功能的关键。
由于iOS系统的严格限制,获取SSID的插件实现可能需要根据最新的iOS SDK和平台政策进行调整。