diff --git a/.hbuilderx/launcher/hx_iOS_resign.json b/.hbuilderx/launcher/hx_iOS_resign.json new file mode 100644 index 0000000000000000000000000000000000000000..c0112903424c0ba6d2e48876b0edba88416a4d4f --- /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 0000000000000000000000000000000000000000..001d3ce5a5e71eef99a0009a49d8a5d6a4aee009 --- /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 0000000000000000000000000000000000000000..240b91f053ded7f45a1077b4b29487e882e2fa3d --- /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 0000000000000000000000000000000000000000..bc3370d44590a78c0c5bb938221d30c3203f6414 --- /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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..340cbc4dbb3c50e3b067efdf7e7e36ca6eebea9b 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