From 6cb7a16a66f1fef47fe6164679fba0a2acb7fd74 Mon Sep 17 00:00:00 2001 From: m0_75226990 Date: Mon, 28 Nov 2022 19:49:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0iOS=20uni-wifi?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84getConnectedWifi=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=85=B6=E4=BD=99=E6=8E=A5=E5=8F=A3=E7=A9=BA=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hbuilderx/launcher/hx_iOS_resign.json | 1 + .../uni-wifi/utssdk/app-ios/Info.plist | 8 + .../uni-wifi/utssdk/app-ios/UTS.entitlements | 8 + .../uni-wifi/utssdk/app-ios/config.json | 9 + uni_modules/uni-wifi/utssdk/app-ios/index.uts | 324 ++++++++++++++++++ 5 files changed, 350 insertions(+) create mode 100644 .hbuilderx/launcher/hx_iOS_resign.json create mode 100644 uni_modules/uni-wifi/utssdk/app-ios/Info.plist create mode 100644 uni_modules/uni-wifi/utssdk/app-ios/UTS.entitlements create mode 100644 uni_modules/uni-wifi/utssdk/app-ios/config.json diff --git a/.hbuilderx/launcher/hx_iOS_resign.json b/.hbuilderx/launcher/hx_iOS_resign.json new file mode 100644 index 0000000..c011290 --- /dev/null +++ b/.hbuilderx/launcher/hx_iOS_resign.json @@ -0,0 +1 @@ +{"index":1} \ No newline at end of file diff --git a/uni_modules/uni-wifi/utssdk/app-ios/Info.plist b/uni_modules/uni-wifi/utssdk/app-ios/Info.plist new file mode 100644 index 0000000..001d3ce --- /dev/null +++ b/uni_modules/uni-wifi/utssdk/app-ios/Info.plist @@ -0,0 +1,8 @@ + + + + + NSLocationWhenInUseUsageDescription + 使用期间获取位置权限 + + \ No newline at end of file diff --git a/uni_modules/uni-wifi/utssdk/app-ios/UTS.entitlements b/uni_modules/uni-wifi/utssdk/app-ios/UTS.entitlements new file mode 100644 index 0000000..240b91f --- /dev/null +++ b/uni_modules/uni-wifi/utssdk/app-ios/UTS.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.developer.networking.wifi-info + + + \ No newline at end of file diff --git a/uni_modules/uni-wifi/utssdk/app-ios/config.json b/uni_modules/uni-wifi/utssdk/app-ios/config.json new file mode 100644 index 0000000..bc3370d --- /dev/null +++ b/uni_modules/uni-wifi/utssdk/app-ios/config.json @@ -0,0 +1,9 @@ +{ + "frameworks": [ + "CoreLocation", + "SystemConfiguration" + ], + "deploymentTarget": "9.0", + "validArchitectures": [ + "arm64", "armv7" ] +} \ No newline at end of file diff --git a/uni_modules/uni-wifi/utssdk/app-ios/index.uts b/uni_modules/uni-wifi/utssdk/app-ios/index.uts index e69de29..340cbc4 100644 --- a/uni_modules/uni-wifi/utssdk/app-ios/index.uts +++ b/uni_modules/uni-wifi/utssdk/app-ios/index.uts @@ -0,0 +1,324 @@ +import { CLLocationManager, CLAuthorizationStatus, CLLocationManagerDelegate } from 'CoreLocation' +import { CaptiveNetwork, kCNNetworkInfoKeySSID, kCNNetworkInfoKeyBSSID } from 'SystemConfiguration.CaptiveNetwork'; +import { JSONEncoder, NSArray, NSDictionary } from 'Foundation'; +import { CFString } from 'CoreFoundation'; +import { UIDevice } from 'UIKit'; + +/** + * Wifi 函数通用入参封装 + */ +type WifiOption = { + success?: (res: object) => void; + fail?: (res: object) => void; + complete?: (res: object) => void; +}; + +/** + * Wifi 链接参数封装 + */ +type WifiConnectOption = { + SSID: string; + BSSID: string; + password: string; + maunal: boolean; + partialInfo: boolean; //ios不生效 + success?: (res: object) => void; + fail?: (res: object) => void; + complete?: (res: object) => void; +} + +/** + * 获取当前链接的wifi信息 + */ +type GetConnectedWifiOptions = { + partialInfo?: boolean + success?: (res: UTSJSONObject) => void + fail?: (res: UTSJSONObject) => void + complete?: (res: UTSJSONObject) => void +} + +type GetLocationPromiseOptions = { + complete?: (res: boolean) => void +} + +type UniWifiInfo = { + SSID: string; + BSSID: string; + secure: boolean; + signalStrength: number; + frequency: number; +} + + +/* + * 对外暴露的wifi信息类 + */ +// class UniWifiInfo { + +// SSID: string; +// BSSID: string; +// secure: boolean; +// signalStrength: number; +// frequency: number; + +// constructor(SSID: string, BSSID: string, secure: boolean, signalStrength: number, frequency: number) { +// this.SSID = SSID +// this.BSSID = BSSID +// this.secure = secure +// this.signalStrength = signalStrength +// this.frequency = frequency +// } +// } + + +class LocationPromiseService implements CLLocationManagerDelegate { + static promiseCompletionHandler: ((res: boolean)=>void)[] = [] + + manager?: CLLocationManager + + constructor(manager?: CLLocationManager) { + this.manager = manager + } + + initlizeManager(): boolean { + if (this.manager == null) { + this.manager = new CLLocationManager() + this.manager!.delegate = this + } + return true + } + + locationManager(manager: CLLocationManager, status: CLAuthorizationStatus) { + if (status == CLAuthorizationStatus.authorizedAlways || status == CLAuthorizationStatus.authorizedWhenInUse) { + LocationPromiseService.promiseCompletionHandler.forEach((handler): void => { + handler(true) + }) + } else if (status == CLAuthorizationStatus.notDetermined) { + manager.requestWhenInUseAuthorization() + } else if (status == CLAuthorizationStatus.denied) { + LocationPromiseService.promiseCompletionHandler.forEach((handler): void => { + handler(false) + }) + } + } + + locationManagerDidChangeAuthorization(manager: CLLocationManager) { + + } + + locationManagerDidPauseLocationUpdates(manager: CLLocationManager) { + + } + + locationManagerDidResumeLocationUpdates(manager: CLLocationManager) { + + } + + locationManagerShouldDisplayHeadingCalibration(manager: CLLocationManager): boolean { + return true + } + + requestPromise(@escaping completion: (res: boolean)=>void) { + let status: CLAuthorizationStatus = CLLocationManager.authorizationStatus() + if (status == CLAuthorizationStatus.notDetermined) { + if (this.initlizeManager() == true) { + this.manager!.requestWhenInUseAuthorization() + LocationPromiseService.promiseCompletionHandler.push(completion) + } + } else if (status == CLAuthorizationStatus.authorizedAlways || status == CLAuthorizationStatus.authorizedWhenInUse) { + completion(true) + } else if (status == CLAuthorizationStatus.denied) { + if (CLLocationManager.locationServicesEnabled() == false && this.initlizeManager() == true) { + this.manager!.requestWhenInUseAuthorization() + LocationPromiseService.promiseCompletionHandler.push(completion) + } + } + } +} + +const locationPromiseService: LocationPromiseService = new LocationPromiseService(null) + +/* + * 获取系统定位权限 + */ +function requestLocationPromise(@escaping completion: (res: boolean)=>void) { + locationPromiseService.requestPromise(completion) +} + +/* + * 获取当前连接的wifi信息(通过定位权限) + */ +function fetchConnectedWifiWithLocationPromise(option: GetConnectedWifiOptions) { + let arr = CNCopySupportedInterfaces() + let wifiInfo = new UniWifiInfo() + if (arr != null) { + let list = arr! as NSArray + let index = 0 + while (index < list.count) { + let item = list[index] + let interfaceName = item as string + let dic = CNCopyCurrentNetworkInfo(interfaceName as CFString) + if (dic != null) { + let dict = dic! as NSDictionary + let SSID = dict[kCNNetworkInfoKeySSID as string] + let BSSID = dict[kCNNetworkInfoKeyBSSID as string] + + if (SSID != null && BSSID != null) { + let ssid = SSID! as string + let bssid = BSSID! as string + wifiInfo.SSID = ssid + wifiInfo.BSSID = bssid + wifiInfo.signalStrength = 0 + wifiInfo.frequency = 0 + break; + } + } + index++ + } + + if (wifiInfo.BSSID.length > 0 && wifiInfo.SSID.length > 0) { + let res = { + errCode: 0, + errMsg: "getConnectedWifi:success", + wifi: wifiInfo, + } + option.success?.(res) + option.complete?.(res) + }else { + option.fail?.({errCode: 12000, errMsg: "current wifi is null"}) + option.complete?.({errCode: 12000, errMsg: "current wifi is null"}) + } + }else { + option.fail?.({errCode: 12000, errMsg: "current wifi is null"}) + option.complete?.({errCode: 12000, errMsg: "current wifi is null"}) + } +} + + + + + +/* =================================== 对外暴露的接口 ==============================================*/ + + + +/* + * 初始化wifi模块 + */ +export function startWifi(option: WifiOption) { + let res = { + errCode: 12001, + errMsg: "system not support" + } + option.fail?.(res) + option.complete?.(res) +} + +/* + * 停止wifi模块 + */ +export function stopWifi() { + LocationPromiseService.promiseCompletionHandler = [] +} + +/* + * 获取wifi列表, 在调用之前需要引导用户跳转到系统设置-WIFI设置页面,系统搜索周边wifi后app才能接收到回调 + */ +export function getWifiList(option: WifiOption) { + let res = { + errCode: 12001, + errMsg: "system not support" + } + option.fail?.(res) + option.complete?.(res) +} + +/* 获取wifi列表的回调 + * note: 请在getWifiList方法的回调里调用该方法 + */ +export function onGetWifiList(callback: UTSCallback) { + +} + +/* + * 注销获取wifi列表的回调 + */ +export function offGetWifiList(callback: UTSCallback) { + +} + + +/* + * 获取当前连接的wifi信息 + */ +export function getConnectedWifi(option: GetConnectedWifiOptions) { + if (UIDevice.current.systemVersion >= "13.0") { + requestLocationPromise((success) => { + if (success == true) { + fetchConnectedWifiWithLocationPromise(option) + }else { + let res = { + errCode: 12010, + errMsg: "have no location promise" + } + option.fail?.(res) + option.complete?.(res) + } + }) + } else{ + fetchConnectedWifiWithLocationPromise(option) + } +} + +/* + * 连接wifi + */ +export function connectWifi(option: WifiConnectOption) { + let res = { + errCode: 12001, + errMsg: "system not support" + } + option.fail?.(res) + option.complete?.(res) +} + + +/* + * 连上wifi事件的监听函数 + */ +export function onWifiConnected(callback: UTSCallback) { + +} + +/* + * 连上wifi事件的监听函数, wifiInfo仅包含ssid + */ +export function onWifiConnectedWithPartialInfo(callback: UTSCallback) { + +} + +/* + * 移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。 + */ +export function offWifiConnected(callback: UTSCallback | null) { + +} + +/* + * 移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。 + */ +export function onOffWifiConnectedWithPartialInfo(callback: UTSCallback | null) { + +} + +/* + * 设置 wifiList 中 AP 的相关信息。在 onGetWifiList 回调后调用,iOS特有接口。 + */ +export function setWifiList(option: WifiOption) { + let res = { + errCode: 12001, + errMsg: "system not support" + } + option.fail?.(res) + option.complete?.(res) +} \ No newline at end of file -- GitLab