index.uts 7.8 KB

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