導語:在 APP 的日常開發過程中,權限檢測與授權是不可避免的一項重要的功能,下面就簡單介紹一下如何檢測和授權的方法。
目錄
- 原理
- 方法
- 實戰
原理
此授權方法主要是依託於 HTML5 產業聯盟的HTML5+規範實現的。
HTML5 產業聯盟官網
獲取當前操作系統名稱
可以使用uni.getSystemInfoSync方法;
調用方法檢測權限
安卓可以使用plus.android.requestPermissions方法來檢測權限。
此方法接受三個參數:
- permissions:權限 ID;
- res:成功返回的數據;
- err: 失敗返回的數據;
ios 需要每個權限都調用不同的類型才可實現授權。
可以使用plus.ios.importClass來導入相應的權限名稱,通過plus.ios.deleteObject來刪除權限;
比如相機權限需要導入AVCaptureDevice類,然後調用authorizationStatusForMediaType('vide')方法來檢測,如果值是3就是授權開啓。
方法
操作系統名稱
const os = uni.getSystemInfoSync().osName;
console.log(os); // android 或 ios
安卓權限檢測
安卓常用權限
const androidPermissions = {
camera: "android.permission.CAMERA", // 攝像頭權限
location: "android.permission.ACCESS_FINE_LOCATION", // 位置權限
calendar: {
read: "android.permission.READ_CALENDAR", // // 日曆讀取權限
write: "android.permission.WRITE_CALENDAR", // // 日曆寫入權限
},
storage: {
read: "android.permission.READ_EXTERNAL_STORAGE", // 存儲讀取權限
write: "android.permission.WRITE_EXTERNAL_STORAGE", // 存儲寫入權限
},
record: "android.permission.RECORD_AUDIO", // 麥克風權限
contact: {
read: "android.permission.READ_CONTACTS", // 聯繫人讀取權限
write: "android.permission.WRITE_CONTACTS", // 聯繫人寫入權限
},
sms: {
read: "android.permission.READ_SMS", // 短信讀取權限
send: "android.permission.SEND_SMS", //短信發送權限
receive: "android.permission.RECEIVE_SMS", // 短信接收權限
},
state: "android.permission.READ_PHONE_STATE", // 手機識別碼權限
phone: "android.permission.CALL_PHONE", // 撥打電話權限
log: "android.permission.READ_CALL_LOG", // 通話記錄權限
};
獲取權限列表
function getPermissionList(permissionID) {
const id = androidPermissions[permissionID];
const list = [];
if (typeof id == "string") {
list[0] = id;
} else {
for (let key in id) {
list.push(id[key]);
}
}
return list;
}
安卓檢測方法
function androidPermissionCheck(permissionID) {
return new Promise((resolve, reject) => {
if (plus) {
let ids = getPermissionList(permissionID);
plus.android.requestPermissions(
ids,
function (result) {
let res = 0;
for (let i = 0; i < result.granted.length; i++) {
let permission = result.granted[i];
console.log("已獲取的權限:", permission);
res = 1;
}
for (let i = 0; i < result.deniedPresent.length; i++) {
let permission = result.deniedPresent[i];
console.log("本次已拒絕的權限:", permission);
res = 0;
}
for (let i = 0; i < result.deniedAlways.length; i++) {
let permission = result.deniedAlways[i];
console.log("永久拒絕的權限:", permission);
res = -1;
}
resolve({
code: 1,
data: res,
});
},
(error) => {
reject({
code: 2,
data: `code:${error.code},msg:${error.message}!`,
});
}
);
}
});
}
ios 權限檢測
ios 權限方法
function iosPermissionCheck(permissionID) {
return new Promise((resolve, reject) => {
let res = iosPermissions[permissionID]();
resolve({
code: 1,
data: res,
});
});
}
ios 權限列表
// ios權限列表
const iosPermissions = {
camera: iosCamera, // 攝像頭
location: iosLocation, // 位置
calendar: iosCalendar, // 日曆
storage: iosAlbum, // 相冊
record: iosRecord, // 麥克風
contact: iosContact, // 通訊錄
memo: iosMemo, // 備忘錄
push: iosPush, // 推送
};
ios 權限實現
- 攝像頭權限
function iosCamera() {
if (plus) {
let result = 0,
avCaptureDevice = plus.ios.importClass("AVCaptureDevice"),
authStatus = avCaptureDevice.authorizationStatusForMediaType("vide");
if (authStatus === 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(avCaptureDevice);
return result;
} else {
return null;
}
}
- 位置權限
function iosLocation() {
if (plus) {
let result = 0,
cLLocationManager = plus.ios.importClass("CLLocationManager"),
authStatus = cLLocationManager.authorizationStatus(),
enable = cLLocationManager.locationServicesEnabled();
if (enable && authStatus != 2) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(cLLocationManager);
return result;
} else {
return null;
}
}
- 日曆權限
function iosCalendar() {
if (plus) {
let result = 0,
eKEventStore = plus.ios.importClass("EKEventStore"),
authStatus = eKEventStore.authorizationStatusForEntityType(0);
if (authStatus === 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(eKEventStore);
return result;
} else {
return null;
}
}
- 相冊權限
function iosAlbum() {
if (plus) {
let result = 0,
photoLibrary = plus.ios.importClass("PhotoLibrary"),
authStatus = photoLibrary.authorizationStatus();
if (authStatus === 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(photoLibrary);
return result;
} else {
return null;
}
}
- 麥克風權限
function iosRecord() {
if (plus) {
let result = 0,
aVAudioSession = plus.ios.importClass("AVAudioSession"),
aVAudio = aVAudioSession.sharedInstance(),
authStatus = aVAudio.recordPermission();
if ([1684369017, 1970168948].includes(authStatus)) {
result = 0;
} else {
result = 1;
}
plus.ios.deleteObject(aVAudioSession);
return result;
} else {
return null;
}
}
- 通訊錄權限
function iosContact() {
if (plus) {
let result = 0,
contactStore = plus.ios.importClass("CNContactStore"),
authStatus = contactStore.authorizationStatusForEntityType(0);
if (authStatus === 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(contactStore);
return result;
} else {
return null;
}
}
- 備忘錄權限
function iosMemo() {
if (plus) {
let result = 0,
eKEventStore = plus.ios.importClass("EKEventStore"),
authStatus = eKEventStore.authorizationStatusForEntityType(1);
if (authStatus === 3) {
result = 1;
} else {
result = 0;
}
plus.ios.deleteObject(eKEventStore);
return result;
} else {
return null;
}
}
- 推送權限
function iosPush() {
if (plus) {
let result = 0,
application = plus.ios.importClass("UIApplication"),
app = application.sharedApplication(),
authStatus = 0;
if (app.currentUserNotificationSettings) {
let setting = app.currentUserNotificationSettings(),
authStatus = setting.plusGetAttribute("types");
if (authStatus === 0) {
result = 0;
} else {
result = 1;
}
} else {
authStatus = app.enabledRemoteNotificationTypes();
if (authStatus === 0) {
result = 0;
} else {
result = 1;
}
}
plus.ios.deleteObject(eKEventStore);
return result;
} else {
return null;
}
}
導出方法
const permissionCheck = {
android: androidPermissionCheck,
ios: iosPermissionCheck,
};
const permission = permissionCheck[os];
export default permission;
實戰
下面介紹一下使用的方法。
在需要的頁面,引入permission.js文件,然後調用方法進行檢測。
例如:檢測攝像頭權限的方法。
import permission from "./permission.js";
// 檢測攝像頭權限
async function checkCamera() {
try {
let checkResult = await permission("camera");
console.log("檢測信息:", checkResult);
if (checkResult.code == 1) {
let result = checkResult.data;
if (res == 1) {
console.log("授權成功!");
}
if (result == 0) {
console.log("授權已拒絕!");
}
if (result == -1) {
console.log("您已永久拒絕攝像機權限,請在應用設置中手動打開!");
}
}
} catch (err) {
console.log("授權失敗:", err);
}
}
下面是一些演示圖。
- 允許授權
- 拒絕授權
- 永久拒絕授權
最後
好了,以上就是 uniapp 項目 APP 端安卓 ios 權限檢測教程的主要內容,有不足之處,請多多指正。