index.uts 7.8 KB
Newer Older
1 2
import { CLLocationManager, CLAuthorizationStatus, CLLocationManagerDelegate } from 'CoreLocation'
import { CaptiveNetwork, kCNNetworkInfoKeySSID, kCNNetworkInfoKeyBSSID } from 'SystemConfiguration.CaptiveNetwork';
lizhongyi_'s avatar
lizhongyi_ 已提交
3
import { NSArray, NSDictionary } from 'Foundation';
4 5
import { CFString } from 'CoreFoundation';
import { UIDevice } from 'UIKit';
lizhongyi_'s avatar
lizhongyi_ 已提交
6
import { WifiOption, WifiConnectOption, GetConnectedWifiOptions, UniWifiInfo, UniWifiResult, UniWifiCallback, StartWifi, StopWifi, GetWifiList, OnGetWifiList, OffGetWifiList, GetConnectedWifi, ConnectWifi, OnWifiConnected, OnWifiConnectedWithPartialInfo, OffWifiConnected, OnOffWifiConnectedWithPartialInfo, SetWifiList } from "../interface.uts"
7 8

/* 
lizhongyi_'s avatar
lizhongyi_ 已提交
9
 * 系统定位权限获取类
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 */
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
	}
	
28
	locationManager(manager: CLLocationManager, @argumentLabel("didChangeAuthorization") status: CLAuthorizationStatus) {
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
		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)
			})
		}
	}   
	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()
lizhongyi_'s avatar
lizhongyi_ 已提交
73 74 75 76 77 78 79
	let wifiInfo: UniWifiInfo = {
		BSSID: "",
		SSID: "",
		secure: false,
		signalStrength: 0,
		frequency: 0
	} 
80
	
81 82 83 84
	if (arr != null) {
		let list = arr! as NSArray
		let index = 0
		while (index < list.count) { 
lizhongyi_'s avatar
lizhongyi_ 已提交
85
			let item = list[index] 
86 87 88 89 90 91 92 93 94 95 96 97
			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
98
					wifiInfo.secure = false
99 100 101 102 103 104 105 106
					wifiInfo.signalStrength = 0
					wifiInfo.frequency = 0
					break;
				}
			}
			index++
		}
		
lizhongyi_'s avatar
lizhongyi_ 已提交
107
		if (wifiInfo.BSSID!.length > 0 && wifiInfo.SSID.length > 0) {
lizhongyi_'s avatar
lizhongyi_ 已提交
108
			let res: UniWifiResult = {
109
				errSubject: "uni-getConnectedWifi",
110
				errCode: 0,
111
				errMsg: "getConnectedWifi:ok",
112 113 114 115 116
				wifi: wifiInfo,
			}
			option.success?.(res)
			option.complete?.(res)
		}else {
杜庆泉's avatar
杜庆泉 已提交
117 118 119
			let err = new UniError("uni-getConnectedWifi",12010,"getConnectedWifi:system internal error");
			option.fail?.(err)
			option.complete?.(err)
120 121
		}
	}else {
杜庆泉's avatar
杜庆泉 已提交
122 123 124
		let err = new UniError("uni-getConnectedWifi",12010,"getConnectedWifi:system internal error");
		option.fail?.(err)
		option.complete?.(err)
125 126 127 128 129
	}
}



130 131 132
/* 
 * 保存全局数据信息
 */
133
class UniWiFiModuleGloabInfo {
lizhongyi_'s avatar
lizhongyi_ 已提交
134
	static alreadyStartWifi: boolean = false
135
}
136 137 138 139 140 141 142 143

/* =================================== 对外暴露的接口 ==============================================*/



