index.uts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import { CLLocationManager, CLAuthorizationStatus, CLLocationManagerDelegate } from 'CoreLocation'
  2. import { CaptiveNetwork, kCNNetworkInfoKeySSID, kCNNetworkInfoKeyBSSID } from 'SystemConfiguration.CaptiveNetwork';
  3. import { NSArray, NSDictionary } from 'Foundation';
  4. import { CFString } from 'CoreFoundation';
  5. import { UIDevice } from 'UIKit';
  6. import { UniWifiResultCallbackWithPartialInfo, UniGetWifiListCallback, UniWifiResultCallback, WifiOption, WifiConnectOption, GetConnectedWifiOptions, UniWifiInfo, UniWifiResult, UniWifiCallback, StartWifi, StopWifi, GetWifiList, OnGetWifiList, OffGetWifiList, GetConnectedWifi, ConnectWifi, OnWifiConnected, OnWifiConnectedWithPartialInfo, OffWifiConnected, OffWifiConnectedWithPartialInfo, SetWifiList } from "../interface.uts"
  7. import { WifiFailImpl, getErrcode } from '../unierror';
  8. /*
  9. * 系统定位权限获取类
  10. */
  11. class LocationPromiseService implements CLLocationManagerDelegate {
  12. static promiseCompletionHandler: ((res: boolean)=>void)[] = []
  13. manager?: CLLocationManager
  14. constructor(manager?: CLLocationManager) {
  15. this.manager = manager
  16. }
  17. initlizeManager(): boolean {
  18. if (this.manager == null) {
  19. this.manager = new CLLocationManager()
  20. this.manager!.delegate = this
  21. }
  22. return true
  23. }
  24. locationManager(manager: CLLocationManager, @argumentLabel("didChangeAuthorization") status: CLAuthorizationStatus) {
  25. if (status == CLAuthorizationStatus.authorizedAlways || status == CLAuthorizationStatus.authorizedWhenInUse) {
  26. LocationPromiseService.promiseCompletionHandler.forEach((handler): void => {
  27. handler(true)
  28. })
  29. } else if (status == CLAuthorizationStatus.notDetermined) {
  30. manager.requestWhenInUseAuthorization()
  31. } else if (status == CLAuthorizationStatus.denied) {
  32. LocationPromiseService.promiseCompletionHandler.forEach((handler): void => {
  33. handler(false)
  34. })
  35. }
  36. }
  37. requestPromise(@escaping completion: (res: boolean)=>void) {
  38. let status: CLAuthorizationStatus = CLLocationManager.authorizationStatus()
  39. if (status == CLAuthorizationStatus.notDetermined) {
  40. if (this.initlizeManager() == true) {
  41. this.manager!.requestWhenInUseAuthorization()
  42. LocationPromiseService.promiseCompletionHandler.push(completion)
  43. }
  44. } else if (status == CLAuthorizationStatus.authorizedAlways || status == CLAuthorizationStatus.authorizedWhenInUse) {
  45. completion(true)
  46. } else if (status == CLAuthorizationStatus.denied) {
  47. if (CLLocationManager.locationServicesEnabled() == false && this.initlizeManager() == true) {
  48. this.manager!.requestWhenInUseAuthorization()
  49. LocationPromiseService.promiseCompletionHandler.push(completion)
  50. }
  51. }
  52. }
  53. }
  54. const locationPromiseService: LocationPromiseService = new LocationPromiseService(null)
  55. /*
  56. * 获取系统定位权限
  57. */
  58. function requestLocationPromise(@escaping completion: (res: boolean)=>void) {
  59. locationPromiseService.requestPromise(completion)
  60. }
  61. /*
  62. * 获取当前连接的wifi信息(通过定位权限)
  63. */
  64. function fetchConnectedWifiWithLocationPromise(option: GetConnectedWifiOptions) {
  65. let arr = CNCopySupportedInterfaces()
  66. let wifiInfo: UniWifiInfo = {
  67. BSSID: "",
  68. SSID: "",
  69. secure: false,
  70. signalStrength: 0,
  71. frequency: 0
  72. }
  73. if (arr != null) {
  74. let list = arr! as NSArray
  75. let index: Int = 0
  76. while (index < list.count) {
  77. let item = list[index]
  78. let interfaceName = item as string
  79. let dic = CNCopyCurrentNetworkInfo(interfaceName as CFString)
  80. if (dic != null) {
  81. let dict = dic! as NSDictionary
  82. let SSID = dict[kCNNetworkInfoKeySSID as string]
  83. let BSSID = dict[kCNNetworkInfoKeyBSSID as string]
  84. if (SSID != null && BSSID != null) {
  85. let ssid = SSID! as string
  86. let bssid = BSSID! as string
  87. wifiInfo.SSID = ssid
  88. wifiInfo.BSSID = bssid
  89. wifiInfo.secure = false
  90. wifiInfo.signalStrength = 0
  91. wifiInfo.frequency = 0
  92. break;
  93. }
  94. }
  95. index++
  96. }
  97. if (wifiInfo.BSSID!.length > 0 && wifiInfo.SSID.length > 0) {
  98. let res: UniWifiResult = {
  99. errSubject: "uni-getConnectedWifi",
  100. errCode: 0,
  101. errMsg: "getConnectedWifi:ok",
  102. wifi: wifiInfo,
  103. }
  104. option.success?.(res)
  105. option.complete?.(res)
  106. }else {
  107. let err = new WifiFailImpl(getErrcode(12010));
  108. option.fail?.(err)
  109. option.complete?.(err)
  110. }
  111. }else {
  112. let err = new WifiFailImpl(getErrcode(12010));
  113. option.fail?.(err)
  114. option.complete?.(err)
  115. }
  116. }
  117. /*
  118. * 保存全局数据信息
  119. */
  120. class UniWiFiModuleGloabInfo {
  121. static alreadyStartWifi: boolean = false
  122. }
  123. /* =================================== 对外暴露的接口 ==============================================*/
  124. /*
  125. * 初始化wifi模块
  126. */
  127. export const startWifi: StartWifi = function (option: WifiOption) {
  128. UniWiFiModuleGloabInfo.alreadyStartWifi = true
  129. let res: UniWifiResult = {
  130. errSubject: "uni-startWifi",
  131. errCode: 0,
  132. errMsg: "startWifi:ok",
  133. wifi: null
  134. }
  135. option.success?.(res)
  136. option.complete?.(res)
  137. }
  138. /*
  139. * 停止wifi模块
  140. */
  141. export const stopWifi: StopWifi = function (option: WifiOption) {
  142. UniWiFiModuleGloabInfo.alreadyStartWifi = false
  143. LocationPromiseService.promiseCompletionHandler = []
  144. let res: UniWifiResult = {
  145. errSubject: "uni-stopWifi",
  146. errCode: 0,
  147. errMsg: "stopWifi:ok",
  148. wifi: null
  149. }
  150. option.success?.(res)
  151. option.complete?.(res)
  152. }
  153. /*
  154. * 获取wifi列表, 在调用之前需要引导用户跳转到系统设置-WIFI设置页面,系统搜索周边wifi后app才能接收到回调
  155. */
  156. export const getWifiList: GetWifiList = function (option: WifiOption) {
  157. let err = new WifiFailImpl(getErrcode(12001));
  158. option.fail?.(err)
  159. option.complete?.(err)
  160. }
  161. /* 获取wifi列表的回调
  162. * note: 请在getWifiList方法的回调里调用该方法
  163. */
  164. export const onGetWifiList: OnGetWifiList = function (callback: UniGetWifiListCallback) {
  165. }
  166. /*
  167. * 注销获取wifi列表的回调
  168. */
  169. export const offGetWifiList: OffGetWifiList = function (callback: UniWifiCallback) {
  170. }
  171. /*
  172. * 获取当前连接的wifi信息
  173. */
  174. export const getConnectedWifi: GetConnectedWifi = function (option: GetConnectedWifiOptions) {
  175. if (UniWiFiModuleGloabInfo.alreadyStartWifi == false) {
  176. let err = new WifiFailImpl(getErrcode(12000));
  177. option.fail?.(err)
  178. option.complete?.(err)
  179. } else{
  180. if (UIDevice.current.systemVersion >= "13.0") {
  181. requestLocationPromise((success) => {
  182. if (success == true) {
  183. fetchConnectedWifiWithLocationPromise(option)
  184. }else {
  185. let err = new WifiFailImpl(getErrcode(12007));
  186. option.fail?.(err)
  187. option.complete?.(err)
  188. }
  189. })
  190. } else{
  191. fetchConnectedWifiWithLocationPromise(option)
  192. }
  193. }
  194. }
  195. /*
  196. * 连接wifi
  197. */
  198. export const connectWifi: ConnectWifi = function (option: WifiConnectOption) {
  199. let err = new WifiFailImpl(getErrcode(12001));
  200. option.fail?.(err)
  201. option.complete?.(err)
  202. }
  203. /*
  204. * 连上wifi事件的监听函数
  205. */
  206. export const onWifiConnected: OnWifiConnected = function (callback: UniWifiResultCallback) {
  207. }
  208. /*
  209. * 连上wifi事件的监听函数, wifiInfo仅包含ssid
  210. */
  211. export const onWifiConnectedWithPartialInfo: OnWifiConnectedWithPartialInfo = function (callback: UniWifiResultCallbackWithPartialInfo) {
  212. }
  213. /*
  214. * 移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。
  215. */
  216. export const offWifiConnected: OffWifiConnected = function (callback: UniWifiCallback | null) {
  217. }
  218. /*
  219. * 移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。
  220. */
  221. export const offWifiConnectedWithPartialInfo: OffWifiConnectedWithPartialInfo = function (callback: UniWifiResultCallbackWithPartialInfo | null) {
  222. }
  223. /*
  224. * 设置 wifiList 中 AP 的相关信息。在 onGetWifiList 回调后调用,iOS特有接口。
  225. */
  226. export const setWifiList: SetWifiList = function (option: WifiOption) {
  227. let err = new WifiFailImpl(getErrcode(12001));
  228. option.fail?.(err)
  229. option.complete?.(err)
  230. }