index.uts 8.2 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
	if (arr != null) {
		let list = arr! as NSArray
lizhongyi_'s avatar
lizhongyi_ 已提交
83
		let index: Int = 0
84
		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 {
lizhongyi_'s avatar
lizhongyi_ 已提交
117
			const res: UniWifiResult = { 
118 119
				errSubject: "uni-getConnectedWifi", 
				errCode: 12010, 
lizhongyi_'s avatar
lizhongyi_ 已提交
120 121
				errMsg: "getConnectedWifi:system internal error",
				wifi: null
122 123 124
			}
			option.fail?.(res)
			option.complete?.(res)
125 126
		}
	}else {
lizhongyi_'s avatar
lizhongyi_ 已提交
127
		const res: UniWifiResult = {
128 129
			errSubject: "uni-getConnectedWifi", 
			errCode: 12010, 
lizhongyi_'s avatar
lizhongyi_ 已提交
130 131
			errMsg: "getConnectedWifi:system internal error",
			wifi: null
132 133 134
		}
		option.fail?.(res)
		option.complete?.(res)
135 136 137 138 139
	}
}



140 141 142
/* 
 * 保存全局数据信息
 */
143
class UniWiFiModuleGloabInfo {
lizhongyi_'s avatar
lizhongyi_ 已提交
144
	static alreadyStartWifi: boolean = false
145
}
146 147 148 149 150 151 152 153

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



/* 
 * 初始化wifi模块 
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
154
export const startWifi: StartWifi = function (option: WifiOption) {
155
	UniWiFiModuleGloabInfo.alreadyStartWifi = true
lizhongyi_'s avatar
lizhongyi_ 已提交
156
	let res: UniWifiResult = {
157
		errSubject: "uni-startWifi",
158
		errCode: 0, 
lizhongyi_'s avatar
lizhongyi_ 已提交
159 160
		errMsg: "startWifi:ok",
		wifi: null
161
	}
162
	option.success?.(res)
163 164 165 166 167 168
	option.complete?.(res)
}

/* 
 * 停止wifi模块 
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
169
export const stopWifi: StopWifi = function (option: WifiOption) {
170
	UniWiFiModuleGloabInfo.alreadyStartWifi = false
171
	LocationPromiseService.promiseCompletionHandler = []	
lizhongyi_'s avatar
lizhongyi_ 已提交
172
	let res: UniWifiResult = {
173 174
		errSubject: "uni-stopWifi",
		errCode: 0, 
lizhongyi_'s avatar
lizhongyi_ 已提交
175 176
		errMsg: "stopWifi:ok",
		wifi: null
177 178 179
	}
	option.success?.(res)
	option.complete?.(res)
180 181 182 183 184
}

/* 
 * 获取wifi列表, 在调用之前需要引导用户跳转到系统设置-WIFI设置页面,系统搜索周边wifi后app才能接收到回调
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
185
export const getWifiList: GetWifiList = function (option: WifiOption) {
lizhongyi_'s avatar
lizhongyi_ 已提交
186
	let res: UniWifiResult = {
187
		errSubject: "uni-getWifiList",
188
		errCode: 12001, 
lizhongyi_'s avatar
lizhongyi_ 已提交
189 190
		errMsg: "getWifiList:system not support",
		wifi: null
191 192 193 194 195 196 197 198
	}
	option.fail?.(res)
	option.complete?.(res)
}

/* 获取wifi列表的回调
 * note: 请在getWifiList方法的回调里调用该方法
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
199
export const onGetWifiList: OnGetWifiList = function (callback: UniWifiCallback) {
200 201 202 203 204 205
	
}

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

208 209 210 211 212 213
}


/* 
 * 获取当前连接的wifi信息
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
214
export const getConnectedWifi: GetConnectedWifi = function (option: GetConnectedWifiOptions) {
215
	if (UniWiFiModuleGloabInfo.alreadyStartWifi == false) {
lizhongyi_'s avatar
lizhongyi_ 已提交
216
		let res: UniWifiResult = {
217
			errSubject: "uni-getConnectedWifi",
218
			errCode: 12000, 
219
			errMsg: "getConnectedWifi:not init",
lizhongyi_'s avatar
lizhongyi_ 已提交
220
			wifi: null
221 222 223
		}
		option.fail?.(res)
		option.complete?.(res)
224
	} else{
225 226 227 228 229
		if (UIDevice.current.systemVersion >= "13.0") {
			requestLocationPromise((success) => {
				if (success == true) {
					fetchConnectedWifiWithLocationPromise(option)
				}else {
lizhongyi_'s avatar
lizhongyi_ 已提交
230
					let res: UniWifiResult = {
231 232 233
						errSubject: "uni-getConnectedWifi",
						errCode: 12007, 
						errMsg: "getConnectedWifi:user denied",
lizhongyi_'s avatar
lizhongyi_ 已提交
234
						wifi: null
235 236 237 238 239 240 241 242
					}
					option.fail?.(res)
					option.complete?.(res)
				}
			})
		} else{
			fetchConnectedWifiWithLocationPromise(option)
		}
243 244 245 246 247 248
	}
}

/* 
 * 连接wifi
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
249
export const connectWifi: ConnectWifi = function (option: WifiConnectOption) {
lizhongyi_'s avatar
lizhongyi_ 已提交
250
	let res: UniWifiResult = {
251
		errSubject: "uni-connectWifi",
252
		errCode: 12001, 
lizhongyi_'s avatar
lizhongyi_ 已提交
253 254
		errMsg: "connectWifi:system not support",
		wifi: null
255 256 257 258 259 260 261 262 263
	}
	option.fail?.(res)
	option.complete?.(res)
}


/* 
 * 连上wifi事件的监听函数
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
264
export const onWifiConnected: OnWifiConnected = function (callback: UniWifiCallback) {
265 266 267 268 269 270
	
}

/* 
 * 连上wifi事件的监听函数, wifiInfo仅包含ssid
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
271
export const onWifiConnectedWithPartialInfo: OnWifiConnectedWithPartialInfo = function (callback: UniWifiCallback) {
272 273 274 275 276 277
	
}

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

280
}
lizhongyi_'s avatar
lizhongyi_ 已提交
281

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

287 288 289 290 291
}

/* 
 * 设置 wifiList 中 AP 的相关信息。在 onGetWifiList 回调后调用,iOS特有接口。
 */
lizhongyi_'s avatar
lizhongyi_ 已提交
292
export const setWifiList: SetWifiList = function (option: WifiOption) {
lizhongyi_'s avatar
lizhongyi_ 已提交
293
	let res: UniWifiResult = {
294
		errSubject: "uni-setWifiList",
295
		errCode: 12001, 
lizhongyi_'s avatar
lizhongyi_ 已提交
296 297
		errMsg: "setWifiList:system not support",
		wifi: null
298 299 300 301
	}
	option.fail?.(res)
	option.complete?.(res)
}