/* 
 * 初始化wifi模块 
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
144
export const startWifi: StartWifi = function (option: WifiOption) {
145
	UniWiFiModuleGloabInfo.alreadyStartWifi = true
lizhongyi_'s avatar
lizhongyi_ 已提交
146
	let res: UniWifiResult = {
147
		errSubject: "uni-startWifi",
148
		errCode: 0, 
lizhongyi_'s avatar
lizhongyi_ 已提交
149 150
		errMsg: "startWifi:ok",
		wifi: null
151
	}
152
	option.success?.(res)
153 154 155 156 157 158
	option.complete?.(res)
}

/* 
 * 停止wifi模块 
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
159
export const stopWifi: StopWifi = function (option: WifiOption) {
160
	UniWiFiModuleGloabInfo.alreadyStartWifi = false
161
	LocationPromiseService.promiseCompletionHandler = []	
lizhongyi_'s avatar
lizhongyi_ 已提交
162
	let res: UniWifiResult = {
163 164
		errSubject: "uni-stopWifi",
		errCode: 0, 
lizhongyi_'s avatar
lizhongyi_ 已提交
165 166
		errMsg: "stopWifi:ok",
		wifi: null
杜庆泉's avatar
杜庆泉 已提交
167
	}
168 169
	option.success?.(res)
	option.complete?.(res)
170 171 172 173 174
}

/* 
 * 获取wifi列表, 在调用之前需要引导用户跳转到系统设置-WIFI设置页面,系统搜索周边wifi后app才能接收到回调
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
175
export const getWifiList: GetWifiList = function (option: WifiOption) {
杜庆泉's avatar
杜庆泉 已提交
176 177 178
	let err = new UniError("uni-getWifiList",12001,"getWifiList:system not support");
	option.fail?.(err)
	option.complete?.(err)
179 180 181 182 183
}

/* 获取wifi列表的回调
 * note: 请在getWifiList方法的回调里调用该方法
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
184
export const onGetWifiList: OnGetWifiList = function (callback: UniWifiCallback) {
185 186 187 188 189 190
	
}

/* 
 *	注销获取wifi列表的回调
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
191
export const offGetWifiList: OffGetWifiList = function (callback: UniWifiCallback) {
192

193 194 195 196 197 198
}


/* 
 * 获取当前连接的wifi信息
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
199
export const getConnectedWifi: GetConnectedWifi = function (option: GetConnectedWifiOptions) {
200
	if (UniWiFiModuleGloabInfo.alreadyStartWifi == false) {
杜庆泉's avatar
杜庆泉 已提交
201 202 203
		let err = new UniError("uni-getConnectedWifi",12000,"getConnectedWifi:not init");
		option.fail?.(err)
		option.complete?.(err)
204
	} else{
205 206 207 208 209
		if (UIDevice.current.systemVersion >= "13.0") {
			requestLocationPromise((success) => {
				if (success == true) {
					fetchConnectedWifiWithLocationPromise(option)
				}else {
杜庆泉's avatar
杜庆泉 已提交
210 211 212
					let err = new UniError("uni-getConnectedWifi",12007,"getConnectedWifi:user denied");
					option.fail?.(err)
					option.complete?.(err)
213 214 215 216 217
				}
			})
		} else{
			fetchConnectedWifiWithLocationPromise(option)
		}
218 219 220 221 222 223
	}
}

/* 
 * 连接wifi
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
224
export const connectWifi: ConnectWifi = function (option: WifiConnectOption) {
杜庆泉's avatar
杜庆泉 已提交
225 226 227 228
	
	let err = new UniError("uni-connectWifi",12001,"connectWifi:system not support");
	option.fail?.(err)
	option.complete?.(err)
229 230 231 232 233 234
}


/* 
 * 连上wifi事件的监听函数
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
235
export const onWifiConnected: OnWifiConnected = function (callback: UniWifiCallback) {
236 237 238 239 240 241
	
}

/* 
 * 连上wifi事件的监听函数, wifiInfo仅包含ssid
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
242
export const onWifiConnectedWithPartialInfo: OnWifiConnectedWithPartialInfo = function (callback: UniWifiCallback) {
243 244 245 246 247 248
	
}

/* 
 *	移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
249
export const offWifiConnected: OffWifiConnected = function (callback: UniWifiCallback | null) {
250

251
}
lizhongyi_'s avatar
lizhongyi_ 已提交
252

253 254 255
/* 
 *	移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
256
export const onOffWifiConnectedWithPartialInfo: OnOffWifiConnectedWithPartialInfo = function (callback: UniWifiCallback | null) {
257

258 259 260 261 262
}

/* 
 * 设置 wifiList 中 AP 的相关信息。在 onGetWifiList 回调后调用,iOS特有接口。
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
263
export const setWifiList: SetWifiList = function (option: WifiOption) {
杜庆泉's avatar
杜庆泉 已提交
264 265 266
	let err = new UniError("uni-setWifiList",12001,"setWifiList:system not support");
	option.fail?.(err)
	option.complete?.(err)
267
}