@ -1,28 +0,0 @@ |
|||
{ |
|||
"name": "JY-MLScanSDK模块", |
|||
"id": "JY-MLScanSDK", |
|||
"version": "1.0.0", |
|||
"description": "JY-MLScanSDK", |
|||
"_dp_type": "nativeplugin", |
|||
"_dp_nativeplugin": { |
|||
"android": { |
|||
"plugins": [{ |
|||
"type": "module", |
|||
"name": "JY-MLScanSDK", |
|||
"class": "com.jiyi.jy_mlscansdk.JYMLScanSDKModule" |
|||
}], |
|||
"integrateType": "aar", |
|||
"dependencies": [ |
|||
"com.google.mlkit:barcode-scanning:16.2.0", |
|||
"androidx.camera:camera-core:1.0.1", |
|||
"androidx.camera:camera-camera2:1.0.1", |
|||
"androidx.camera:camera-lifecycle:1.0.1", |
|||
"androidx.camera:camera-view:1.0.0-alpha25" |
|||
], |
|||
"compileOptions": { |
|||
"sourceCompatibility": "1.8", |
|||
"targetCompatibility": "1.8" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,32 @@ |
|||
{ |
|||
"name": "LYHWScan", |
|||
"id": "LY-HWScan", |
|||
"version": "1.0.8", |
|||
"description": "uni原生华为扫描插件", |
|||
"_dp_type": "nativeplugin", |
|||
"_dp_nativeplugin": { |
|||
"android": { |
|||
"plugins": [{ |
|||
"type": "module", |
|||
"name": "LY-HWScan", |
|||
"class": "com.lianyunzhihui.uniplugin_hwscan.HWScanModule" |
|||
}, { |
|||
"type": "component", |
|||
"name": "ly-hwscan", |
|||
"class": "com.lianyunzhihui.uniplugin_hwscan.HWScan" |
|||
}], |
|||
"hooksClass": "", |
|||
"integrateType": "aar", |
|||
"dependencies": [ |
|||
"androidx.localbroadcastmanager:localbroadcastmanager:1.0.0", |
|||
"androidx.core:core:1.1.0", |
|||
"androidx.fragment:fragment:1.1.0", |
|||
"androidx.appcompat:appcompat:1.1.0", |
|||
"androidx.recyclerview:recyclerview:1.1.0", |
|||
"com.alibaba:fastjson:1.2.83", |
|||
"com.huawei.hms:scanplus:2.9.0.300" |
|||
], |
|||
"minSdkVersion": "21" |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
<template> |
|||
<view> |
|||
<web-view :src="url"></web-view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
url: '' |
|||
} |
|||
}, |
|||
onLoad(option) { |
|||
let that = this; |
|||
that.url = option.url |
|||
console.log('that.url',that.url) |
|||
|
|||
}, |
|||
onHide() { |
|||
|
|||
}, |
|||
methods: { |
|||
|
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
</style> |
|||
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
@ -0,0 +1,100 @@ |
|||
{ |
|||
"id": "uni-wifi", |
|||
"displayName": "uni-wifi", |
|||
"version": "1.0.4", |
|||
"description": "wifi管理", |
|||
"keywords": [ |
|||
"wifi" |
|||
], |
|||
"repository": "", |
|||
"engines": { |
|||
"HBuilderX": "^3.6.11" |
|||
}, |
|||
"dcloudext": { |
|||
"type": "uts", |
|||
"sale": { |
|||
"regular": { |
|||
"price": "0.00" |
|||
}, |
|||
"sourcecode": { |
|||
"price": "0.00" |
|||
} |
|||
}, |
|||
"contact": { |
|||
"qq": "" |
|||
}, |
|||
"declaration": { |
|||
"ads": "无", |
|||
"data": "插件不采集任何数据", |
|||
"permissions": "Android平台:\n<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>\n<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>\n<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>\n<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>\niOS平台:\niOS13及以上平台获取Wifi信息需要定位权限" |
|||
}, |
|||
"npmurl": "" |
|||
}, |
|||
"uni_modules": { |
|||
"uni-ext-api":{ |
|||
"uni": { |
|||
"startWifi": "startWifi", |
|||
"stopWifi": "stopWifi", |
|||
"connectWifi":"connectWifi", |
|||
"getConnectedWifi": "getConnectedWifi", |
|||
"getWifiList":"getWifiList", |
|||
"onGetWifiList":"onGetWifiList", |
|||
"offGetWifiList":"offGetWifiList", |
|||
"onWifiConnected":"onWifiConnected", |
|||
"offWifiConnected":"offWifiConnected", |
|||
"onWifiConnectedWithPartialInfo":"onWifiConnectedWithPartialInfo", |
|||
"offWifiConnectedWithPartialInfo":"offWifiConnectedWithPartialInfo" |
|||
} |
|||
}, |
|||
"dependencies": [], |
|||
"encrypt": [], |
|||
"platforms": { |
|||
"cloud": { |
|||
"tcb": "y", |
|||
"aliyun": "y" |
|||
}, |
|||
"client": { |
|||
"Vue": { |
|||
"vue2": "y", |
|||
"vue3": "y" |
|||
}, |
|||
"App": { |
|||
"app-android": { |
|||
"minVersion": "19" |
|||
}, |
|||
"app-ios": { |
|||
"minVersion": "9" |
|||
} |
|||
}, |
|||
"H5-mobile": { |
|||
"Safari": "n", |
|||
"Android Browser": "n", |
|||
"微信浏览器(Android)": "n", |
|||
"QQ浏览器(Android)": "n" |
|||
}, |
|||
"H5-pc": { |
|||
"Chrome": "n", |
|||
"IE": "n", |
|||
"Edge": "n", |
|||
"Firefox": "n", |
|||
"Safari": "n" |
|||
}, |
|||
"小程序": { |
|||
"微信": "n", |
|||
"阿里": "n", |
|||
"百度": "n", |
|||
"字节跳动": "n", |
|||
"QQ": "n", |
|||
"钉钉": "n", |
|||
"快手": "n", |
|||
"飞书": "n", |
|||
"京东": "n" |
|||
}, |
|||
"快应用": { |
|||
"华为": "n", |
|||
"联盟": "n" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,145 @@ |
|||
## 使用说明 |
|||
|
|||
Wi-Fi功能模块 |
|||
|
|||
|
|||
### App-iOS平台注意事项 |
|||
- iOS平台App获取Wi-Fi信息需要开启“Access WiFi information”能力 |
|||
登录苹果开发者网站,在“Certificates, Identifiers & Profiles”页面选择“Identifiers”中选择对应的App ID,确保开启“Access WiFi information”,保存后重新生成profile文件 |
|||
- iOS13及以上系统,获取当前连接的Wi-Fi信息需要先获取系统定位权限,因此在iOS13及以上系统使用此接口时,会触发定位权限申请的弹窗 |
|||
|
|||
### App-Android平台注意事项 |
|||
- 如果是自定义基座,需要具备下面的权限 |
|||
|
|||
``` |
|||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> |
|||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> |
|||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> |
|||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> |
|||
``` |
|||
|
|||
|
|||
###uni.startWifi(OBJECT) |
|||
|
|||
初始化Wi-Fi模块。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#startwifi](https://uniapp.dcloud.net.cn/api/system/wifi.html#startwifi) |
|||
|
|||
|
|||
### uni.stopWifi(OBJECT) |
|||
|
|||
关闭 Wi-Fi 模块。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#stopwifi](https://uniapp.dcloud.net.cn/api/system/wifi.html#stopwifi) |
|||
|
|||
|
|||
### uni.getConnectedWifi(OBJECT) |
|||
|
|||
获取已连接的 Wi-Fi 信息 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#getconnectedwifi](https://uniapp.dcloud.net.cn/api/system/wifi.html#getconnectedwifi) |
|||
|
|||
|
|||
### uni.getWifiList(OBJECT) |
|||
|
|||
请求获取 Wi-Fi 列表。wifiList 数据会在 onGetWifiList 注册的回调中返回。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#getWifiList](https://uniapp.dcloud.net.cn/api/system/wifi.html#getWifiList) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
|
|||
### uni.onGetWifiList(CALLBACK) |
|||
|
|||
监听获取到 Wi-Fi 列表数据事件。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#onGetWifiList](https://uniapp.dcloud.net.cn/api/system/wifi.html#onGetWifiList) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
|
|||
### uni.offGetWifiList(CALLBACK) |
|||
|
|||
移除获取到 Wi-Fi 列表数据事件的监听函数。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#offGetWifiList](https://uniapp.dcloud.net.cn/api/system/wifi.html#offGetWifiList) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
|
|||
### uni.connectWifi(OBJECT) |
|||
|
|||
连接 Wi-Fi。若已知 Wi-Fi 信息,可以直接利用该接口连接。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#connectWifi](https://uniapp.dcloud.net.cn/api/system/wifi.html#connectWifi) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
|
|||
### uni.onWifiConnected(CALLBACK) |
|||
|
|||
监听连接上 Wi-Fi 的事件。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#onWifiConnected](https://uniapp.dcloud.net.cn/api/system/wifi.html#onWifiConnected) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
|
|||
### uni.offWifiConnected(CALLBACK) |
|||
|
|||
移除连接上 Wi-Fi 的事件的监听函数。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#offWifiConnected](https://uniapp.dcloud.net.cn/api/system/wifi.html#offWifiConnected) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
|
|||
### uni.onWifiConnectedWithPartialInfo(CALLBACK) |
|||
|
|||
监听连接上 Wi-Fi 的事件。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#onWifiConnectedWithPartialInfo](https://uniapp.dcloud.net.cn/api/system/wifi.html#onWifiConnectedWithPartialInfo) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
|
|||
### uni.offWifiConnectedWithPartialInfo(CALLBACK) |
|||
|
|||
移除连接上 Wi-Fi 的事件的监听函数。 |
|||
|
|||
> 使用文档:[https://uniapp.dcloud.net.cn/api/system/wifi.html#offWifiConnectedWithPartialInfo](https://uniapp.dcloud.net.cn/api/system/wifi.html#offWifiConnectedWithPartialInfo) |
|||
|
|||
**平台差异说明** |
|||
|
|||
|App-Android|App-iOS| |
|||
|:-:|:-:| |
|||
|√|x| |
|||
|
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"minSdkVersion": "19" |
|||
} |
|||
@ -0,0 +1,864 @@ |
|||
import Context from "android.content.Context"; |
|||
import { UTSAndroid } from "io.dcloud.uts"; |
|||
import WifiManager from "android.net.wifi.WifiManager"; |
|||
import WifiInfo from "android.net.wifi.WifiInfo"; |
|||
import Manifest from "android.Manifest"; |
|||
import PackageManager from "android.content.pm.PackageManager"; |
|||
import ScanResult from "android.net.wifi.ScanResult"; |
|||
import BroadcastReceiver from "android.content.BroadcastReceiver"; |
|||
import ActivityCompat from "androidx.core.app.ActivityCompat"; |
|||
import IntentFilter from "android.content.IntentFilter"; |
|||
import JSONObject from "com.alibaba.fastjson.JSONObject"; |
|||
import Intent from "android.content.Intent"; |
|||
import Thread from "java.lang.Thread"; |
|||
|
|||
import WifiConfiguration from 'android.net.wifi.WifiConfiguration'; |
|||
import AuthAlgorithm from 'android.net.wifi.WifiConfiguration.AuthAlgorithm'; |
|||
import KeyMgmt from 'android.net.wifi.WifiConfiguration.KeyMgmt'; |
|||
import TextUtils from 'android.text.TextUtils'; |
|||
import Build from 'android.os.Build'; |
|||
|
|||
import { UniWifiResult, GetConnectedWifiOptions, WifiConnectOption, WifiOption, UniWifiInfo } from "../interface.uts" |
|||
|
|||
|
|||
/** |
|||
* 全局数据储存 |
|||
*/ |
|||
class Global { |
|||
static mReceiver : CustomBroadcastReceiver | null = null; |
|||
static WIFI_AUTH_OPEN : string = ""; |
|||
static WIFI_AUTH_ROAM : String = "[ESS]"; |
|||
// 扫描wifi结果 |
|||
static scanList : AndroidUniWifiInfo[] = [] |
|||
// 获取wifi列表监听 |
|||
static onGetWifiListCallback : UTSCallback | null = null |
|||
static supendGetWifiSuccess : ((res: UniWifiResult) => void) | null = null |
|||
static supendGetWifiComplete : ((res: UniWifiResult) => void) | null = null |
|||
// wifi链接监听 |
|||
static onWifiConnectCallbackList : UTSCallback[] = [] |
|||
static onWifiConnectWithPartialInfoCallbackList : UTSCallback[] = [] |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 是否是标准的16进制字符 |
|||
*/ |
|||
function isHex(key : string) : boolean { |
|||
for (var i = key.length - 1; i >= 0; i--) { |
|||
let c = key.charAt(i); |
|||
if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a' |
|||
&& c <= 'f')) { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* 判断是否是wep格式的key |
|||
*/ |
|||
function isHexWepKey(wepKey : string) : boolean { |
|||
let len = wepKey.length; |
|||
|
|||
// WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?) |
|||
if (len != 10 && len != 26 && len != 58) { |
|||
return false; |
|||
} |
|||
|
|||
return isHex(wepKey); |
|||
} |
|||
/** |
|||
* android 平台特有的Wifi信息对象,主要是加了加密信息这个字段 |
|||
*/ |
|||
export type AndroidUniWifiInfo = { |
|||
SSID : string; |
|||
BSSID ?: string; |
|||
secure : boolean; |
|||
signalStrength : number; |
|||
frequency : number; |
|||
securityType : string; |
|||
} |
|||
|
|||
function wrapUniWifiInfoFromAndroid(androidInfo : AndroidUniWifiInfo) : UniWifiInfo { |
|||
let ret : UniWifiInfo = { |
|||
SSID: androidInfo.SSID, |
|||
BSSID: androidInfo.BSSID, |
|||
secure: androidInfo.secure, |
|||
signalStrength: androidInfo.signalStrength, |
|||
frequency: androidInfo.frequency, |
|||
} |
|||
return ret |
|||
} |
|||
/** |
|||
* 从扫描结果中提取统一的wifi数据结构 |
|||
*/ |
|||
function wrapUniWifiInfoFromScan(scanResult : ScanResult) : AndroidUniWifiInfo { |
|||
|
|||
let ret : AndroidUniWifiInfo = { |
|||
SSID: "", |
|||
secure: false, |
|||
signalStrength: 0, |
|||
frequency: 0, |
|||
securityType: "NONE" |
|||
} |
|||
if (scanResult != null) { |
|||
// 如果是通过扫描列表得到的数据,进行封装 |
|||
ret.BSSID = scanResult.BSSID; |
|||
ret.SSID = scanResult.SSID; |
|||
|
|||
ret.signalStrength = scanResult.level; |
|||
ret.frequency = scanResult.frequency; |
|||
|
|||
// 是否安全,微信的标准是是否需要密码。 来源:https://developers.weixin.qq.com/community/develop/doc/00064cf1790458db19cddf9925ac00?highLine=WifiInfo |
|||
ret.secure = false; |
|||
let capabilities = scanResult.capabilities.trim(); |
|||
if ((capabilities.equals(Global.WIFI_AUTH_OPEN) || capabilities.equals(Global.WIFI_AUTH_ROAM))) { |
|||
ret.secure = false; |
|||
} else { |
|||
ret.secure = true; |
|||
} |
|||
|
|||
/*扩展字段*/ |
|||
ret.securityType = getSecurityType(scanResult); |
|||
} |
|||
|
|||
return ret |
|||
} |
|||
/** |
|||
* 从链接信息中提取统一的wifi数据结构 |
|||
*/ |
|||
function wrapUniWifiInfoFromConnectInfo(connectInfo : WifiInfo) : UniWifiInfo { |
|||
let ret : UniWifiInfo = { |
|||
SSID: "", |
|||
secure: false, |
|||
signalStrength: 0, |
|||
frequency: 0, |
|||
} |
|||
|
|||
|
|||
if (connectInfo.getSSID() != null) { |
|||
let s = connectInfo.getSSID(); |
|||
// 微信不带,这里需要去掉引号 |
|||
if (s.length > 2 && s.charAt(0) == '"' && s.charAt(s.length - 1) == '"') { |
|||
s = s.substring(1, s.length - 1); |
|||
} |
|||
ret.SSID = s; |
|||
} |
|||
|
|||
ret.BSSID = connectInfo.getBSSID(); |
|||
//Android返回的值是-100~0,而微信API规范是0~100,值越大信号越好,需要+100拉齐 |
|||
ret.signalStrength = connectInfo.getRssi() + 100; |
|||
ret.frequency = connectInfo.getFrequency(); |
|||
|
|||
|
|||
return ret |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 连接wifi时使用,根据用户输入内容包装为系统需要的wifi配置对象 |
|||
**/ |
|||
@Suppress("DEPRECATION") |
|||
function wrapWifiConfiguration(SSID : string, password ?: string, passwordType : string) : WifiConfiguration { |
|||
|
|||
let config = new WifiConfiguration(); |
|||
config.status = WifiConfiguration.Status.ENABLED; |
|||
config.allowedAuthAlgorithms.clear(); |
|||
config.allowedGroupCiphers.clear(); |
|||
config.allowedKeyManagement.clear(); |
|||
config.allowedPairwiseCiphers.clear(); |
|||
config.allowedProtocols.clear(); |
|||
config.SSID = "\"".concat(SSID).concat("\""); |
|||
|
|||
|
|||
// nopass |
|||
if ("NONE".equals(passwordType) || password == null) { |
|||
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); |
|||
} |
|||
// wep |
|||
else if ("WEP".equals(passwordType)) { |
|||
if (password != null && !TextUtils.isEmpty(password)) { |
|||
if (isHexWepKey(password)) { |
|||
config.wepKeys[0] = password; |
|||
} else { |
|||
config.wepKeys[0] = "\"".concat(password).concat("\""); |
|||
} |
|||
} |
|||
config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); |
|||
config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); |
|||
config.allowedKeyManagement.set(KeyMgmt.NONE); |
|||
config.wepTxKeyIndex = 0; |
|||
} |
|||
// wpa |
|||
else if ("WPA".equals(passwordType)) { |
|||
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN); |
|||
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); |
|||
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); |
|||
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); |
|||
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); |
|||
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); |
|||
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); |
|||
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); |
|||
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); |
|||
config.preSharedKey = "\"".concat(password).concat("\""); |
|||
} |
|||
|
|||
return config; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 判断当前wifi的加密类型 |
|||
*/ |
|||
function getSecurityType(result : ScanResult) : string { |
|||
if (result.capabilities.contains("WEP")) { |
|||
return "WEP"; |
|||
} else if (result.capabilities.contains("PSK")) { |
|||
return "WPA"; |
|||
} else if (result.capabilities.contains("EAP")) { |
|||
return "EAP"; |
|||
} |
|||
return "NONE"; |
|||
} |
|||
|
|||
|
|||
function zeroCountNum(source ?: string) : number { |
|||
if (source == null) { |
|||
return 0 |
|||
} |
|||
var splitted = source.split(":") |
|||
var countNum = 0; |
|||
for (perItem in splitted) { |
|||
if (perItem == "00") { |
|||
countNum += 1 |
|||
} |
|||
} |
|||
return countNum |
|||
} |
|||
|
|||
class AsyncConnectionThread extends Thread{ |
|||
|
|||
mWifiManager : WifiManager | null = null; |
|||
|
|||
constructor(wifi:WifiManager){ |
|||
super(); |
|||
this.mWifiManager = wifi |
|||
} |
|||
override run(){ |
|||
|
|||
let uniWifiInfo : UniWifiInfo = { |
|||
SSID: "", |
|||
secure: false, |
|||
signalStrength: 0, |
|||
frequency: 0, |
|||
} |
|||
|
|||
// BroadcastReceiver 中不能执行耗时任务,需要使用setTimeout |
|||
// @ts-ignore |
|||
let winfo = this.mWifiManager!.getConnectionInfo(); |
|||
|
|||
while (winfo.bssid == null || zeroCountNum(winfo.bssid) > 4) { |
|||
Thread.sleep(1000) |
|||
winfo = this.mWifiManager!.getConnectionInfo(); |
|||
} |
|||
|
|||
// 封装成数据对象 |
|||
uniWifiInfo = wrapUniWifiInfoFromConnectInfo(winfo) |
|||
let res = { |
|||
errMsg: 'onWifiConnected:ok', |
|||
errCode: 0, |
|||
wifi: uniWifiInfo |
|||
} |
|||
// wifi状态可用了,分发当前的链接状态给已注册的监听集合 |
|||
for (let perCallback in Global.onWifiConnectCallbackList) { |
|||
perCallback(res); |
|||
} |
|||
// 封装仅SSID 数据对象 |
|||
var connectedWithPartialInfo = { |
|||
SSID: uniWifiInfo.SSID |
|||
} |
|||
for (let perCallback in Global.onWifiConnectWithPartialInfoCallbackList) { |
|||
perCallback(connectedWithPartialInfo); |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
/** |
|||
* 自定义wifi变化广播监听器 |
|||
*/ |
|||
@Suppress("UNUSED_PARAMETER", "DEPRECATION") |
|||
class CustomBroadcastReceiver extends BroadcastReceiver { |
|||
|
|||
mWifiManager : WifiManager | null = null; |
|||
|
|||
constructor(wifiManager : WifiManager) { |
|||
super(); |
|||
this.mWifiManager = wifiManager; |
|||
} |
|||
|
|||
override onReceive(_context : Context, intent : Intent) : void { |
|||
|
|||
|
|||
if (intent.action == WifiManager.WIFI_STATE_CHANGED_ACTION) { |
|||
let state = |
|||
intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN) |
|||
if (state == WifiManager.WIFI_STATE_ENABLED) { |
|||
// 获取当前的connectInfo 并且进行数据封装 |
|||
// let uniWifiInfo = new UniWifiInfo(null) |
|||
//做一些异步操作 |
|||
new AsyncConnectionThread(this.mWifiManager!!).start() |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
if (intent.action == WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) { |
|||
startWifiScaning = false; |
|||
|
|||
let ret : UniWifiResult = { |
|||
errCode: 0, |
|||
errSubject: "uni-getWifiList", |
|||
errMsg: "getWifiList:ok" |
|||
} |
|||
if(Global.supendGetWifiSuccess != null){ |
|||
Global.supendGetWifiSuccess?.(ret) |
|||
} |
|||
if(Global.supendGetWifiComplete != null){ |
|||
Global.supendGetWifiComplete?.(ret) |
|||
} |
|||
|
|||
// wifi 扫描结果回调 |
|||
let results = this.mWifiManager!.scanResults; |
|||
|
|||
|
|||
if (results != null) { |
|||
Global.scanList = [] |
|||
for (let scanResult in results) { |
|||
if (scanResult.SSID == null) { |
|||
continue; |
|||
} |
|||
Global.scanList.push(wrapUniWifiInfoFromScan(scanResult)); |
|||
} |
|||
|
|||
// 挨个通知,所有的监听器 |
|||
if(Global.onGetWifiListCallback != null){ |
|||
const data = new JSONObject(); |
|||
data["wifiList"] = Global.scanList |
|||
Global.onGetWifiListCallback?.(data); |
|||
} |
|||
// for (let perCallback in Global.onGetWifiListCallback) { |
|||
// const data = new JSONObject(); |
|||
// data["wifiList"] = Global.scanList |
|||
// perCallback(data); |
|||
// } |
|||
|
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
/************************* 下面是对外提供的函数 *************************/ |
|||
/** |
|||
* start wifi是否正在扫描 |
|||
*/ |
|||
var startWifiScaning = false |
|||
|
|||
/** |
|||
* 开启wifi |
|||
*/ |
|||
@Suppress("DEPRECATION") |
|||
export function startWifi(option : WifiOption) { |
|||
|
|||
// 需要先开启wifi,才能使用后续的功能 |
|||
let requestCode = 1001; |
|||
let permissionWifi = arrayOf("android.permission.ACCESS_FINE_LOCATION"); |
|||
var result : UniWifiResult = { |
|||
errCode: 12001, |
|||
errMsg: "startWifi:premission loss", |
|||
errSubject: "uni-startWifi" |
|||
} |
|||
// 检查权限 |
|||
if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { |
|||
|
|||
ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, permissionWifi, requestCode) |
|||
// 尚不具备权限,返回错误 |
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
|
|||
return; |
|||
} |
|||
|
|||
// 具备了权限,继续前进 |
|||
let wifiManager : WifiManager = |
|||
UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager |
|||
// 用户没有开启wifi 总开关 |
|||
if (!wifiManager.isWifiEnabled()) { |
|||
// wifi 没开启 |
|||
result.errCode = 12005; |
|||
result.errMsg = "wifi not turned on"; |
|||
|
|||
option.fail?.(result); |
|||
option.complete?.(result); |
|||
return; |
|||
} |
|||
// 初始化wifi 状态广播监听,后续所有的api,均基于此 |
|||
if(Global.mReceiver != null){ |
|||
// 说明已经注册过了 |
|||
result.errCode = 0 |
|||
result.errMsg = "startWifi:ok" |
|||
|
|||
option.success?.(result) |
|||
option.complete?.(result) |
|||
return |
|||
} |
|||
|
|||
|
|||
Global.mReceiver = new CustomBroadcastReceiver(wifiManager) |
|||
|
|||
let filter = new IntentFilter() |
|||
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) |
|||
// @ts-ignore |
|||
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION) |
|||
// @ts-ignore |
|||
filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); |
|||
|
|||
UTSAndroid.getUniActivity()!.registerReceiver(Global.mReceiver, filter) |
|||
|
|||
/** |
|||
* activity 被销毁时,取消注册 |
|||
*/ |
|||
UTSAndroid.onAppActivityDestroy(function () { |
|||
|
|||
if (Global.mReceiver != null) { |
|||
UTSAndroid.getUniActivity()!.unregisterReceiver(Global.mReceiver) |
|||
Global.mReceiver = null |
|||
|
|||
Global.scanList = [] |
|||
Global.onGetWifiListCallback = null |
|||
Global.onWifiConnectCallbackList = [] |
|||
Global.onWifiConnectWithPartialInfoCallbackList = [] |
|||
} |
|||
|
|||
}); |
|||
startWifiScaning = true |
|||
// 开始扫描 |
|||
wifiManager.startScan() |
|||
|
|||
result.errCode = 0 |
|||
result.errMsg = "startWifi:ok" |
|||
|
|||
option.success?.(result) |
|||
option.complete?.(result) |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 获取wifi列表 |
|||
*/ |
|||
@Suppress("DEPRECATION") |
|||
export function getWifiList(option : WifiOption) { |
|||
|
|||
var result : UniWifiResult = { |
|||
errCode: 12000, |
|||
errMsg: "getWifiList:fail:not invoke startWifi", |
|||
errSubject: "uni-getWifiList" |
|||
} |
|||
|
|||
if (Global.mReceiver == null) { |
|||
// 还没调用startWifi 提示报错 |
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
|
|||
return |
|||
} |
|||
|
|||
let wifiManager : WifiManager = |
|||
UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager |
|||
|
|||
|
|||
|
|||
Global.supendGetWifiSuccess = option.success |
|||
Global.supendGetWifiComplete = option.complete |
|||
|
|||
wifiManager.startScan() |
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
/** |
|||
* wifi 链接成功的回调注册 |
|||
*/ |
|||
export function onWifiConnected(callback : UTSCallback) { |
|||
Global.onWifiConnectCallbackList.push(callback) |
|||
} |
|||
|
|||
|
|||
export function onWifiConnectedWithPartialInfo(callback : UTSCallback) { |
|||
Global.onWifiConnectWithPartialInfoCallbackList.push(callback) |
|||
} |
|||
|
|||
|
|||
/** |
|||
* wifi 链接成功的回调取消注册 |
|||
*/ |
|||
export function offWifiConnected(callback? : UTSCallback) { |
|||
|
|||
if(callback == null){ |
|||
Global.onWifiConnectCallbackList = [] |
|||
return |
|||
} |
|||
|
|||
let callbackIndex = Global.onWifiConnectCallbackList.indexOf(callback) |
|||
if (callbackIndex >= 0) { |
|||
Global.onWifiConnectCallbackList.splice(callbackIndex, 1); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 不具备详细信息的wifi 反注册 |
|||
*/ |
|||
export function offWifiConnectedWithPartialInfo(callback? : UTSCallback) { |
|||
|
|||
if(callback == null){ |
|||
Global.onWifiConnectWithPartialInfoCallbackList = [] |
|||
return |
|||
} |
|||
|
|||
let callbackIndex = Global.onWifiConnectWithPartialInfoCallbackList.indexOf(callback) |
|||
if (callbackIndex >= 0) { |
|||
Global.onWifiConnectWithPartialInfoCallbackList.splice(callbackIndex, 1); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 注册Wifi列表的监听事件 |
|||
*/ |
|||
export function onGetWifiList(callback : UTSCallback) { |
|||
Global.onGetWifiListCallback = callback |
|||
} |
|||
|
|||
/** |
|||
* 取消注册Wifi列表的监听事件 |
|||
*/ |
|||
export function offGetWifiList(callback? : UTSCallback) { |
|||
Global.onGetWifiListCallback = null |
|||
Global.supendGetWifiComplete = null |
|||
Global.supendGetWifiSuccess = null |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 真正执行wifi链接逻辑 |
|||
*/ |
|||
function realWifiConnect(option : WifiConnectOption,result : UniWifiResult){ |
|||
|
|||
if (Global.mReceiver == null || Global.scanList.length < 1) { |
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
|
|||
return |
|||
} |
|||
|
|||
// 执行后续的逻辑 |
|||
let scanWifiInfo : AndroidUniWifiInfo | null = null |
|||
for (let scanResult in Global.scanList) { |
|||
if (scanResult.SSID.equals(option.SSID)) { |
|||
scanWifiInfo = scanResult |
|||
} |
|||
} |
|||
|
|||
if (scanWifiInfo == null) { |
|||
// 不在扫描列表中返回错误 |
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
return |
|||
} |
|||
|
|||
let wifiConfigration = wrapWifiConfiguration(scanWifiInfo.SSID, option.password, scanWifiInfo.securityType); |
|||
wifiConfigration.BSSID = scanWifiInfo.BSSID |
|||
let wifiManager : WifiManager = |
|||
UTSAndroid.getAppContext()!.getSystemService(Context.WIFI_SERVICE) as WifiManager |
|||
|
|||
// 如果已经存在了指定wifi 配置,移除之 |
|||
let targetExistConfig : WifiConfiguration | null = null |
|||
let existingConfigs = wifiManager.getConfiguredNetworks(); |
|||
for (let existingConfig in existingConfigs) { |
|||
if (existingConfig.SSID.equals("\"" + option.SSID + "\"")) { |
|||
targetExistConfig = existingConfig |
|||
} |
|||
} |
|||
// 如果wifi已经保存了当前ssid的配置,可能是别的应用添加的。android系统要求,需要删除掉重新添加 |
|||
if (targetExistConfig != null) { |
|||
let removeRet = wifiManager.removeNetwork(targetExistConfig.networkId); |
|||
|
|||
if (!removeRet) { |
|||
|
|||
// add since 2023-03-28,如果当前系统大于等于android10, 则明确当前系统不支持 |
|||
if(Build.VERSION.SDK_INT > 28){ |
|||
// 系统大于android 9 |
|||
result.errCode = 12001 |
|||
result.errMsg = "connectWifi:system not support" |
|||
}else{ |
|||
// 移除之前的配置失败了,返回错误,需要用户手动取消保存一下 |
|||
result.errCode = 12013 |
|||
result.errMsg = "connectWifi:wifi config may be expired" |
|||
} |
|||
|
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
|
|||
return |
|||
} |
|||
|
|||
} |
|||
|
|||
let currentConnect = wifiManager.getConnectionInfo() |
|||
if (currentConnect.networkId >= 0) { |
|||
wifiManager.disableNetwork(currentConnect.networkId) |
|||
} else { |
|||
wifiManager.removeNetwork(currentConnect.networkId) |
|||
} |
|||
wifiManager.disconnect() |
|||
|
|||
let connected = false; |
|||
try { |
|||
|
|||
let netID = wifiManager.addNetwork(wifiConfigration); |
|||
// 如果-1 说明没添加上,报错即可 |
|||
if (netID < 0) { |
|||
result.errCode = 12002 |
|||
result.errMsg = "connectWifi:password error Wi-Fi" |
|||
|
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
|
|||
return |
|||
} |
|||
|
|||
|
|||
let enabled = wifiManager.enableNetwork(netID, true); |
|||
if (!enabled) { |
|||
|
|||
result.errCode = 12007 |
|||
result.errMsg = "connectWifi:user denied" |
|||
|
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
|
|||
return |
|||
} |
|||
connected = wifiManager.reconnect(); |
|||
|
|||
} catch (e) { |
|||
connected = false; |
|||
console.log(e); |
|||
} |
|||
|
|||
if (!connected) { |
|||
// 出错了,返回错误 |
|||
// 兜底的报错 |
|||
result.errCode = 12010 |
|||
result.errMsg = "connectWifi:fail:unknown error" |
|||
|
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
return |
|||
} |
|||
|
|||
wifiManager.saveConfiguration() |
|||
//scanWifiInfo 根据 partialInfo 填充给返回字段 |
|||
if (option.partialInfo != null && option.partialInfo == true) { |
|||
let wifiPartialInfo : UniWifiInfo = { |
|||
SSID: scanWifiInfo.SSID |
|||
} |
|||
result.wifi = wifiPartialInfo |
|||
} else { |
|||
result.wifi = wrapUniWifiInfoFromAndroid(scanWifiInfo) |
|||
} |
|||
|
|||
// result.wifi = scanWifiInfo.toUTSJSON(option.partialInfo) |
|||
result.errCode = 0 |
|||
result.errMsg = "connectWifi:ok" |
|||
|
|||
option.success?.(result) |
|||
option.complete?.(result) |
|||
} |
|||
|
|||
/** |
|||
* 链接指定wifi |
|||
*/ |
|||
@Suppress("UNUSED_PARAMETER", "DEPRECATION") |
|||
export function connectWifi(option : WifiConnectOption) { |
|||
|
|||
|
|||
var result : UniWifiResult = { |
|||
errCode: 12000, |
|||
errMsg: "connectWifi:fail:not invoke startWifi", |
|||
errSubject: "uni-connectWifi", |
|||
} |
|||
|
|||
if (option.maunal == true) { |
|||
// 指定了手动模式 |
|||
let manunalIntent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS); |
|||
UTSAndroid.getUniActivity()!.startActivity(manunalIntent); |
|||
|
|||
result.errCode = 0 |
|||
result.errMsg = "connectWifi:ok" |
|||
|
|||
option.success?.(result) |
|||
option.complete?.(result) |
|||
return |
|||
} |
|||
|
|||
|
|||
|
|||
// add since 2022-03-28 ,增加逻辑,如果正在扫描中,则可以等待5s |
|||
if(startWifiScaning){ |
|||
let taskCount = 0 |
|||
let taskId:number = 0 |
|||
taskId = setInterval(function(){ |
|||
|
|||
taskCount += 1; |
|||
if(taskCount >= 5 || startWifiScaning == false){ |
|||
// 超过10s了。或者扫描过程结束了 |
|||
clearInterval(taskId) |
|||
realWifiConnect(option,result) |
|||
} |
|||
},2000) |
|||
|
|||
UTSAndroid.onAppActivityDestroy(function () { |
|||
clearInterval(taskId) |
|||
}); |
|||
}else{ |
|||
realWifiConnect(option,result) |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
/** |
|||
* 关闭wifi |
|||
*/ |
|||
export function stopWifi(option : WifiOption) { |
|||
// 需要先开启wifi,才能使用后续的功能 |
|||
if (Global.mReceiver == null) { |
|||
var result : UniWifiResult = { |
|||
errCode: 12000, |
|||
errSubject: "uni-stopWifi", |
|||
errMsg: "stopWifi:not init" |
|||
} |
|||
option.fail?.(result) |
|||
option.complete?.(result) |
|||
|
|||
return |
|||
} |
|||
try { |
|||
UTSAndroid.getUniActivity()!.unregisterReceiver(Global.mReceiver) |
|||
} catch (e) { |
|||
// 多次调用 |
|||
//TODO handle the exception |
|||
} |
|||
|
|||
Global.onGetWifiListCallback = null |
|||
Global.onWifiConnectWithPartialInfoCallbackList = [] |
|||
Global.onWifiConnectCallbackList = [] |
|||
Global.mReceiver = null |
|||
|
|||
let result : UniWifiResult = { |
|||
errCode: 0, |
|||
errSubject: "uni-stopWifi", |
|||
errMsg: "stopWifi:ok" |
|||
} |
|||
option.success?.(result) |
|||
option.complete?.(result) |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 获取当前连接中的wifi信息 |
|||
*/ |
|||
@Suppress("DEPRECATION") |
|||
export function getConnectedWifi(option : GetConnectedWifiOptions) { |
|||
|
|||
let wifiInfo : UniWifiInfo = { |
|||
SSID: "" |
|||
} |
|||
|
|||
var res : UniWifiResult = { |
|||
errCode: 12000, |
|||
errMsg: "getConnectedWifi:fail:not invoke startWifi", |
|||
errSubject: "uni-getConnectedWifi", |
|||
} |
|||
|
|||
if (Global.mReceiver == null) { |
|||
// 还没调用startWifi 提示报错 |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
|
|||
return |
|||
} |
|||
|
|||
// 需要先校验权限,没有位置权限无法获取wifi |
|||
if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { |
|||
// 尚不具备权限,返回错误 |
|||
res.errCode = 12001 |
|||
res.errMsg = "getConnectedWifi:permission loss" |
|||
|
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
return; |
|||
} |
|||
|
|||
const context = UTSAndroid.getAppContext(); |
|||
if (context != null) { |
|||
const wm = context.getSystemService( |
|||
Context.WIFI_SERVICE |
|||
) as WifiManager; |
|||
// 测试android 12上可以使用 |
|||
//@ts-ignore |
|||
const winfo = wm.getConnectionInfo(); |
|||
|
|||
wifiInfo = wrapUniWifiInfoFromConnectInfo(winfo); |
|||
// 判断一下是否wifi 关闭了 |
|||
if (option.partialInfo != null && option.partialInfo == true) { |
|||
let ret : UniWifiInfo = { |
|||
SSID: wifiInfo.SSID |
|||
} |
|||
res.wifi = ret; |
|||
} else { |
|||
if (wifiInfo.BSSID == null || zeroCountNum(wifiInfo.BSSID) > 3) { |
|||
res.errCode = 12005 |
|||
res.errMsg = "getConnectedWifi:fail:wifi is disable" |
|||
|
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
return |
|||
} |
|||
res.wifi = wifiInfo; |
|||
} |
|||
|
|||
res.errCode = 0 |
|||
res.errMsg = "getConnectedWifi:ok" |
|||
|
|||
option.success?.(res) |
|||
option.complete?.(res) |
|||
return |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>NSLocationWhenInUseUsageDescription</key> |
|||
<string>使用期间获取位置权限</string> |
|||
</dict> |
|||
</plist> |
|||
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|||
<plist version="1.0"> |
|||
<dict> |
|||
<key>com.apple.developer.networking.wifi-info</key> |
|||
<true/> |
|||
</dict> |
|||
</plist> |
|||
@ -0,0 +1,8 @@ |
|||
{ |
|||
"frameworks": [ |
|||
"CoreLocation", |
|||
"SystemConfiguration" |
|||
], |
|||
"validArchitectures": [ |
|||
"arm64", "armv7" ],"deploymentTarget": "9" |
|||
} |
|||
@ -0,0 +1,301 @@ |
|||
import { CLLocationManager, CLAuthorizationStatus, CLLocationManagerDelegate } from 'CoreLocation' |
|||
import { CaptiveNetwork, kCNNetworkInfoKeySSID, kCNNetworkInfoKeyBSSID } from 'SystemConfiguration.CaptiveNetwork'; |
|||
import { NSArray, NSDictionary } from 'Foundation'; |
|||
import { CFString } from 'CoreFoundation'; |
|||
import { UIDevice } from 'UIKit'; |
|||
import { WifiOption, WifiConnectOption, GetConnectedWifiOptions, UniWifiInfo, UniWifiResult, UniWifiCallback, StartWifi, StopWifi, GetWifiList, OnGetWifiList, OffGetWifiList, GetConnectedWifi, ConnectWifi, OnWifiConnected, OnWifiConnectedWithPartialInfo, OffWifiConnected, OnOffWifiConnectedWithPartialInfo, SetWifiList } from "../interface.uts" |
|||
|
|||
/* |
|||
* 系统定位权限获取类 |
|||
*/ |
|||
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, @argumentLabel("didChangeAuthorization") 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) |
|||
}) |
|||
} |
|||
} |
|||
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: UniWifiInfo = { |
|||
BSSID: "", |
|||
SSID: "", |
|||
secure: false, |
|||
signalStrength: 0, |
|||
frequency: 0 |
|||
} |
|||
|
|||
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.secure = false |
|||
wifiInfo.signalStrength = 0 |
|||
wifiInfo.frequency = 0 |
|||
break; |
|||
} |
|||
} |
|||
index++ |
|||
} |
|||
|
|||
if (wifiInfo.BSSID!.length > 0 && wifiInfo.SSID.length > 0) { |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-getConnectedWifi", |
|||
errCode: 0, |
|||
errMsg: "getConnectedWifi:ok", |
|||
wifi: wifiInfo, |
|||
} |
|||
option.success?.(res) |
|||
option.complete?.(res) |
|||
}else { |
|||
const res: UniWifiResult = { |
|||
errSubject: "uni-getConnectedWifi", |
|||
errCode: 12010, |
|||
errMsg: "getConnectedWifi:system internal error", |
|||
wifi: null |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
}else { |
|||
const res: UniWifiResult = { |
|||
errSubject: "uni-getConnectedWifi", |
|||
errCode: 12010, |
|||
errMsg: "getConnectedWifi:system internal error", |
|||
wifi: null |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
/* |
|||
* 保存全局数据信息 |
|||
*/ |
|||
class UniWiFiModuleGloabInfo { |
|||
static alreadyStartWifi: boolean = false |
|||
} |
|||
|
|||
/* =================================== 对外暴露的接口 ==============================================*/ |
|||
|
|||
|
|||
|
|||
/* |
|||
* 初始化wifi模块 |
|||
*/ |
|||
export const startWifi: StartWifi = function (option: WifiOption) { |
|||
UniWiFiModuleGloabInfo.alreadyStartWifi = true |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-startWifi", |
|||
errCode: 0, |
|||
errMsg: "startWifi:ok", |
|||
wifi: null |
|||
} |
|||
option.success?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
|
|||
/* |
|||
* 停止wifi模块 |
|||
*/ |
|||
export const stopWifi: StopWifi = function (option: WifiOption) { |
|||
UniWiFiModuleGloabInfo.alreadyStartWifi = false |
|||
LocationPromiseService.promiseCompletionHandler = [] |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-stopWifi", |
|||
errCode: 0, |
|||
errMsg: "stopWifi:ok", |
|||
wifi: null |
|||
} |
|||
option.success?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
|
|||
/* |
|||
* 获取wifi列表, 在调用之前需要引导用户跳转到系统设置-WIFI设置页面,系统搜索周边wifi后app才能接收到回调 |
|||
*/ |
|||
export const getWifiList: GetWifiList = function (option: WifiOption) { |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-getWifiList", |
|||
errCode: 12001, |
|||
errMsg: "getWifiList:system not support", |
|||
wifi: null |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
|
|||
/* 获取wifi列表的回调 |
|||
* note: 请在getWifiList方法的回调里调用该方法 |
|||
*/ |
|||
export const onGetWifiList: OnGetWifiList = function (callback: UniWifiCallback) { |
|||
|
|||
} |
|||
|
|||
/* |
|||
* 注销获取wifi列表的回调 |
|||
*/ |
|||
export const offGetWifiList: OffGetWifiList = function (callback: UniWifiCallback) { |
|||
|
|||
} |
|||
|
|||
|
|||
/* |
|||
* 获取当前连接的wifi信息 |
|||
*/ |
|||
export const getConnectedWifi: GetConnectedWifi = function (option: GetConnectedWifiOptions) { |
|||
if (UniWiFiModuleGloabInfo.alreadyStartWifi == false) { |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-getConnectedWifi", |
|||
errCode: 12000, |
|||
errMsg: "getConnectedWifi:not init", |
|||
wifi: null |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} else{ |
|||
if (UIDevice.current.systemVersion >= "13.0") { |
|||
requestLocationPromise((success) => { |
|||
if (success == true) { |
|||
fetchConnectedWifiWithLocationPromise(option) |
|||
}else { |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-getConnectedWifi", |
|||
errCode: 12007, |
|||
errMsg: "getConnectedWifi:user denied", |
|||
wifi: null |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
}) |
|||
} else{ |
|||
fetchConnectedWifiWithLocationPromise(option) |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* |
|||
* 连接wifi |
|||
*/ |
|||
export const connectWifi: ConnectWifi = function (option: WifiConnectOption) { |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-connectWifi", |
|||
errCode: 12001, |
|||
errMsg: "connectWifi:system not support", |
|||
wifi: null |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
|
|||
|
|||
/* |
|||
* 连上wifi事件的监听函数 |
|||
*/ |
|||
export const onWifiConnected: OnWifiConnected = function (callback: UniWifiCallback) { |
|||
|
|||
} |
|||
|
|||
/* |
|||
* 连上wifi事件的监听函数, wifiInfo仅包含ssid |
|||
*/ |
|||
export const onWifiConnectedWithPartialInfo: OnWifiConnectedWithPartialInfo = function (callback: UniWifiCallback) { |
|||
|
|||
} |
|||
|
|||
/* |
|||
* 移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。 |
|||
*/ |
|||
export const offWifiConnected: OffWifiConnected = function (callback: UniWifiCallback | null) { |
|||
|
|||
} |
|||
|
|||
/* |
|||
* 移除连接上wifi的事件的监听函数,不传此参数则移除所有监听函数。 |
|||
*/ |
|||
export const onOffWifiConnectedWithPartialInfo: OnOffWifiConnectedWithPartialInfo = function (callback: UniWifiCallback | null) { |
|||
|
|||
} |
|||
|
|||
/* |
|||
* 设置 wifiList 中 AP 的相关信息。在 onGetWifiList 回调后调用,iOS特有接口。 |
|||
*/ |
|||
export const setWifiList: SetWifiList = function (option: WifiOption) { |
|||
let res: UniWifiResult = { |
|||
errSubject: "uni-setWifiList", |
|||
errCode: 12001, |
|||
errMsg: "setWifiList:system not support", |
|||
wifi: null |
|||
} |
|||
option.fail?.(res) |
|||
option.complete?.(res) |
|||
} |
|||
@ -0,0 +1,125 @@ |
|||
/** |
|||
* Wifi 函数通用入参封装 |
|||
*/ |
|||
export type WifiOption = { |
|||
success?: (res: UniWifiResult) => void; |
|||
fail?: (res: UniWifiResult) => void; |
|||
complete?: (res: UniWifiResult) => void; |
|||
}; |
|||
|
|||
/** |
|||
* Wifi 链接参数封装 |
|||
*/ |
|||
export type WifiConnectOption = { |
|||
SSID?: string; |
|||
BSSID?: string; |
|||
password?: string; |
|||
maunal?: boolean; |
|||
partialInfo?: boolean; //ios不生效 |
|||
success?: (res: UniWifiResult) => void; |
|||
fail?: (res: UniWifiResult) => void; |
|||
complete?: (res: UniWifiResult) => void; |
|||
} |
|||
|
|||
/** |
|||
* 获取当前链接的wifi信息 |
|||
*/ |
|||
export type GetConnectedWifiOptions = { |
|||
partialInfo?: boolean |
|||
success?: (res: UniWifiResult) => void |
|||
fail?: (res: UniWifiResult) => void |
|||
complete?: (res: UniWifiResult) => void |
|||
} |
|||
|
|||
/* |
|||
* 对外暴露的wifi信息 |
|||
*/ |
|||
export type UniWifiInfo = { |
|||
SSID: string; |
|||
BSSID?: string; |
|||
secure?: boolean; |
|||
signalStrength?: number; |
|||
frequency?: number; |
|||
} |
|||
|
|||
|
|||
export type UniWifiResult = { |
|||
errCode : number, |
|||
errSubject : string, |
|||
errMsg : string, |
|||
wifi: UniWifiInfo | null |
|||
} |
|||
|
|||
export type UniWifiCallback = () => void |
|||
|
|||
|
|||
export type StartWifi = (option: WifiOption) => void |
|||
|
|||
export type StopWifi = (option: WifiOption) => void |
|||
|
|||
export type GetWifiList = (option: WifiOption) => void |
|||
|
|||
export type OnGetWifiList = (callback: UniWifiCallback) => void |
|||
|
|||
export type OffGetWifiList = (callback: UniWifiCallback) => void |
|||
|
|||
export type GetConnectedWifi = (option: GetConnectedWifiOptions) => void |
|||
|
|||
export type ConnectWifi = (option: WifiConnectOption) => void |
|||
|
|||
export type OnWifiConnected = (callback: UniWifiCallback) => void |
|||
|
|||
export type OnWifiConnectedWithPartialInfo = (callback: UniWifiCallback) => void |
|||
|
|||
export type OffWifiConnected = (callback: UniWifiCallback | null) => void |
|||
|
|||
export type OnOffWifiConnectedWithPartialInfo = (callback: UniWifiCallback | null) => void |
|||
|
|||
export type SetWifiList = (option: WifiOption) => void |
|||
|
|||
interface Uni { |
|||
startWifi : StartWifi, |
|||
stopWifi : StopWifi, |
|||
/** |
|||
* @autotest { |
|||
generated: false, |
|||
pollution: false, |
|||
cases:[ |
|||
{ |
|||
before: 'startWifi', |
|||
after: 'stopWifi', |
|||
input: [{ |
|||
maunal:false, |
|||
SSID:"Xiaomi_20D0", |
|||
password:"streamApp!2016", |
|||
}], |
|||
output:{ |
|||
callbackType: 'success', |
|||
value: { errCode: 12013 ,errMsg: "connectWifi:wifi config may be expired",errSubject: "uni-connectWifi"} |
|||
} |
|||
} |
|||
] |
|||
} |
|||
*/ |
|||
connectWifi: ConnectWifi, |
|||
/** |
|||
* @autotest { |
|||
generated: false, |
|||
cases:[ |
|||
{ |
|||
before: 'startWifi', |
|||
after: 'stopWifi' |
|||
} |
|||
] |
|||
} |
|||
*/ |
|||
getWifiList : GetWifiList, |
|||
onGetWifiList : OnGetWifiList, |
|||
offGetWifiList : OffGetWifiList, |
|||
getConnectedWifi : GetConnectedWifi, |
|||
onWifiConnected : OnWifiConnected, |
|||
onWifiConnectedWithPartialInfo : OnWifiConnectedWithPartialInfo, |
|||
offWifiConnected : OffWifiConnected, |
|||
onOffWifiConnectedWithPartialInfo : OnOffWifiConnectedWithPartialInfo, |
|||
setWifiList : SetWifiList, |
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
function startWifi() { |
|||
return new Promise((resolve, reject) => { |
|||
uni.startWifi({ |
|||
success: () => { |
|||
console.log('startWifi success'); |
|||
resolve() |
|||
}, |
|||
fail: () => { |
|||
console.log('startWifi fail'); |
|||
reject() |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
function stopWifi() { |
|||
return new Promise((resolve, reject) => { |
|||
uni.stopWifi({ |
|||
success: () => { |
|||
console.log('stopWifi success'); |
|||
resolve() |
|||
}, |
|||
fail: () => { |
|||
console.log('stopWifi success'); |
|||
fail() |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
|
|||
|
|||
module.exports = { |
|||
startWifi, |
|||
stopWifi |
|||
} |
|||