uniapp項目APP端安卓ios權限檢測教程

導語:在 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);
  }
}

下面是一些演示圖。

  • 允許授權
    image

  • 拒絕授權
    image

  • 永久拒絕授權
    image

最後

好了,以上就是 uniapp 項目 APP 端安卓 ios 權限檢測教程的主要內容,有不足之處,請多多指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章