uni-app 自定义ios插件获取WiFi ssid并且云打包时ssid为空

发布于 1周前 作者 eggper 来自 Uni-App

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);
    }
});

注意事项

  1. 权限处理:确保在iOS项目中正确配置Info.plist以请求位置权限。
  2. iOS版本差异:不同iOS版本对获取SSID的限制可能不同,特别是iOS 13及以上版本。
  3. 云打包问题:云打包环境可能无法模拟设备的真实状态,如位置权限的授权状态,这可能导致SSID获取失败。在实际设备上进行测试是验证插件功能的关键。

由于iOS系统的严格限制,获取SSID的插件实现可能需要根据最新的iOS SDK和平台政策进行调整。

回到顶部