RN:權限檢查

用到的三方庫:react-native-permissions

import { Platform } from 'react-native'
import { check, checkMultiple, PERMISSIONS, request, requestMultiple, RESULTS } from 'react-native-permissions'

/**
 *  單個權限檢查
 * @param {object} permission
 * {
    ios: PERMISSIONS.IOS.LOCATION_WHEN_IN_USE,
    android: {
      type: PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
      title: '請求獲取模糊的定位權限',
      message: '僅用於模糊標識'
    }
  }
 * @returns RESULTS
 */
export const checkPermission = async permission => {
  const platform = Platform.select(permission)

  if (Platform.OS === 'android') {
    const result = await check(platform.type)
    if (result === RESULTS.DENIED) {
      return await request(platform.type, {
        title: platform.title,
        message: platform.message,
        buttonPositive: '好的',
        buttonNegative: '拒絕'
      })
    }
    return result
  } else {
    if (!platform) return RESULTS.GRANTED
    const result = await check(platform)
    if (result === RESULTS.DENIED) {
      return await request(platform)
    }
    return result
  }
}

/**
 *  同時檢查多個權限
 * @param {*} permissions
 * {
    ios: [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE, PERMISSIONS.IOS.CAMERA],
    android: {
      types: [PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION, PERMISSIONS.ANDROID.CAMERA],
      title: 'xxxx',
      message: 'xxxxxxxxx'
      }
    }
 */
export const checkMultiplePermissions = async permissions => {
  const platform = Platform.select(permissions)
  if (Platform.OS === 'android') {
    const permissionTypes = platform.types
    const result = await checkMultiple(permissionTypes)
    const deniedTypes = []
    for (const pt of permissionTypes) {
      if (result[pt] === RESULTS.DENIED) {
        deniedTypes.push(pt)
      }
    }
    if (!deniedTypes.length) return result

    return {
      ...result,
      ...(await requestMultiple(deniedTypes, {
        title: platform.title,
        message: platform.message,
        buttonPositive: '好的',
        buttonNegative: '拒絕'
      }))
    }
  } else {
    const result = await checkMultiple(platform)
    const deniedTypes = []
    for (const pt of platform) {
      if (result[pt] === RESULTS.DENIED) {
        deniedTypes.push(pt)
      }
    }
    if (!deniedTypes.length) return result
    return {
      ...result,
      ...(await requestMultiple(deniedTypes))
    }
  }
}

/**
 * 檢查是否有使用用戶定位的權限
 * @returns RESULTS
 */
export const checkLocationPermission = async () =>
  checkPermission({
    ios: PERMISSIONS.IOS.LOCATION_WHEN_IN_USE,
    android: {
      type: PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
      title: '請求獲取模糊的定位權限',
      message: '僅用於模糊標識'
    }
  })

/**
 * 檢查是否有讀取相冊的權限
 * @returns RESULTS
 */
export const checkReadFromLibraryPermission = async title => {
  const type =
    Platform.Version >= 33 ? PERMISSIONS.ANDROID.READ_MEDIA_IMAGES : PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE
  return checkPermission({
    ios: PERMISSIONS.IOS.PHOTO_LIBRARY,
    android: { type, title: title || '更換頭像/意見反饋等, 需要相冊權限' }
  })
}

/**
 * 檢查是否有寫入相冊的權限
 * @returns RESULTS
 */
export const checkWriteToLibraryPermission = async title =>
  await checkMultiplePermissions({
    ios: [PERMISSIONS.IOS.PHOTO_LIBRARY],
    android: {
      types: [PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE],
      title: title || '下載推廣資源, 需要相冊的寫入權限'
    }
  })

/**
 * 檢查是否有使用相機權限
 * @returns RESULTS
 */
export const checkCameraPermission = async title =>
  checkMultiplePermissions({
    ios: [PERMISSIONS.IOS.CAMERA],
    android: {
      types: [PERMISSIONS.ANDROID.CAMERA, PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE],
      title: title || '更換頭像/意見反饋等, 需要相機權限'
    }
  })
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章